english

Příklad na sčítání

Následující příklad ukazuje možnost, jak může Karel sčítat celá oktalová čísla (čísla se základem 8, tedy \0..\07).

Čísla se zapisují pod sebe zarovnaná vpravo, ostaně jak je obvyklé. Jednotlivé řády čísel jsou tak pod sebou.
Číslice je reprezentovaná počtem značek umístěných na políčku města. Ve sčítancích je sice možné použít neoktalovou číslici 8 (umístit 8 značek), ale ve výsledku se rozloží do korektního oktalového zápisu (\010).

Značky mohou být umístěny libovolně po městě, nemusí začínat na horním řádku a cifry nejnižšího řádu nemusí být u pravé zdi.

Je možné umístit sčítance do VŠECH řádků města, přičemž pokud je sčítanec i na posledním řádku, slouží tento zároveň jako jakýsi "počáteční" výsledek, k němuž se přičítají sčítance z ostatních řádků.
Všechny sčítance jsou během sčítaní vymazány.

Předpoklady: město bez zdí, pouze se značkami.

Výsledek: součet na posledním řádku, vymazané sčítance.

Příklad: (všechny použíté číslice jsou oktalové)

 

VSTUP                       VÝSTUP
+-------------------+ +-------------------+
| | | |
| | | |
| 4 7 2 8 1 | | |
| 5 3 6 | | |
| 5 5 3 5 | | |
| 2 0 3 | | |
| | | |
| | | |
| | | |
| 2 0 | | 5 6 0 1 7 |
+-------------------+ +-------------------+

Pomocné funkce

Poznámka: ne všechny uvedené funkce jsou nezbytné pro sčítání, ponechal jsem je pro úplnost a pro ukázku příkladů nejen pro sčítání.

#------------------------------------------
# obecne funkce

# Karel se otoci proti smeru
CELEM VZAD
VLEVO VBOK
VLEVO VBOK
KONEC

# Karel se otoci smerem na jih
JIH
DOKUD NENI JIH
VLEVO VBOK
KONEC
KONEC

# Karel se otoci smerem na sever
SEVER
DOKUD NENI SEVER
VLEVO VBOK
KONEC
KONEC

# Karel se otoci smerem na vychod
VYCHOD
DOKUD NENI VYCHOD
VLEVO VBOK
KONEC
KONEC

# Karel se otoci smerem na zapad
ZAPAD
DOKUD NENI ZAPAD
VLEVO VBOK
KONEC
KONEC

# Karel dojde bezpecne ke zdi
KE ZDI
DOKUD NEBUDE ZED
KROK
KONEC
KONEC

# Karel dojde do leveho horniho rohu
LH ROH
ZAPAD
KE ZDI
SEVER
KE ZDI
VYCHOD
KONEC

# Karel dojde do praveho horniho rohu
PH ROH
VYCHOD
KE ZDI
SEVER
KE ZDI
ZAPAD
KONEC

# Karel dojde do leveho dolniho rohu
LD ROH
ZAPAD
KE ZDI
JIH
KE ZDI
VYCHOD
KONEC

# Karel dojde do praveho dolniho rohu
PD ROH
VYCHOD
KE ZDI
JIH
KE ZDI
ZAPAD
KONEC

# Karel vyprazdni policko, na kterem stoji, od znacek
VYPRAZDNI
DOKUD JE ZNACKA
ZVEDNI
KONEC
KONEC

# Karel vyprazdni radek nebo sloupec od soucasne pozice
# ke zdi. Funkce se vola rekurzivne kvuli tomu, aby se
# Karel dokazal vratit na puvodni misto. Pokud by se
# pouzila podminka DOKUD NEBUDE ZED, tak by se Karel
# nedokazal vratit.
# Takhle vyprazdni policko, pokud neni zed, udela krok
# a rekurzivne opet provede VYPRAZDNI KE ZDI. Potom zase
# udela krok, ovsem to je uz krok zpet, protoze po navratu
# z rekurze jde Karel opacnym smerem. Otoceni se zaruci v
# posledni urovni rekurze, kdy Karel stoji pred zdi.
VYPRAZDNI KE ZDI
VYPRAZDNI
KDYZ NEBUDE ZED
KROK
VYPRAZDNI KE ZDI
KROK
KONEC JINAK
CELEM VZAD
KONEC
KONEC

# Vyprazdni cely radek (nebo sloupec), zavola dvakrat
# VYPRAZDNI KE ZDI, po navratu z prvniho volani stoji
# Karel v opacnem smeru, nez byl na zacatku, takze
# druhe volani je mozne okamzite. Po jeho skonceni
# stoji Karel opet v uplne puvodnim smeru.
VYPRAZDNI RADEK
OPAKUJ 2 KRAT
VYPRAZDNI KE ZDI
KONEC
KONEC

Funkce pro sčítání

# funkce pro scitani cisel

# Karel pricte k aktualni cifre vysledku jednu znacku.
# Pokud by melo dojit k preteceni radu, tak vynuluje
# (vyprazdni) aktualni cifru vysledku a zvysi cifru
# vyssiho radu vysledku.
PRICTI JEDNU
KDYZ NENI 7
POLOZ
KONEC JINAK
VYPRAZDNI
PRETEC RAD
KONEC
KONEC

# Karel udela krok na cifru vyssiho radu a zvetsi ji o
# jednu znacku tim, ze zavola PRICTI JEDNU, cimz se zaruci
# pripadne preteceni i tohoto radu. Pak se vrati zpet na
# nizsi rad.
PRETEC RAD
ZAPAD
KROK
PRICTI JEDNU
VYCHOD
KROK
KONEC

# Karel pricte jednu znacku z cifry scitance k prislusne
# cifre vysledku.
# Volani je opet rekurzivni z toho duvodu, aby se Karel
# vratil na cifru scitance. Karek jde na jih, dokud
# nedojde ke zdi. Tam pricte jednu znacku k cifre vysledku
# otoci se na sever a vraci se v rekurzi zpet.
ZVETSI VYSLEDEK
JIH
KDYZ NEBUDE ZED
KROK
ZVETSI VYSLEDEK
KROK
KONEC JINAK
PRICTI JEDNU
SEVER
KONEC
KONEC

# Karel pricte celou cifru scitance k vysledku.
# Pricteni se provede prictenim vsech znacek. Po pricteni
# jedne znacky se ze scitance jedna znacka zvedne, cimz
# se sice postupne maze scitanec, ale zajisti se tim
# ukonceni pricitani cifry.
PRICTI CIFRU
DOKUD JE ZNACKA
ZVETSI VYSLEDEK
ZVEDNI
KONEC
KONEC

# Karel secte cifry stejneho radu vsech scitancu (cifry pod
# sebou) do vysledku.
# Volani se opet provadi rekurzivne, aby se Karel po secteni
# cifer vratil na puvodni misto (tj. na pozici v prvnim
# (hornim) scitanci).
# Jde se od zhora, Karel se otoci na jih, zjisti zda nestoji
# na vysledku (ten je v poslednim radku, tedy u zdi). Pokud
# nestoji u zdi, stoji na scitanci a pricte jeho cifru, udela
# krok na jih a vstoupi do rekurze. Jakmile je u zdi, stoji na
# vysledku, otoci se na sever a jde navratem z rekurze zpet na
# prvni scitanec.
SECTI CIFRY
JIH
KDYZ NEBUDE ZED
PRICTI CIFRU
JIH
KROK
SECTI CIFRY
KROK
KONEC JINAK
SEVER
KONEC
KONEC

# Karel secte cela cisla, tim ze secte jejich cifry.
# Nejdriv Karel secte cifry jednoho radu do vysledku,
# otoci se k vyssimu radu (zapad) a zjisti, zda uz neni
# na nejvyssim radu (u zdi). Pokud ne, tak postoupi na
# vyssi rad a zavola se rekurzivne k secteni vyssich
# radu.
# Po dojiti na nejvyssi rad se rekurze ukonci, na jejim
# konci je mozno Karla otocit a navratem v rekurzi ho
# dostat zpet na vychozi pozici.
# Nebo je mozno misto KDYZ NEBUDE ZED pouzit
# DOKUD NEBUDE ZED ; KROK ; SECTI CIFRY ; KONEC, cimz
# se nebude volat rekurzivne, a ztrati se moznost navratu.
SECTI CISLA
SECTI CIFRY
ZAPAD
KDYZ NEBUDE ZED
KROK
SECTI CISLA
KONEC JINAK
KONEC
KONEC

# Karel dojde do praveho horniho rohu mesta a odtud zacne
# hledat cifru nejnizsiho radu prvniho scitance.
SECTI
PH ROH
SECTI CISLA
KONEC

© 2024 any code
TOPlist