Ente, Ente, weg!

40

Hier ist das (ziemlich beängstigende) Lied der fünf kleinen Enten (es ist nicht lang):

Five little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only four little ducks came back.

Four little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only three little ducks came back.

Three little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only two little ducks came back.

Two little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only one little duck came back.

One little duck went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but none of the little ducks came back.

Mother duck herself went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
and all of the little ducks came back.

Ihre Aufgabe ist es nicht, dieses Lied auszugeben. Sie sollten einen Vers nehmen und den nächsten Vers ausgeben (der nächste Vers des letzten Verses ist der erste Vers).

Regeln

  • Bitte keine Standardlücken.
  • Die Ein- / Ausgabe erfolgt über unsere Standard-Ein- / Ausgabemethoden.
  • Der genaue Vers muss ausgegeben werden und es sollte keine Unterschiede zum Liedtext geben. Die Eingabe wird nicht anders sein, wenn sie auch mit dem Liedtext verglichen wird.

Beispiele

Mother duck herself went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
and all of the little ducks came back.

Erwartet:

Five little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only four little ducks came back.

Three little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only two little ducks came back.

Erwartet:

Two little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only one little duck came back.
EIN _
quelle
22
Ich erinnere mich, dass die Worte dazu etwas anders waren, als ich jung war, vor vielen Monden. Aber ich erinnere mich auch, dass ich davon traumatisiert war! Wo waren diese vermissten Entenküken für all die Tage ?! Warum war niemand auf der Suche nach ihnen ?! Und was für eine verantwortungslose Mutter schafft es, so viele Kinder zu verlieren und den Rest zum Spielen rauszulassen ?! Der Horror!
Shaggy
8
Möglicherweise doppelt . Ich
mache
7
Du hast mich nur versteinert.
A _
2
Dieser Liedtext hat mich sicher in eine Achterbahn der Gefühle getrieben.
Num Lock
2
Ich habe das YouTube-Video, das ich gestern hier gepostet habe, zweimal, nur zweimal angehört. Jetzt ist dieses Lied in mein Gehirn eingebettet, wo immer ich auch hingehe, was immer ich tue, ich höre es immer wieder! Hilfe ...
Night2

Antworten:

3

Stax , 115 111 Bytes

τ*^&k─Zè0µ9┬$█◘çl╟☼:Drσ59ò╠▄┴╢Q♂╔¡ô╜Oa╣▀yèA÷╨%^♀█Ö+╡◄ì=∙%╧o▌Θ<▲Çα¿╗√;1°┼╤V◘ú┐♥▒ÇM☼b╩░o]YaL4░ƒ%(Æ♫Q0æÆä⌂¡╘○Eâó╪¡

Führen Sie es aus und debuggen Sie es

Alle Verse als Testfälle

rekursiv
quelle
1
Wenn Sie es mit "One little duck" ausführen, antwortet es "little ducknd little duckll of the little ducks come back". in der letzten Zeile.
Dorian
1
Der Fehler wurde in der Größe kostenlos behoben. Tatsächlich ging es um 2-Byte-Kosten und um die Kompensation von 2-Byte-Einsparungen an anderer Stelle, obwohl Bytes hier schwer zu messen sind, da die Änderungen nicht genau byteweise in komprimierten String-Literalen oder sogar im endgültigen Programm ausgerichtet sind.
rekursiver
19

JavaScript (ES9), 227 Byte

Dies ähnelt der folgenden Node-Version, verwendet jedoch eine Formel, die auf basiert, parseInt()anstatt Buffer()den Eingabevers zu identifizieren.

Dies ist ES2018 (auch bekannt als ES9), da wir einen regulären Ausdruck mit dem /sFlag ( dotAll ) verwenden.

s=>'Mother duck herself1and all23,,Three4two3,Five4four3,Four4three3,One01but none23,Two4one0'.split`,`[parseInt(s,30)&7].replace(/\d/g,n=>[x=' little duck',y=/ w.*\n/s.exec(s),' of the',x+='s',x+y+'but only '][n])+s.slice(-11)

Probieren Sie es online!

Wie?

In dieser Version analysieren wir den gesamten Eingabevers als Basis 30 ( 0bis t) und führen ein bitweises UND mit 7 durch. Das Parsen stoppt beim ersten ungültigen Zeichen, was zu Folgendem führt:

 verse | valid part | base 30 -> decimal | AND 7
-------+------------+--------------------+-------
   0   |  'fi'      |            468     |   4
   1   |  'fo'      |            474     |   2
   2   |  'three'   |       23973734     |   6
   3   |  't'       |             29     |   5
   4   |  'one'     |          22304     |   0
   5   |  'mother'  |      554838747     |   3

JavaScript (Node.js) ,  233 231  227 Byte

2 Bytes dank @Shaggy gespart

s=>'Three4two3,Four4three3,Mother duck herself1and all23,One01but none23,,,Two4one0,,Five4four3'.split`,`[Buffer(s)[2]%9].replace(/\d/g,n=>[x=' little duck',y=/ w.*\n/s.exec(s),' of the',x+='s',x+y+'but only '][n])+s.slice(-11)

Probieren Sie es online!

Wie?

Das dritte Zeichen jedes Eingabevers kann als eindeutiger Bezeichner verwendet werden. Mit dem ASCII-Code modulo 9 erhalten wir:

 verse | 3rd char. | ASCII code | MOD 9
-------+-----------+------------+-------
   0   |    'v'    |     118    |   1
   1   |    'u'    |     117    |   0
   2   |    'r'    |     114    |   6
   3   |    'o'    |     111    |   3
   4   |    'e'    |     101    |   2
   5   |    't'    |     116    |   8

Die Ausgabeversen sind mit den folgenden Vorlagen codiert:

 verse | template
-------+---------------------------------
   0   | 'Five4four3'
   1   | 'Four4three3'
   2   | 'Three4two3'
   3   | 'Two4one0'
   4   | 'One01but none23'
   5   | 'Mother duck herself1and all23'

Wobei jede Ziffer durch eine Zeichenfolge gemäß der folgenden Tabelle ersetzt wird:

 digit | replaced with
-------+---------------------------------------------------
   0   | ' little duck'
   1   | / w.*\n/s.exec(s)
   2   | ' of the'
   3   | ' little ducks'
   4   | ' little ducks' + / w.*\n/s.exec(s) + 'but only '

Wo der reguläre Ausdruck / w.*\n/sdiesen gemeinsamen Teil aus der Eingabe extrahiert:

  went out one day,[LF]
 over the hills and up away.[LF]
 Mother Duck said, "Quack Quack Quack Quack",[LF]

Wir fügen schließlich die letzten 11 Zeichen der Eingabe hinzu " came back.".

Arnauld
quelle
231
Shaggy
1
@ Shaggy Schön gemacht. Vielen Dank!
Arnauld
2
Habe gerade einen weiteren Kommentar gepostet, um vorzuschlagen, execwann die Seite neu geladen wurde. Großartige Köpfe ...!
Shaggy
11

Python 3 , 267 263 254 Bytes

4 Bytes gespart dank @ovs

def f(s):
 for a in zip(T[2:]+T,T):s=s.replace(*a)
 return s
T="8:9:and allHO1BnoneHT2No1T3Nt2F4Nt3FiveINf4MotherD herself"
for r in "H of theI,4ourI,3hreeI,2woI,1neL:,ILs:,L littleD,D duck,NBonly ,Bbut ".split(','):T=T.replace(r[0],r[1:])
T=T.split(':')

Probieren Sie es online!

Ersetzt die relevanten Teile durch die entsprechenden Teile des nächsten Verses.

Nach der Vorinitialisierung Tist ['8', '9', 'and all of the little ducks', 'One little duck', 'but none of the little ducks', 'Two little ducks', 'but only one little duck', 'Three little ducks', 'but only two little ducks', 'Four little ducks', 'but only three little ducks', 'Five little ducks', 'but only four little ducks', 'Mother duck herself'].

Alternatives Python 2 , 252 Bytes

von @ovs

lambda s:reduce(lambda s,a:s.replace(*a),zip(T[2:]+T,T),s)
T="8:9:and allHO1BnoneHT2No1T3Nt2F4Nt3FiveINf4MotherD herself"
for r in "H of theI,4ourI,3hreeI,2woI,1neL:,ILs:,L littleD,D duck,NBonly ,Bbut ".split(','):T=T.replace(r[0],r[1:])
T=T.split(':')

Probieren Sie es online!

Schwarze Eule Kai
quelle
for a in zip(T,T[-2:]+T):s=s.replace(*a)für 264 Bytes.
24.09.
Oder lambda s:reduce(lambda s,a:s.replace(*a),zip(T,T[-2:]+T),s)für 262 Bytes in Python 2.
Ovs
@ovs Danke, ich habe es auf 263 geschafft, indem ich einige Dinge umkodiert und T[2:]anstelle vonT[-2:]
Black Owl Kai
9

QuadR , 257 242 Bytes

-14 danke an Black Owl Kai, -1 danke an Kevin Cruijssen

ive
Four
hree
Two( little duck)s
One little( duck)
Mother( duck) herself
four
two( little duck)s
only on(e little duck)
but none
and all of the
our
Three
wo
One\1
Mother\1 herself
Five little\1s
three
one\1
none of th\1s
and all
but only four

Probieren Sie es online!

Adam
quelle
1
243 Bytes
Black Owl Kai
1
242 Bytes
Kevin Cruijssen
7

Java 10, 347 Bytes

s->{String L=" little duck",M="Mother duck herself";int i=9;for(var t:("ive;Four;hree;Two"+L+"s;One"+L+";four;two"+L+"s;only one"+L+";but none;and all of the;"+M).split(";"))s=s.replace(t,++i+"");for(var t:("Five"+L+"s;but only four;and all;none of the"+L+"s;one"+L+";three;"+M+";One"+L+";wo;Three;our").split(";"))s=s.replace(i--+"",t);return s;}

Probieren Sie es online aus.

Erläuterung:

[10,21]

s->{                     // Method with String as both parameter and return-type
  String L=" little duck",M="Mother duck herself";
                         //  Two temp strings to save bytes
  int i=9;               //  Temp replacement integer, starting at 9
  for(var t:("ive;Four;hree;Two"+L+"s;One"+L+";four;two"+L+"s;only one"+L+";but none;and all of the;"+M).split(";"))
                         //  Loop over the parts to replace:
    s=s.replace(t,       //   Replace the part,
                ++i+""); //   with the integer pre-incremented by 1
  for(var t:("Five"+L+"s;but only four;and all;none of the"+L+"s;one"+L+";three;"+M+";One"+L+";wo;Three;our").split(";"))
                         //  Then loop over the parts to replace with in reverse:
    s=s.replace(i--+"",  //   Replace the (post-decrementing) integer,
    t);                  //   with the replacement-part
  return s;}             //  And then return the modified String as result
Kevin Cruijssen
quelle
7

T-SQL, 407 390 388 382 Bytes

DECLARE @ CHAR(999)=REPLACE(REPLACE('SELECT CASE LEFT(v,2)WHEN''Fi74,''Four''),122,4,''three'')WHEN''Fo74,''Three''),123,5,''two'')WHEN''Th75,''Two''),121,16,''on#'')WHEN''Tw716,''On#''),115,20,''none of th#s'')WHEN''On715,''Mother duck herself''),115,8,''and all'')WHEN''Mo719,''Fiv#s''),113,14,''but only four'')END FROM i',7,'''THEN STUFF(STUFF(v,1,'),'#','e little duck')EXEC(@)

ichVARCHAR(MAX)v

REPLACEFührt nach einigen Byte-Einsparungen Folgendes als dynamisches SQL aus:

SELECT CASE LEFT(v,2)
       WHEN'Fi'THEN STUFF(STUFF(v,1,4,'Four'),122,4,'three')
       WHEN'Fo'THEN STUFF(STUFF(v,1,4,'Three'),123,5,'two')
       WHEN'Th'THEN STUFF(STUFF(v,1,5,'Two'),121,16,'one little duck')
       WHEN'Tw'THEN STUFF(STUFF(v,1,16,'One little duck'),115,20,'none of the little ducks')
       WHEN'On'THEN STUFF(STUFF(v,1,15,'Mother duck herself'),115,8,'and all')
       WHEN'Mo'THEN STUFF(STUFF(v,1,19,'Five little ducks'),113,14,'but only four')END
FROM i

Verwendet eine CASEAnweisung und STUFFBefehle, um Zeichen an den aufgelisteten Positionen einzufügen / zu überschreiben.

EDITS :

  1. Ersetzen Sie das Original (unten) durch eine völlig andere Strategie
  2. Zwei Bytes wurden gespart, indem auf LEFTanstatt auf umgeschaltet SUBSTRINGund ein Leerzeichen entfernt wurde
  3. 6 Bytes durch Ändern der Variablen in CHARund Verschieben eines zusätzlichen Buchstabens in die Sekunde REPLACEgespart (danke, @CDC!)

Hier ist meine erste Version mit einer anderen Methode (nach dem Ersetzen, formatiert):

DECLARE @ VARCHAR(MAX)
SELECT @=v FROM i
SELECT @=REPLACE(@,PARSENAME(value,2),PARSENAME(value,1))
FROM string_split('e.but none.and all
                  -e.One little duck.Mother duck herself
                  -o.only one little duck.none of the little ducks
                  -o.Two little ducks.One little duck
                  -r.two little ducks.one little duck
                  -r.Three.Two
                  -u.three.two
                  -u.Four.Three
                  -v.four.three
                  -v.Five.Four
                  -t.and all of the.but only four
                  -t.Mother duck herself.Five little ducks','-')
WHERE LEFT(value,1)=SUBSTRING(@,3,1)
PRINT @

STRING_SPLITund PARSENAMEwerden verwendet, um einen String über -und .Trennzeichen in Zeilen und Spalten zu unterteilen .

Die erste Spalte ist ein Schlüsselzeichen, das mit dem dritten Buchstaben des Eingabevers abgeglichen wird (danke für die Idee, @ Night2). Das zweite und dritte sind die Ersetzungen, die für diesen Vers durchgeführt werden.

BradC
quelle
Erste Lösung: Wenn Sie "CHAR (700)" anstelle von "VARCHAR (MAX)" verwenden, können Sie 3 Bytes einsparen. Auch in Ihrer "kleinen Ente" können Sie stattdessen "e kleine Ente" machen und das e vor # auf jedem Ersatz entfernen, um weitere 3 zu erhalten.
CDC
Übrigens, wirklich spaßige Lösung. Ich habe formatmessage verwendet, um Ihnen sehr nahe zu kommen, aber nicht ganz.
CDC
Gute Vorschläge, @CDC, danke!
BradC
6

Python 2 , 1034 Bytes

Das ist mein Code! Es verwendet ein einfaches Wörterbuch. Nachdem Sie diesen Code ausgeführt haben, können Sie einen beliebigen Vers eingeben und es wird der nächste Vers ausgegeben.

PS: Ich bin neu in diesem Kanal und dies ist mein erster Beitrag. Diese Herausforderung hat mir sehr gut gefallen, also habe ich mich entschlossen, sie auszuprobieren. Bitte zögern Sie nicht mich zu korrigieren.

import sys
i=sys.stdin.readlines()
s={"Mother":"""Five little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only four little ducks came back.""",
"Five":"""Four little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only three little ducks came back.""",
"Four":"""Three little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only two little ducks came back.""",
"Three":"""Two little ducks went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but only one little duck came back.""",
"Two":"""One little duck went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
but none of the little ducks came back.""",
"One":"""Mother duck herself went out one day,
over the hills and up away.
Mother Duck said, "Quack Quack Quack Quack",
and all of the little ducks came back."""}
print s[i[0].split(" ")[0]]
Prachiti Prakash Prabhu
quelle
11
Willkommen auf der Seite! Normalerweise würden wir das Wörterbuch als Teil der Quelle zählen. Ein Teil der Herausforderung wäre es, dies so klein wie möglich zu halten. Es gibt auch einige Möglichkeiten, wie Sie dies verkürzen können. 1) Da Sie keine Punkte dafür bekommen, dass Sie lesbar sind, können Sie einzelne Zeichen als Variablennamen verwenden (z. B. xoder a). 2) Python ist ziemlich tolerant gegenüber Whitespace. Daher würde ich versuchen, auch einige Ihrer Whitespaces zu entfernen. Zum Beispiel brauchen Sie keine Leerzeichen =. Endlich haben wir eine Seite zum Golfen in Python, die Sie besuchen können, um Ihr Spiel zu verbessern.
Weizen-Assistent
wow @ SriotchilismO'Zaic! Das ist hilfreich. Danke! :)
Prachiti Prakash Prabhu
1
Sie können dies einfach tun, indem Sie unnötige Leerzeichen und Variablen entfernen, das Importieren vermeiden, sysindem Sie z. B. raw_input()den Schlüssel des Wörterbuchs verkürzen usw. Sie sollten auf jeden Fall die wiederholten Abschnitte des Songs herausnehmen und separat hinzufügen
Jo King,
@JoKing, wie ich schon sagte, dies ist mein allererster Beitrag und ich habe nicht viel darüber nachgedacht. Ich wollte es nur versuchen, aber jetzt habe ich die Idee. Mein nächster Post wird viel, viel besser und kürzer sein - alles dank euch ... helft mir raus! :)
Prachiti Prakash Prabhu
6

PHP (7.4), 253 247 Bytes

-6 Byte durch Verbesserung des Aufbaus des Ersatz-Arrays mithilfe von "Entpacken in Arrays".

<?=strtr($argv[1],array_combine([0,1,...$a=[Five.$l=($o=" little duck").s,($b="but only ").four.$l,Four.$l,$b.three.$l,Three.$l,$b.two.$l,Two.$l,$b.one.$o,One.$o,"but none of the$l","Mother duck herself","and all of the$l"]],[...$a,$a[0],$a[1]]));

Probieren Sie es online!

Dadurch wird ein Array aller möglichen Ersetzungen (12 verwendete + 2 nicht verwendete) in einem key=>valueFormat erstellt. Beispiel: ['Mother duck herself' => 'Five little ducks', etc...]und ersetzt dann nur die mit strtr .

Das einzig interessante ist meine allererste Verwendung von "In Arrays entpacken" , einer neuen Funktion in PHP 7.4.


PHP , 264 Bytes

<?=str_replace(($a=[[Five.$l=($o=" little duck").s,($b="but only ").four.$l],[Four.$l,$b.three.$l],[Three.$l,$b.two.$l],[Two.$l,$b.one.$o],[One.$o,"but none of the$l"],["Mother duck herself","and all of the$l"]])[$i=strpos(vuroet,($v=$argv[1])[2])],$a[++$i%6],$v);

Probieren Sie es online!

Ich habe verschiedene Wörter jedes Verses in einem Array gespeichert. Ich finde, welcher Vers das dritte Zeichen der Eingabe verwendet, da es eindeutig ist (vuroet ). Dann ersetze ich einfach verschiedene Wörter dieses Verses durch verschiedene Wörter des nächsten Verses.

Night2
quelle
5

Reinigen , 352 Bytes

import StdEnv,Text
$n={#"Five"+e+"four"+d,"Four"+e+"three"+d,"Three"+e+"two"+d,"Two"+e+"one"+a,"One"+a+b+"but none"+f,"Mother duck herself"+b+"and all"+f}.[indexOf{n.[2]}"tvuroe"]+" came back."
a=" little duck"
b=" went out one day,\nover the hills and up away.\nMother Duck said, \"Quack Quack Quack Quack\",\n"
d=a+"s"
e=d+b+"but only "
f=" of the"+d

Probieren Sie es online!

Οurous
quelle
5

C # (Visual C # Interactive Compiler) , 262 Byte

x=>$@"{l[g=x[2]*37%724%7]}{g-5:; little} duck{g-4: herself;s;\} went out one day,
{(x=x.Split('\n'))[1]}
{x[2]}
{g-5:and;but} {g-4:all;only;none} {(g>3?"of the":l[g+1].ToLower())} little duc{g%3:ks;;k} came back.";var l=" Four Three Two One Mother".Split();int g

Probieren Sie es online!

Verkörperung der Ignoranz
quelle
3

PowerShell , 356 343 340 336 Byte

param($p)$l,$M=' little duck','Mother duck herself'
("ive!our;four!three;hree!wo;Four!Three;two!one;s c! c;Two!One;s w! w;only one!none of the;k c!ks c;One$l!$M;but none!and all;$M!Five$l`s;and all of the!but only four"-split';')[$(switch -r($p){^Fi{0,1}^Fo{2,3}^Th{2,4,5}^Tw{6..9}^O{10,11}^M{12,13}})]|%{$p=$p-creplace($_-split'!')}
$p

Probieren Sie es online aus .

Mehr lesbare Version:

param($p)
$l, $M = ' little duck', 'Mother duck herself'
$replacements = @"
ive!our
four!three
hree!wo
Four!Three
two!one
s c! c
Two!One
s w! w
only one!none of the
k c!ks c
One$l!$M
but none!and all
$M!Five$l`s
and all of the!but only four
"@ -split '\n'
$i = switch -regex ($p) { ^Fi { 0, 1 }
                          ^Fo { 2, 3 }
                          ^Th { 2, 4, 5 }
                          ^Tw { 6..9 }
                          ^O  { 10, 11 }
                          ^M  { 12, 13 } }
$replacements[$i] | % { $p = $p -creplace ( $_ -split '!' ) }
$p
Andrei Odegov
quelle
3

PowerShell , 265 263 255 251 246 Byte

$d='Five1four2s,Four1three2s,Three1two2s,Two1one2,One23but none52s,Mother duck herself3and all52s'-split','
'2s34',' little duck',-join($args-split'(\s)')[5..39],'but only ',' of the'|%{$d=$d-replace++$i,$_}
$d[+"$args"[2]*37%724%7]+' came back.'

Probieren Sie es online!

Ich benutzte die rohe Gewalt, um den Ausdruck zu finden +"$args"[2]*37%724%7.

 verse | 3rd char. | ASCII code | *37%724%7
-------+-----------+------------+-----------
   0   |    'v'    |     118    |   1
   1   |    'u'    |     117    |   2
   2   |    'r'    |     114    |   3
   3   |    'o'    |     111    |   4
   4   |    'e'    |     101    |   5
   5   |    't'    |     116    |   0

Danke @Arnauld für das 3rd char.

mazzy
quelle
2

Japt v2.0a0, 143 Bytes

Es wurde versucht, einen einzelnen Vers mit Ersetzungen zu codieren, aber am Ende war die Anpassung von Arnauld's Lösung kürzer. Haben Sie eine andere Idee, die hoffentlich wieder kürzer wird, aber Sie wissen nicht, wann ich es versuchen kann.

tBn)i`Fr4È(e3
Two4e0
MÇ@r Ýõ Êelf1d a¥23
O01¿t Í
23
TËG4two3
Five4fr3`·g`v`b¢Î)r\dÈ°g[V=` Ò¤ Ýõ`W=Uf/ w.*\n/s `  e`V±'sV+W+`¿t § `]

Probieren Sie es aus - enthält alle Verse

Zottelig
quelle
2

Bash , 373 355 Bytes

Hier ist nichts zu verrückt. Eine einfache Reduzierung um einige Bytes wäre, die zweistelligen Variablen (a1, a2, a3, e1..e6) durch Einzeichenvariablen zu ersetzen.

read a{1..3} b
read c
read d
read e{1..6}
W="$e1 $e2"
X="${e3^} $a2 $a3"
Y="$e5 $e6"
Z="$e4 $Y"
p=$X
case $a1 in M*)p="Five ${Y::12}";s="but only four $Y";;O*)p="${d::11} herself";s="and all of $Z";;Tw*)p=${X/s};s="$e1 none of the $a2 ducks $e6";;Th*)s="$W one $e4 duck $e6";;Fo*)s="$W two $Z";;Fi*)s="$W three $Z";;esac
echo $p $b;echo $c;echo $d;echo $s

Probieren Sie es online!

Probieren Sie es online!

spuckte
quelle
2

05AB1E , 134 Bytes

“€µ‚•„í†ìˆÈ“#’ „ê Ðœs’δJ樅î¥Ðœº¶s‚ìðδJD…€³€É δ쨦“€ƒ€Ÿ€‚€€““€³Šª€‚€€“‚’ „ê Ðœs ’δJ셋邃.δJU.•4Ôāl•|н2èk©è.ª?I„ 
ý#3.$17£ðý„ 
¶:,X®è?

Probieren Sie es online!

Da ich relativ neu bei 05AB1E bin, kann man vielleicht viel Golf spielen

                ### Preparation of the output strings ###
“€µ‚•„í†ìˆÈ“        push "one two three four five"
#                   split that by spaces
’ „ê Ðœs’           push " little ducks"
δJ                  join each number with " little ducks"
ć¨                  separate "one little ducks" and drop the "s"
…î¥Ðœº¶             push "mother duck herself"
s                   swap it with "one little duck"
‚ì                  prepend both strings to the list ["mother duck herself", "one little duck", "two little ducks" ... ]
ðδJ                 append a space to each list entry
D                   duplicate it
…€³€É               push "but only "
δì                  prepend "but only " to each list entry
¨¦                  drop the first and last list entry
“€ƒ€Ÿ€‚€€“          push "and all of the"
“€³Šª€‚€€“          push "but none of the"
‚                   push the two strings into a list
’ „ê Ðœs ’δJ        append " little ducks " to each
ì                   prepend it to the sentence list ["and all of the little ducks ", "but none of the little ducks ", "but only one little duck " ...]
…‹é‚ƒ.              push "came back."
δJ                  append that to each list entry
U                   save that list in X for later use

                ### Determine which verse has to be answered ###
.•4Ôāl•             push "eoruvt"
|н2è                get the third letter of the input
k                   get the index of that letter in "eoruvt". Now we know which verse we must return
©                   save that index in ® for later use

                ### Print the answer strings ###
è.ª?                print that index of the first sentence list (first three words of answer)
I„                  join the four input strings by <space><newline>
ý
#                   split that by spaces
3.$                 cut off the first three words
17£                 keep only the next 17 words
ðý                  join remaining words by spaces
„ 
¶:                  replace <space><newline> by only <newline>
,                   print that ("went out ... Quack\",") 
X®è?                print the last line of answer
Dorian
quelle
1

Perl 6 , 247 Bytes

{S:i/ne\sl.*?<(s//}o{m/..(.)(\S*)**3%\s(.**92).*(.**11)/;[(my$l=" little ducks")~$3 XR~"Mother duck herself$2and all of the","One{$l~=$2}but none of the","Five{$l~="but only "}four","Four{$l}three","Three{$l}two","Two{$l}one"]["eotvur".index($0)]}

Probieren Sie es online!

Definitiv golffähig, besonders die letzten 5 Elemente in der Liste im Formular "num $l num-1"oder die Start-Regex, die den richtigen Teilen der alten Eingabe entspricht.

Scherzen
quelle
1

Kohle , 156 Bytes

≔⌕tvuroe§θ²δ§⪪”↶0∨↘»≔xj➙⌈´βXPNLA‽⟦O⧴&▷V'¦³≧ψZρ⊞t”¶δF‹δ⁵”↶↧V4ⅉH‴G%”F‹δ⁴s⮌…⮌θ¹⁸⸿η⸿ζ⸿§⪪”}∧h⁴NQ≕Q^⪫ΦG✂q'ⅉMG./_⸿s⁵6P⁴″⊟±NNpOfBz↷Fι‖TM→⁻γ?k⁴ς!d⁵º'E,θ}x§-υ”¶δ✂ε±¹¹

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔⌕tvuroe§θ²δ

Schauen Sie sich das dritte Zeichen der ersten Zeile an, um herauszufinden, welchen Vers wir wollen.

§⪪”↶0∨↘»≔xj➙⌈´βXPNLA‽⟦O⧴&▷V'¦³≧ψZρ⊞t”¶δF‹δ⁵”↶↧V4ⅉH‴G%”F‹δ⁴s⮌…⮌θ¹⁸

Ausgabe des ersten Teils der ersten Zeile durch die Indizierung in die Liste von Strings Five, Four, Three, Two,One , Mother duck herself. Dann drucken Sie little duckund snach Bedarf, gefolgt von den letzten 18 Zeichen der Eingabezeile (die in jedem Vers immer gleich sind).

⸿η⸿ζ⸿

Die beiden mittleren Zeilen sind in jedem Vers gleich.

§⪪”}∧h⁴NQ≕Q^⪫ΦG✂q'ⅉMG./_⸿s⁵6P⁴″⊟±NNpOfBz↷Fι‖TM→⁻γ?k⁴ς!d⁵º'E,θ}x§-υ”¶δ✂ε±¹¹

Für die letzte Zeile erweist es sich aus little ducksirgendeinem Grund als besser, sie in die Liste der Alternativen aufzunehmen, aber die letzten 11 Zeichen werden immer noch aus der Eingabe kopiert.

Neil
quelle
1

Tinte , 353 Bytes

=d(v)
~temp n=(v?"Fi")+(v?"F")*4+(v?"Th")+(v?"T")*2+(v?"O")
{n-1:{n:{n-5:{n-4:{n-3:One|Two}|Three}|Four}|Five} little duck{n-2:s}|Mother duck herself} went out one day,
over the hills and up away,
Mother Duck said "Quack Quack Quack Quack",
{n-1:but {n-2:only {n:{n-5:{n-4:one|two}|three}|four}|none of the}|and all of the} little duck{n-3:s} came back.

Probieren Sie es online!

Erstens verwendet prüft String um herauszufinden , was Vers wir sind in - , die auf die Aktivierung der Zahlen leicht genug Dank ist am Start - F, Tund Otreten nicht in anderen Orten, und Sie können die zweite und vierte Strophe unterscheiden von das erste und dritte, indem auch nach Fiund gesucht wirdTh .

Dann machen wir einfach das, was Tinte am besten kann und drucken normalen Text, der mit Bedingungen übersät ist. Zuerst habe ich versucht, switch-Anweisungen zu verwenden, aber das sah zwar besser aus, endete aber länger.
Sie würden denken, das Quacks wäre ein guter Ort, um Variablen zu verwenden, was, wenn eine Zeichenfolge ein paar Mal wiederholt wird, aber Variablen mit genügend Overhead einhergehen, dass jeder Versuch, dies zu tun, den Code länger macht. Vielleicht ist das ein Zeichen, dass ich nicht mit Tinte Golf spielen soll.

Sara J
quelle