CSES - Sampo ja L-Järjestelmät

Sisällys:

Sampo-luntti

Sampo-tulkin nettiversio löytyy täältä: https://fergusq.gitlab.io/sampo20/

Ensimmäinen (pintatason) kompastuskivi Sampon kanssa on se, ettei se ole herkkä merkkikoolle. Sanat SANA, Sana, sana ja sAnA ovat siis Sampon näkökulmasta sama symboli.

Sampo on yleisesti pinokone. Tämä tarkoittaa, että komentojen parametrit ja paluuarvot kulkevat ohjelmalle yhteisen pinon kautta. (Kyseessä ei kuitenkaan ole sama pino kuin kutsupino). Se, mikä voitaisiin Python-maailmassa ilmaista:

# jollekin def välin_tulo(a, b): ...
print(välin_tulo(10, 20))

ilmaistaankin sampossa:

Ö jollekin A B VÄLIN-TULO
10 20 VÄLIN-TULO .

Tässä luvut 10 ja 20 ovat sanoja, jotka suorittuessaan puskevat pinolla arvonsa. VÄLIN-TULO taas poimii pinolta kaksi päälimmäistä arvoa ja puskee lopputuloksensa pinolle. Komento . tulostaa pinon päälimmäisen arvon.

Sampon matemaattiset toimitukset toimivat hieman poikkeavalla tavalla: sanat +, -, *, /, ^, MOD, ( ja ) puskevat pinon päälle vastaavan alkion. Vasta sana = jäsentää pinolta lausekkeen ja laskee sen. Siis summa 2+5 lasketaan Sampossa

Ö Sampon kommenttimerkki on Ö
2 Ö Pusketaan pinolle 2
+ Ö Pusketaan pinolle +
5 Ö Pusketaan pinolle 5
= Ö Jäsennetään lauseke ja lasketaan tulos pinolle
. Ö Tulostus

Ö Sama napakammin

5 + 2 = .

Sampon tärkeimmät tietotyypit ovat luvut (liukulukuja tai kokonaislukuja tarpeen vaatiessa), alkiot ja listat.

Helpoin tapa määritellä alkio on käyttää "-sanaa. Tällöin seuraava sana tulkitaan alkion arvoksi ja pusketaan pinolle:

" alkio-voi-sisältää-kaikkea-jännää!

Alkiot elävät jossain C-maailman merkkijonojen ja LISP-maailman symbolien välimaastossa. Sampossa ei ole C-maailman kielistä tuttua merkkijonotyyppiä.

Lista määritellään sanojen ( ja ) avulla:

( Sampo-ohjelmointi sitten on metkaa ) .

Näin määriteltynä se sisältää alkioita. ( ja ) ovat tavallisia sanoja, joten välit niitä ennen ja niiden jälkeen ovat merkitseviä. Listoista lisää dokumentaatiosta

Jos tästä yltä löydy vastausta, niin sampon yleisdokumentaatio löytyy täältä.

Esimerkkikoodin sanasto

Sekalaista

  • Ö aloittaa rivikommentin (vrt. C/C++ // ja Pythonin #)
  • " merkitsee seuraavan sanan alkioksi. Esim " Moi .
  • . tulostaa pinon päältä arvon.
  • LUO :A :B ... :N F ... VALMIS Määrittelee uuden sanan F, joka lukee pinon päältä arvot :A, :B ... :N. Nämä arvot saa sitten uudestaan puskettua pinon päälle komennoilla :A jne. Esim. LUO :EKA :TOKA KAHDENSUMMA :EKA + :TOKA = VALMIS
  • arvo VAKIO nimi luo sanan nimi, joka puskee arvon arvo pinolle.
  • UNOHDA nimi unohtaa sanastosta sanan nimi ja kaikki sen jälkeen määritellyt sanat.

Listasanoja

  • ( ja ) määrittelevät listan.
  • l a PÄÄKSI asettaa alkion a listan l pääksi.
  • TEE jäsentää pinon päällä olevan listan Sampo-koodina ja suorittaa sen.

Ohjaussanoja

Huomio totuusarvoista: Sampo käyttää arvoa -1 totuuden merkkinä ja 0 epätotuuden. (Vapaavalintainen lisätehtävä: miksi tämä on järkevää tietokoneella, joka käyttää luvuista kahden komplementtiesitystä ja jolla on toteutettu bittitason logiikka-operaattorit raudassa?)

  • TOISTA ehto LOPETA? kroppa ALKUUN suorittaa kroppaa niin kauan kuin ehto on tosi.
  • JOS ehto TOSI? kroppa JATKA suorittaa kroppan, jos ehto on tosi.
  • JOS ehto TOSI? myötähaara MUUTEN vastahaara JATKA suorittaa myötähaarann, jos ehto on tosi. Suorittaa muuten vastahaaran.
  • n KERTAA kroppa VIELÄ? toistaa kroppa n kertaa. Huom: VIELÄ?-sana on vapaaehtoinen. Jos se puuttuu, niin kroppa rajautuu rivivaihtoon.

Pinonkäsittelysanoja

  • VAIHDA vaihtaa pinon kaksi päälimmäistä arvosta.
  • TUPLAA puskee pinon päälle kopion pinon päälimmäisestä arvosta.
  • POISTA poistaa pinon päälimmäisen arvon.
  • KIERRÄ poistaa pinon kolmannen arvon (huipulta laskien) ja lisää sen pinon päälle.

Konnasanoja

  • KONNA alustaa konnagrafiikkatilan. Kutsuttava vähintään kerran ennen muita konnasanoja. Jos konnatila on jo päällä, tyhjentää piirroksen, palauttaa konnan keskelle näyttöä, alatilaan ja osoittamaan ylös.
  • x OIKEA kääntää konnaa x astetta oikealle.
  • x VASEN kääntää konnaa x astetta vasemmalle.
  • x KULMA kääntää konnan kulmaan x. 90° on suoraan oikealle ja konna kääntyy myötäpäivään kulman kasvaessa.
  • SUUNTA puskee pinolle konnan kulman vastaavassa muodossa kuin sanan KULMA parametri.
  • x ETEEN siirtää konnaa x askelta eteen. Piirtää, mikäli konna on alatilassa.
  • x TAAKSE siirtää konnaa x askelta taakse. Piirtää, mikäli konna on alatilassa.
  • YLÖS asettaa konnan ylätilaan. Konna ei jätä jälkeä ja sen kolmio ei piirry.
  • ALAS asettaa konnan alatilaan. Konna jättää taas jäljen ja sen kolmio piirtyy.
  • x y PAIKKA asettaa konnan paikkaan (x, y).
  • XKO puskee pinolle konnan x-koordinaatin.
  • YKO puskee pinolle konnan y-koordinaatin.

Esimerkkikoodi pinon ja sanaston käytöstä

f(x) = \begin{cases}x\mathrm{,}&\mathrm{jos\ }x < 2 \\ f(x-1)+f(x-2)\mathrm{,}&\mathrm{muuten }\end{cases}

Fibonaccin lukuja nimetyillä muuttujilla:

LUO :N FIB
    JOS :N < 2
        TOSI? :N
        MUUTEN ( :N - 1 = FIB ) + ( :N - 2 = FIB ) =
    JATKA
VALMIS

Fibonaccin lukuja suoraan pinolla:

LUO FIB
    JOS TUPLAA > 1 TOSI?
        TUPLAA - 1 = FIB
        VAIHDA - 2 = FIB + VAIHDA =
    JATKA
VALMIS

Esimerkkikoodi konnasta

Monikulmion piirto

LUO :N KULMIO
    :N KERTAA 50 ETEEN 360 / :N = OIKEA VIELÄ?
VALMIS

KONNA

5 KULMIO

Esimerkkikoodi L-järjestelmiä varten

Apukomennot

Ö Yleinen hyökkäyssuunnitelma:
Ö - Jokaiselle muuttujalle tai vakiolle oma sana.
Ö - Sana puskee pinolle sen, miksi muuttuja laajenee
Ö - Sana kerää, joka kasaa pinolta listan
Ö - Hyödynnetään sanaa TEE, joka jäsentää ja suorittaa listan
Ö - Sana kehitä, joka toistaa KERÄÄ / TEE -silmukkaa
LUO KERÄÄ
    ( )
    TOISTA VAIHDA TUPLAA == " POHJA LOPETA?
        PÄÄKSI
    ALKUUN
    POISTA
VALMIS
LUO :N KEHITÄ
    :N KERTAA KERÄÄ " POHJA VAIHDA TEE VIELÄ?
VALMIS

Esimerkki 1: \{\mathrm{A} \to \mathrm{AB}, \mathrm{B} \to \mathrm{A}\}

LUO A " A " B VALMIS
LUO B " A VALMIS
" POHJA
" A
4 KEHITÄ
KERÄÄ .

Esimerkki 2 piirrolla: \{\mathrm{F} \to \mathrm{FPFMFMFPF}, \mathrm{P} \to \mathrm{P}, \mathrm{M} \to \mathrm{M}\}

                                       
" P VAKIO P " M VAKIO M
LUO F " F " P " F " M " F " M " F " P " F VALMIS

" POHJA " F 3 KEHITÄ

LUO P 90 OIKEA VALMIS
LUO M 90 VASEN VALMIS
LUO F 10 ETEEN VALMIS

KONNA
450 100 PAIKKA 90 VASEN
KERÄÄ TEE