A karácsony tizenkét napja versgenerátor

A karácsony tizenkét napja (The Twelve Days of Christmas) egy régi angol gyermekvers, amelynek jellegzetessége, hogy az egymást követő versszakok mindig újabb és újabb sorokkal egészülnek ki, vagyis a kezdő strófa folyamatosan kumulálódik. Ez a szerkezet szinte kínálja magát arra, hogy algoritmikus úton is megpróbálkozzunk a vers előállításával.

Az eredeti angol szöveg először 1780 körül jelent meg nyomtatásban. S bár számos változata létezik, ezek többnyire arról szólnak, hogy a versmondó különböző ajándékokat kap az igaz szerelmétől. Minden nap mást és eggyel többet.

A vershez a magyar fordítást Tarbay Ede készítette. Ez a szerkezetében híven őrzi az angol mondóka sajátosságát, tartalmát tekintve azonban más. Ebben ugyanis nem ajándékozásról van szó, hanem különböző állatok és emberek fogalmazzák meg a karácsonyi jókívánságaikat. Naponta egyre többen.

Az alábbiakban arra vállalkozom, hogy egy algoritmus segítségével legenerálom a versike magyar változatát. Ennek ismétlődő részeit csak egyszer írom le, majd ezekre ott és annyiszor hivatkozom, ahol és amennyi alkalommal a versben szükség van rá. Hiszen a programozás során általában fontos szempont, hogy lehetőség szerint elkerüljük a redundanciát és hatékonyan gazdálkodjunk a meglévő adatainkkal.

Az alábbiakban R nyelven (v4.2.2) írt kódot használok a feladat végrehajtásához. A magyarázó szövegek közé ékelt fekete kódblokkok tartalmát az RStudio-ban egymás alá illesztve elvileg bárki által reprodukálható az itt bemutatott műveletsor. A kódblokkok # kezdetű sorai pusztán magyarázó funkcióval bírnak, ezekre a program futtatásakor nincs szükség.

Az algoritmusban először elmentem egy-egy vektorba a karácsony napjait és a köszöntést mondó illetőket.

Ezt követően a for ciklussal végig megyek az 1 és 12 közötti egész számokon, amelyek sorban bekerülnek az i változóba. Ezek a számok a napokat reprezentálják és indexként szolgálnak a vektorok elemeire való hivatkozásnál. Ha például i=3, akkor a napok[i] tartalma a “harmadik” szöveg lesz. Mert ez a napok nevű vektor harmadik eleme. Ezt használjuk fel tehát arra, hogy a szövegbe behelyettesítsük a megfelelő napokat. A példánknál maradva a paste("Karácsony", napok[i], "napja van,") utasítással a “Karácsony harmadik napja van,” szöveg állítható elő.

A vers második sora minden esetben azonos, ezzel különösebb dolgunk nincsen. Ezután a köszöntésre felsorakozottak következnek. A koszontok nevű vektor elemein ugyancsak a for ciklussal megyek végig. Az első napon csak az 1. elemét, aztán rendre a 2–1., 3–1., 4–1. stb. elemeit választom ki. Tehát minden nappal eggyel többet, visszafelé haladva. Ezeket egyenként, a napokhoz hasonló behelyettesítő módszerrel, új sorokba kinyomtatom a képernyőre.

A for cikluson kívül az algoritmusban három függvény fordul elő. A paste() és a paste0() függvények használatával különböző karakterláncokat tudunk összefűzni. A kettő között az a különbség, hogy az első egy szóközt tesz ezek közé, a második viszont szorosan egymás mellé helyezi őket. Az előállított szövegrészeket a cat() függvénnyel íratom ki a képernyőre. Ez abban különbözik – az itt nem használt – print() függvénytől, hogy a sortöréseket jelző speciális karaktereket (\n) nem kiírja, hanem az adott ponton ténylegesen megtöri a sorokat.

Lássuk tehát az algoritmust és a végeredményt!

napok <- c("első","második","harmadik","negyedik","ötödik","hatodik","hetedik","nyolcadik","kilencedik","tizedik","tizenegyedik","tizenkettedik")

koszontok <- c("egy csíz a csupasz körtefán.",
               "két gerle és",
               "három veréb-zenész,",
               "négy nyafka macska,",
               "öt szélkakaska,",
               "hat tyúkanyó,",
               "hét hattyú, tolla tiszta hó,",
               "nyolc nyúl a vadász oldalán,",
               "kilenc kötényes kisleány,",
               "tíz tekergő kéményseprő,",
               "tizenegy táncos, tarka úrnő,",
               "tizenkét ugra-bugra úr,")

for (i in 1:12) {
  cat(paste("Karácsony", napok[i], "napja van,"))
  cat("\nköszönt és minden jót kíván")
  for (j in i:1) {
    cat(paste0("\n", koszontok[j]))
  }
  cat("\n\n")
}
## Karácsony első napja van,
## köszönt és minden jót kíván
## egy csíz a csupasz körtefán.
## 
## Karácsony második napja van,
## köszönt és minden jót kíván
## két gerle és
## egy csíz a csupasz körtefán.
## 
## Karácsony harmadik napja van,
## köszönt és minden jót kíván
## három veréb-zenész,
## két gerle és
## egy csíz a csupasz körtefán.
## 
## Karácsony negyedik napja van,
## köszönt és minden jót kíván
## négy nyafka macska,
## három veréb-zenész,
## két gerle és
## egy csíz a csupasz körtefán.
## 
## Karácsony ötödik napja van,
## köszönt és minden jót kíván
## öt szélkakaska,
## négy nyafka macska,
## három veréb-zenész,
## két gerle és
## egy csíz a csupasz körtefán.
## 
## Karácsony hatodik napja van,
## köszönt és minden jót kíván
## hat tyúkanyó,
## öt szélkakaska,
## négy nyafka macska,
## három veréb-zenész,
## két gerle és
## egy csíz a csupasz körtefán.
## 
## Karácsony hetedik napja van,
## köszönt és minden jót kíván
## hét hattyú, tolla tiszta hó,
## hat tyúkanyó,
## öt szélkakaska,
## négy nyafka macska,
## három veréb-zenész,
## két gerle és
## egy csíz a csupasz körtefán.
## 
## Karácsony nyolcadik napja van,
## köszönt és minden jót kíván
## nyolc nyúl a vadász oldalán,
## hét hattyú, tolla tiszta hó,
## hat tyúkanyó,
## öt szélkakaska,
## négy nyafka macska,
## három veréb-zenész,
## két gerle és
## egy csíz a csupasz körtefán.
## 
## Karácsony kilencedik napja van,
## köszönt és minden jót kíván
## kilenc kötényes kisleány,
## nyolc nyúl a vadász oldalán,
## hét hattyú, tolla tiszta hó,
## hat tyúkanyó,
## öt szélkakaska,
## négy nyafka macska,
## három veréb-zenész,
## két gerle és
## egy csíz a csupasz körtefán.
## 
## Karácsony tizedik napja van,
## köszönt és minden jót kíván
## tíz tekergő kéményseprő,
## kilenc kötényes kisleány,
## nyolc nyúl a vadász oldalán,
## hét hattyú, tolla tiszta hó,
## hat tyúkanyó,
## öt szélkakaska,
## négy nyafka macska,
## három veréb-zenész,
## két gerle és
## egy csíz a csupasz körtefán.
## 
## Karácsony tizenegyedik napja van,
## köszönt és minden jót kíván
## tizenegy táncos, tarka úrnő,
## tíz tekergő kéményseprő,
## kilenc kötényes kisleány,
## nyolc nyúl a vadász oldalán,
## hét hattyú, tolla tiszta hó,
## hat tyúkanyó,
## öt szélkakaska,
## négy nyafka macska,
## három veréb-zenész,
## két gerle és
## egy csíz a csupasz körtefán.
## 
## Karácsony tizenkettedik napja van,
## köszönt és minden jót kíván
## tizenkét ugra-bugra úr,
## tizenegy táncos, tarka úrnő,
## tíz tekergő kéményseprő,
## kilenc kötényes kisleány,
## nyolc nyúl a vadász oldalán,
## hét hattyú, tolla tiszta hó,
## hat tyúkanyó,
## öt szélkakaska,
## négy nyafka macska,
## három veréb-zenész,
## két gerle és
## egy csíz a csupasz körtefán.

Ezzel a versikével kívánok A programozó történész blog minden olvasójának kellemes karácsonyi ünnepeket! 🎄🎁😊

Az előző évek karácsonyi posztjai megtekinthetők itt:

comments powered by Disqus