Anatra, anatra, via!


40

Ecco la canzone (abbastanza spaventosa) dei Five little Ducks (non è lunga):

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.

Il tuo compito non è quello di produrre questo brano. Dovresti prendere un verso e produrre il verso successivo (il verso successivo dell'ultimo verso è il primo verso).

Regole

  • Nessuna scappatoia standard, per favore.
  • L'input / output sarà preso tramite i nostri metodi standard input / output.
  • Il verso esatto deve essere emesso e non dovrebbero esserci differenze rispetto al testo della canzone. L'ingresso non sarà diverso se confrontato anche con il testo della canzone.

Esempi

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.

Previsto:

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.

Previsto:

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.

22
Ricordo le parole per essere leggermente diverso quando ero giovane, molte lune fa. Ma ricordo anche di esserne stato traumatizzato! Dov'erano quegli anatroccoli scomparsi per tutti quei giorni ?! Perché nessuno li stava cercando ?! E che tipo di madre irresponsabile riesce a perdere così tanti bambini e continua a far giocare il resto di loro ?! L'orrore!
Shaggy,


7
Mi hai appena pietrificato.
A̲̲

2
Il testo di quella canzone mi ha sicuramente fatto attraversare un ottovolante di emozioni.
Blocco numerico

3
Qual è il motivo per cui la maiuscola in "Anatra madre" e "Anatra madre" è diversa nei 2 posti in cui è usata nell'ultimo verso?
Rilassati il

Risposte:


3

Stax , 115 111 byte

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

Esegui ed esegui il debug

Tutti i versi come casi di test


1
Quando lo esegui con "Una piccola papera", risponde "La piccola papera e la piccola papera delle piccole papere sono tornate". nell'ultima riga.
Dorian

1
Il bug è stato corretto senza alcun costo in termini di dimensioni. In realtà si trattava di un costo di 2 byte e di compensare i risparmi di 2 byte altrove, anche se i byte sono un po 'difficili da misurare qui, poiché le modifiche non sono esattamente allineate ai byte all'interno dei letterali di stringhe compresse, o anche nel programma finale.
ricorsivo il

19

JavaScript (ES9), 227 byte

Questo è simile alla versione del nodo seguente ma utilizza una formula basata parseInt()invece di Buffer()identificare il versetto di input.

Questo è ES2018 (aka ES9) perché stiamo usando un'espressione regolare con il /sflag ( dotAll ).

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)

Provalo online!

Come?

In questa versione, analizziamo l'intero versetto di input come base 30 ( 0to t) ed eseguiamo un AND bit a bit con 7. L'analisi si interrompe sul primo carattere non valido, portando a:

 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

Salvato 2 byte grazie a @Shaggy

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)

Provalo online!

Come?

Il terzo carattere di ciascun verso di input può essere usato come identificatore univoco. Prendendo il suo codice ASCII modulo 9, otteniamo:

 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

I versetti di output sono codificati con i seguenti modelli:

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

Dove ogni cifra è sostituita da una stringa secondo la seguente tabella:

 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 '

Dove l'espressione regolare / w.*\n/sestrae questa parte comune dall'input:

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

Aggiungiamo infine gli ultimi 11 caratteri dell'input, ovvero " came back.".



1
@Shaggy Ben fatto. Grazie!
Arnauld,

2
Stavo solo postando un altro commento da suggerire execquando la pagina è stata ricaricata. Grandi menti ... !
Shaggy,

11

Python 3 , 267 263 254 byte

4 byte salvati grazie a @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(':')

Provalo online!

Funziona sostituendo le parti pertinenti con le rispettive parti del verso successivo.

Dopo la preinizializzazione, Tè ['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'].

Python 2 alternativo , 252 byte

di @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(':')

Provalo online!


for a in zip(T,T[-2:]+T):s=s.replace(*a)per 264 byte.
Ovs

O lambda s:reduce(lambda s,a:s.replace(*a),zip(T,T[-2:]+T),s)per 262 byte in Python 2.
Ovs

@ovs Grazie, l'ho portato a 263 con il reodering di alcune cose e usando T[2:]invece diT[-2:]
Black Owl Kai

9

QuadR , 257 242 byte

-14 grazie a Black Owl Kai, -1 grazie a 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

Provalo online!




7

Java 10, 347 byte

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;}

Provalo online.

Spiegazione:

Sostituiamo innanzitutto tutte le parti una per una con numeri interi nell'intervallo [10,21]e quindi questi numeri interi tornano alle loro sostituzioni. La ragione per cui ciò avviene in due passaggi è che altrimenti sostituiremmo sostituzioni.

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

7

T-SQL, 407 390 388 382 byte

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(@)

L'input avviene tramite una tabella preesistente iocon VARCHAR(MAX)campov, secondo le nostre regole di IO .

Dopo un paio di byte che salvano byte REPLACE, esegue quanto segue come SQL dinamico:

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

Utilizza CASEun'istruzione e STUFFcomandi per inserire / sovrascrivere i caratteri nelle posizioni elencate.

MODIFICHE :

  1. Sostituisci l'originale (sotto) con una strategia completamente diversa
  2. Salvato due byte passando a LEFTinvece di SUBSTRINGed eliminando uno spazio
  3. Salvato 6 byte modificando la variabile in CHARe spostando una lettera aggiuntiva nella seconda REPLACE(grazie, @CDC!)

Ecco la mia prima versione, usando un metodo diverso (post-sostituzione, formattato):

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_SPLITe PARSENAMEsono usati per spezzare una stringa in righe e colonne tramite -e .separatori.

La prima colonna è un personaggio chiave che viene confrontato con la terza lettera del versetto di input (grazie per l'idea, @ Night2). Il secondo e il terzo sono i rimpiazzi eseguiti per quel verso.


Prima soluzione, se si utilizza "CHAR (700)" anziché "VARCHAR (MAX)" è possibile salvare 3 byte. Anche nella tua "piccola anatra", puoi invece fare "una piccola anatra" e rimuovere la e prima di # su ogni sostituzione per ottenere un altro 3.
CDC

A proposito, soluzione davvero divertente. Ho usato il formatmessage per avvicinarti molto a te, ma non del tutto.
CDC,

Buoni suggerimenti, @CDC, grazie!
BradC,

6

Python 2 , 1034 byte

Questo è il mio codice! Impiega un semplice dizionario. Dopo aver eseguito questo codice, puoi inserire qualsiasi verso e verrà emesso il verso successivo.

PS: sono nuovo di questo canale e questo è il mio primo post. Mi è davvero piaciuta questa sfida, quindi ho deciso di provarlo. Non esitate a correggermi.

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]]

11
Benvenuti nel sito! Di solito contiamo il dizionario come parte della fonte. Parte della sfida sarebbe cercare di renderlo il più piccolo possibile. Ci sono anche alcuni modi per accorciarlo. 1) Dato che non ottieni punti per essere leggibile, puoi usare nomi di variabili a carattere singolo (es. xO a) 2) Python è abbastanza permissivo con gli spazi bianchi, quindi proverei a rimuovere anche alcuni dei tuoi spazi bianchi. Ad esempio non hai bisogno di spazi intorno =. Infine abbiamo una pagina per giocare a golf in Python che puoi visitare per migliorare il tuo gioco.
Wheat Wizard

wow @ SriotchilismO'Zaic! è utile..grazie! :)
Prachiti Prakash Prabhu

1
Puoi facilmente giocare a golf rimuovendo gli spazi bianchi e le variabili non necessari, evitando l'importazione sysusando ad esempio raw_input(), accorciando la chiave del dizionario, ecc. Dovresti assolutamente eliminare le sezioni ripetute della canzone e aggiungerle separatamente
Jo King,

@JoKing, come ho già detto, questo è il mio primo post e non ci ho pensato molto. Volevo solo provarlo, ma ora ho un'idea. Il mio prossimo post sarà molto meglio e più breve di questo - tutto grazie a voi ragazzi ... aiutatemi! :)
Prachiti Prakash Prabhu,

6

PHP (7.4), 253 247 byte

-6 byte migliorando la modalità di creazione dell'array di sostituzioni con maggiore aiuto da "Disimballaggio all'interno di array".

<?=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]]));

Provalo online!

Questo crea una matrice di ogni possibile sostituzione (12 usate + 2 inutilizzate) in un key=>valueformato. Esempio: ['Mother duck herself' => 'Five little ducks', etc...]e quindi sostituisce quelli che usano strtr .

L'unica cosa interessante è il mio primo utilizzo di "Unpacking inside array", che è una nuova funzionalità di PHP 7.4.


PHP , 264 byte

<?=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);

Provalo online!

Ho memorizzato parole diverse di ogni verso in una matrice. Trovo quale verso l'input sta usando il terzo carattere dell'input in quanto è unico ( vuroet). Quindi sostituisco semplicemente parole diverse di quel verso con parole diverse del verso successivo.


5

Pulito , 352 byte

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

Provalo online!



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

Provalo online .

Versione più leggibile:

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

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.'

Provalo online!

Ho usato la forza bruta per trovare l'espressione +"$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

Grazie @Arnauld per il 3rd char.


2

Japt v2.0a0, 143 byte

Ho provato a codificare un singolo verso con sostituzioni ma, alla fine, adattando la soluzione di Arnauld è risultato più breve. Avere un'altra idea che, si spera, potrebbe funzionare di nuovo più breve ma non so quando proverò.

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 § `]

Provalo - include tutti i versi


2

Bash , 373 355 byte

Niente di troppo folle qui. Una semplice riduzione di pochi byte sarebbe quella di sostituire le variabili a due caratteri (a1, a2, a3, e1..e6) con variabili a carattere singolo.

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

Provalo online!

Provalo online!


2

05AB1E , 134 byte

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

Provalo online!

Dato che sono relativamente nuovo a 05AB1E, questo può forse essere giocato a golf molto

                ### 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

1

Perl 6 , 247 byte

{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)]}

Provalo online!

Sicuramente golfabile, in particolare gli ultimi 5 elementi nell'elenco nel modulo "num $l num-1", o la regex iniziale che corrisponde alle parti giuste del vecchio input.


1

Carbone di legna , 156 byte

≔⌕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§-υ”¶δ✂ε±¹¹

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

≔⌕tvuroe§θ²δ

Guarda il terzo carattere della prima riga per capire quale verso vogliamo.

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

Uscita la prima parte della prima linea da indicizzazione nella lista di stringhe Five, Four, Three, Two, One, Mother duck herself. Quindi stampare little ducke, sse del caso, seguito dagli ultimi 18 caratteri della riga di input (che sono sempre gli stessi su ciascun verso).

⸿η⸿ζ⸿

Le due linee centrali sono sempre le stesse su ogni verso.

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

Per l'ultima riga risulta essere più golfoso da includere little ducksnell'elenco delle alternative per qualche motivo, ma gli ultimi 11 caratteri vengono comunque copiati dall'input.


1

inchiostro , 353 byte

=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.

Provalo online!

In primo luogo, usi sottostringa controlli per capire cosa versi siamo in - che è abbastanza facile grazie alla capitalizzazione dei numeri alla partenza - F, Te Onon si verificano in tutti gli altri posti, e si può distinguere il secondo e il quarto versetto il primo e il terzo controllando anche per FieTh rispettivamente.

Quindi facciamo solo ciò che fa meglio l'inchiostro e stampiamo il testo in chiaro con i condizionali. All'inizio ho provato a usare le istruzioni switch, ma mentre sembrava più bello, in realtà è finito più a lungo.
Penseresti che Quacks sarebbe un buon posto per usare le variabili, ad esempio se una stringa viene ripetuta un sacco, ma le variabili hanno un overhead sufficiente che ogni modo in cui ho provato a farlo ha allungato il codice. Forse è un segno che non dovrei giocare a golf con l'inchiostro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.