Na dnie morza jest dziura

48

Podczas gdy próbowałem (i nie udawało mi się) przekonać mojego małego syna do zjedzenia obiadu, próbowałem mu śpiewać. W połowie tej piosenki zdałem sobie sprawę, że ta formuła może się dobrze przydać do gry w golfa!

Zadanie polega na napisaniu programu lub funkcji, która nie przyjmuje danych wejściowych i generuje następujący tekst:

There's a hole in the bottom of the sea
There's a hole in the bottom of the sea
There's a hole, there's a hole
There's a hole in the bottom of the sea

There's a log in the hole in the bottom of the sea
There's a log in the hole in the bottom of the sea
There's a hole, there's a hole
There's a hole in the bottom of the sea

There's a bump on the log in the hole in the bottom of the sea
There's a bump on the log in the hole in the bottom of the sea
There's a hole, there's a hole
There's a hole in the bottom of the sea

There's a frog on the bump on the log in the hole in the bottom of the sea
There's a frog on the bump on the log in the hole in the bottom of the sea
There's a hole, there's a hole
There's a hole in the bottom of the sea

There's a wart on the frog on the bump on the log in the hole in the bottom of the sea
There's a wart on the frog on the bump on the log in the hole in the bottom of the sea
There's a hole, there's a hole
There's a hole in the bottom of the sea

There's a hair on the wart on the frog on the bump on the log in the hole in the bottom of the sea
There's a hair on the wart on the frog on the bump on the log in the hole in the bottom of the sea
There's a hole, there's a hole
There's a hole in the bottom of the sea

There's a fly on the hair on the wart on the frog on the bump on the log in the hole in the bottom of the sea
There's a fly on the hair on the wart on the frog on the bump on the log in the hole in the bottom of the sea
There's a hole, there's a hole
There's a hole in the bottom of the sea

There's a flea on the fly on the hair on the wart on the frog on the bump on the log in the hole in the bottom of the sea
There's a flea on the fly on the hair on the wart on the frog on the bump on the log in the hole in the bottom of the sea
There's a hole, there's a hole
There's a hole in the bottom of the sea

There's a smile on the flea on the fly on the hair on the wart on the frog on the bump on the log in the hole in the bottom of the sea
There's a smile on the flea on the fly on the hair on the wart on the frog on the bump on the log in the hole in the bottom of the sea
There's a hole, there's a hole
There's a hole in the bottom of the sea

Zasady konkursu:

  • Tekst można wydrukować lub zwrócić jako wynik funkcji
  • Każdy werset jest oddzielony pojedynczą pustą linią
  • Końcowe białe znaki są OK, o ile nie zmieniają układu (więc nie ma wiodących białych znaków ani dodatkowych spacji między słowami)
  • Znaki końcowe również są w porządku.
  • Brak wiodących nowych linii.
  • Wszystkie języki są mile widziane, a to jest , więc wygrywa najkrótsza odpowiedź w bajtach dla każdego języka!
Sok
źródło
6
Podobne do „ Była tam stara dama” (inne podobne wyzwania, np. Zostały zamknięte jako duplikaty, choć nie sądzę, że powinny).
Jonathan Allan
6
Ho, ro, trzęsawisko, torfowisko w dolinie-o.
fəˈnɛtɪk
4
Dla porównania (choć nie język programowania) gzip -5kompresuje go do 186 bajtów ( bzip2i xzwydaje się, że gorzej).
Daniel Schepler
2
Gratulacje, od innego rodzica programisty :)
AJFaraday
1
Chcę dostosować tę piosenkę do 05AB1E ... „Jest dziura w och-pięć-ay-bee-one-ee!”
Magic Octopus Urn

Odpowiedzi:

23

SOGL , 103 94 93 bajty

Ψ ~Δ№Q‘离vζh‛←&M⁶╥7[P≈╔6≡⁸(φΔ\⅔Σ‚>≡ā⁷⁽○¹‘Ξ⁵K4s³‘⁽Bθ2n{@∑" the ”+Κ:bΚē‽:C}TPb"n@²‘+Tō, upcPøP

Wypróbuj tutaj!

...‘                 push "bottom of the sea" - kept for the loop, here for 
    ...‘             push "hole in log in bump on frog on wart on hair on fly on flea on smile on"
        ...‘         push "there's a "
            ⁽        uppercase the 1st letter of that
             B       save "There's a " in B
              θ      split the long data string on spaces
               2n    split in arrays of length 2

{                     for each of those:
 @∑                   join the current array with spaces - e.g. "hole in"
   " the ”+           append " the " to it
           Κ          prepend that to "bottom of the sea" (or whatever it is now)
            :         create a copy
             bΚ       prepend B to it - finishes current line
               ē‽:C}  if (E++), save a copy of that in C (for the last line)

TP                   print the current line twice
  b"...‘+            B + "hole" - "There's a hole"
         T           output that, keeping item
          ō,         output ", "
             up      print the kept item lowercased
               cP    print the contents of C
                 øP  print an empty line
dzaima
źródło
14
Ale .... ale jak?
SomeShinyObject
8
Niesamowite. Jak nawet--
Austin Burk
1
HNQ uderza ponownie! : \
Shaggy
4
Czy mógłbyś dodać wyjaśnienie? Ciekawe, jak to działa.
Kevin Cruijssen
@KevinCruijssen dodaje
dzaima
19

Stax , 90 87 75 bajtów

¥▌▼h4█☻■Ω1gçΔ¶Zjµ│☺X▄)/╞▄╒)¥jêLqα╧ñu┌⌂½╧ûⁿ↕O◘╔╪kl<æàbπïfuσ♪╫qΓ╪ûQ├╘Te♥Æó♣ƒE

Uruchom i debuguj

Rozpakowane, niepolowane i skomentowane to wygląda tak.

`;$w]i"50h1&V~OP>F$`            compressed literal for "There's a hole in the bottom of the sea"
X                               store in register X without popping
zG                              push an empty string and jump to the target (trailing }) 
`hfUiVx}.|j~vG12])Bxk?v zF`j    split "log bump frog wart hair fly flea smile" into array of words
F                               for each word, execute the following
  i. o. i?                      (i ? " o" : " i") where i is the 0-based iteration index
  +                             concatenate to the word
  `_o9!`+                       concatenate "n the "
  G                             jump to target below, resume next foreach iteration when finished
}                               this is the target of `G`, execution resumes when finished
  As|@                          insert substring at position 10
  QQ                            peek and print with newlines twice
  x14(                          trim string to leftmost 14 characters
  q                             peek and print without newlines
  ., p                          print ", " without newline
  vP                            lowercase 14 characters and print with newline
  xP                            push value of register X, then print with newline
  zP                            print blank line

Uruchom ten

rekurencyjny
źródło
2
Czy mógłbyś dodać wyjaśnienie? Ciekawe, jak to działa.
Kevin Cruijssen
Będę, ale nadal mam wrażenie, że zupełnie inne podejście da radę. Po tym, jak mi się uda lub nie, wyjaśnię ci, co pozostało.
rekurencyjny
1
@KevinCruijssen: Miałem wrażenie, że istnieje znacznie lepsze podejście. Rzeczywiście, całkowicie go przepisałem i zapisałem kolejne 12 bajtów wzdęcia. Dodałem również wyjaśnienie.
rekurencyjny
16

Perl 5, 158 154 bajtów

$_="There's a bottom of the sea
";for$,(<{{hole,log}" i",{bump,frog,wart,hair,fly,flea,smile}" o"}>){s/a/a $,n the/;say$_.$_.($t||=s/.{14}/$&, \l$&
$&/r)}

154 bajty

158 bajtów

Nahuel Fouilleul
źródło
5
There's a bottom of the sea. Fakty sprawdź, +1
Jo King
:), jest też ta odmiana, zaczynająca się od, There's a seaale jest dłuższa
Nahuel Fouilleul
13

Python 2 , 202 190 187 185 183 182 181 bajtów

s="bottom of the sea\n"
a="There's a "
for w in'hole log bump frog wart hair fly flea smile'.split():s=w+" %sn the "%'io'['g'in s]+s;print(a+s)*2+a+"hole, t%shole\n"%a[1:]+a+s[-30:]

Wypróbuj online!

Stare alternatywy dla 'io'['g'in s](13 bajtów):

  • 14: 'oi'[s[5]<'n']
  • 15: 'io'[len(s)>30], 'ioo'[len(s)%3], 'ooi'[len(s)%4], i'io'[w[1]=='o']

Zapisano:

  • -1 bajt, dzięki Jonathan Allan
  • -1 bajt, dzięki Rod
  • -1 bajt, dzięki Erik the Outgolfer
TFeld
źródło
"hole, t%shole\n"%a[1:]zapisuje bajt
Jonathan Allan
Możesz zaoszczędzić bajt , upuszczając zamek błyskawiczny
Rod
@JonathanAllan Thanks :)
TFeld
@Rod Thanks, :-)
TFeld
'oi'[s[5]<'n']będzie również starą alternatywą: gościnnie 'io'['g'in s]!
Erik the Outgolfer
13

C (gcc) , 261 246 236 bajtów

#define X" on the "
char*a="smile"X"flea"X"fly"X"hair"X"wart"X"frog"X"bump"X"log in the hole in the bottom of the sea\n";f(i){for(i=0;i<9;)printf("T%s%sT%1$s%2$sT%1$shole, t%1$shole\nT%1$s%3$s\n","here's a ",a+"_TH<0$\31\r"[i++],a+95);}

-15 bajtów, dzięki Daniel Schepler
-10 bajtów, dzięki pułapkowi cat

Wypróbuj online!

Giacomo Garabello
źródło
2
Czy możesz ,*b="_TH<0$\31\r"zamiast tego napisać ?
Daniel Schepler
Czy zapisałby jakieś bajty do zdefiniowania „w”?
OldBunny2800
@ OldBunny2800 nie, byłoby dłużej ! w tym przypadku potrzebujesz co najmniej 6 wystąpień, aby były skuteczne ...
Giacomo Garabello
12

05AB1E , 103 100 99 97 96 93 92 bajty

Oszczędność bajtu dzięki Kevinowi Cruijssenowi

“¥ÊˆŽ bumpÑå‡îtíÁ¤†îÌea¹²“#v’T€Î's a ’s„oiN2‹èy“ÿ ÿn€€ ÿ“©“—耂€€í™“JDN_iDU}X14£Dl‚„, ýXõ»,®

Wypróbuj online!

Wyjaśnienie

“¥ÊˆŽ bumpÑå‡îtíÁ¤†îÌea¹²“#vuruchamia pętlę na liście ["hole", "log", "bump", "frog", "wart", "hair", "fly", "flea", "smile"]. Słowa są kompresowane przy użyciu słownika 05AB1E.

Na każdym z nich wykonujemy:

’T€Î's a ’    # push the string "There's a "
s             # move the string from the previous iteration to the top of the stack
              # will be an empty string the first iteration since there is no input
„oiN2‹è       # push "i" for the first 2 iterations and "o" otherwise
y             # push the current word
“ÿ ÿn€€ ÿ“    # use interpolacing to create the meat of the current iteration string
              # meaning "hole in the ", "log in the hole in the " and so on
©             # store a copy in the register for the next iteration
“—耂€€í™“    # push the string "bottom of the sea"
JD            # join the whole line together and duplicate it
N_iDU}        # if this is the first iteration, store a copy of the line in X
X14£          # push the first 14 chars of X, which is "There's a hole"
Dl            # make a lower-case copy
‚„, ý         # join the original with the lowercase copy on ", ", forming line 3
X             # push X which is line 4
õ             # push and empty string, to create the line break between sections
»,            # join the whole section on newlines and print
®             # push the register for the next iteration
Emigna
źródło
2
Możesz usunąć wiodące õ, ponieważ najwyraźniej domyślnie wyświetla pusty ciąg, gdy sużywany jest wap bez stosu na stosie . Nie mogłem znaleźć nic innego do gry w golfa; bardzo ładna odpowiedź!
Kevin Cruijssen
1
@KevinCruijssen: O tak, nie zastanawiałem się nad tym, ponieważ zwykle jest to wkład. Dzięki :)
Emigna
11

PowerShell , 194 188 185 180 174 bajtów

$z=$a="in the bottom of the sea"
$b="here's a"
$h="$b hole"
echo hole log bump frog wart hair fly flea smile|%{,"T$b $_ $a"*2
$a='oi'[!$j++]+"n the $_ $a"
"T$h, t$h
T$h $z
"}

Wypróbuj online!

Wydaje się, że nie można złapać Pythona ...

Zasadniczo ustawia kilka wspólnych ciągi $h, $a, $z, i $b, a następnie przechodzi pętlą przez każdy z elementów ( hole, log... flea, smile), każda iteracja wyprowadzania odpowiedni werset. W !$j++środku jest trochę logiki, aby wyjaśnić, co się dzieje z przełącznikiem in/ on. W przeciwnym razie wszystkie ciągi zostaną po prostu w potoku, a ustawienie domyślne Write-Outputdaje nam nowe wiersze za darmo.

-6 bajtów dzięki Arnauldowi.
-3 bajty dzięki mazzy.
-5 bajtów dzięki Veskah.
-6 bajtów dzięki mazzy.

AdmBorkBork
źródło
-3 bajty :) Wypróbuj online!
mazzy
@mazzy To sprytna sztuczka. Muszę o tym pamiętać, ponieważ -splitdość często używam słów.
AdmBorkBork
180 bajtów
Veskah
1
174. Wypróbuj online!
mazzy
9

JavaScript (ES6),  201 194 189 188  187 bajtów

Zaoszczędzono 1 bajt dzięki @Shaggy

_=>`14log4bump5frog5wart5hair5fly5flea5smile5`.replace(/.+?\d/g,w=>`T0${(p=w+3+p)+p}1, t01
T01432
`.replace(/\d/g,n=>`here's a |hole|bottom of the sea
|n the | i| o`.split`|`[n]),p=`2T0`)

Wypróbuj online!


JavaScript (ES6), 235 bajtów

Po prostu RegPack'ed .

_=>[..."Z[]^_$cdjkqvxz{}~"].reduce((p,c)=>(l=p.split(c)).join(l.pop()),`Tj{{}qq}$$}~~}dd}__}xx}cc}[[v~ frogz$}v
Z{kZz on^x flyz_v], tj]Zkq log in^{k] in^ bottom of^ seajhere's ad wartz~c fleazx$ bumpzq_ hairzd^ the] hole[ smilezcZ
Tj`)

Wypróbuj online!

Arnauld
źródło
8

Bash, 168 160 bajtów

r="There's a bottom of the sea
";for i in {hole,log}\ in {bump,frog,wart,hair,fly,flea,smile}\ on;{
r=${r/a/a $i the};t=${r:0:14};echo "$r$r${u=$t, ${t,}
$r}";}

160 bajtów

168 bajtów

Przetłumaczone z mojej innej odpowiedzi w Perlu.

Nahuel Fouilleul
źródło
7

Japt -Rx, 126 116 113 112 111 109 107 bajtów

Okazuje się, że gra w golfa wyzwaniem kompresji struny podczas gdy w telefonie jest pijak, jest niezwykle trudna - kto by pomyślał ?!

`T's»dâ ÈÞ­omºfdÈ a`rdS
tE8
¯E
`logn¿mpnfgnØnirnf§nf¤Úè`qÍË2ÆiAV¯E©8 iF¯E ÔqVri'oÃpW+v iSi,)UPÃc

Sprawdź to

                                              :The first 3 lines get assigned to variables U, V & W, respectively
`...`                                         :The compressed string "There'sdadholedindthedbottomdofdthedsea"
     rdS                                      :Replace all "d"s with spaces
tE8                                           :Substring of U from 0-based index 14 (E), of length 8 (="  in the ")
¯E                                            :Slice U to index 14 (="There's a hole")
`...`                                         :The compressed string "lognbumpnfrognwartnhairnflynfleasmilent"
     qÍ                                       :Split on "n" (note that the last element is irrelevant)
       Ë                                      :Map each element at 0-based index E in array F
        2Æ                                    :  Map the range [0,2)
          iA                                  :    Insert the following in U at index 10
            V¯                                :      V sliced to index
              E©8                             :        Logical AND of E and 8 (=0 on first iteration, 8 on all others)
                  i                           :      Prepend
                   F¯E                        :        Slice F to index E
                       Ô                      :        Reverse
                        q                     :        Join with
                         Vri'o                :          Replace "i" with "o" in V
                              Ã               :  End map
                               p              :  Push
                                W+            :    W appended with
                                  v           :      W lowercased
                                    iSi,      :      Prepended with a space prepended with a comma
                                        )     :    End append
                                         UP   :    U and an empty string
                                           Ã  :End map
                                            c :Flatten
                                              :Implicitly join with newlines, trim & output
Kudłaty
źródło
7

XML, 719 673 603 514 493 486 bajtów

<!DOCTYPE a[<!ENTITY T "There's a"><!ENTITY O " on the"><!ENTITY a " hole in the bottom of the sea
"><!ENTITY b " log in the&a;"><!ENTITY c " bump&O;&b;"><!ENTITY d " frog&O;&c;"><!ENTITY e " wart&O;&d;"><!ENTITY f " hair&O;&e;"><!ENTITY g " fly&O;&f;"><!ENTITY i " flea&O;&g;"><!ENTITY z "&T; hole, there's a hole
&T;&a;
">]><a>&T;&a;&T;&a;&z;&T;&b;&T;&b;&z;&T;&c;&T;&c;&z;&T;&d;&T;&d;&z;&T;&e;&T;&e;&z;&T;&f;&T;&f;&z;&T;&g;&T;&g;&z;&T;&i;&T;&i;&z;&T; smile&O;&i;&T; smile&O;&i;&z;</a>

Możesz go „wykonać” za pomocą xmlstarlet sel -t -m '//a' -v . -n <xml_file_here>.

Byłoby to o wiele łatwiejsze, gdyby XML nie był tak szczegółowy, ale z drugiej strony jest to mniej niż 25% wielkości oryginalnego tekstu.

Wołowina
źródło
5

Siatkówka 0.8.2 , 150 bajtów


THsmile oNflea oNfly oNhair oNwart oNfrog oNbump oNlog iNE
N
$&$'¶TH
O^$`

.+
$&¶$&¶THW, tHW¶THE¶
H
here's a 
E
W iNbottom of the sea
W
hole
N
n the 

Wypróbuj online! Wyjaśnienie:


THsmile oNflea oNfly oNhair oNwart oNfrog oNbump oNlog iNE

Wstaw ostatni wiersz.

N
$&$'¶TH

Oblicz wszystkie wersety.

O^$`

Ułóż wiersze we właściwej kolejności.

.+
$&¶$&¶THW, tHW¶THE¶

Uzupełnij każdy wiersz i dodaj refren.

H
here's a 
E
W iNbottom of the sea
W
hole
N
n the 

Rozwiń niektóre symbole zastępcze.

Neil
źródło
5

R , 237 231 bajtów

i=" in the "
for(j in 0:8)cat(f<-c(t<-"There's a ",paste(c("log","bump","frog","wart","hair","fly","flea","smile")[j:0],collapse=" on the "),if(j)i,h<-"hole",i,b<-"bottom of the sea
"),f,t,h,", there's a ",h,"
",t,h,i,b,"
",sep="")

Wypróbuj online!

Kirill L.
źródło
5

PHP, 180 178 bajtów

foreach([hole,log,bump,frog,wart,hair,fly,flea,smile]as$w)echo$a=T.($b="here's a ").($s="$w ".io[++$i>2]."n the $s").$c="bottom of the sea
",$a,T,$b.=hole,", t$b
T$b in the $c
";

Uruchom -nrlub wypróbuj online .

Daje ostrzeżenia w PHP 7.2; Aby to naprawić, umieścić w cudzysłowie
elementów tablicy io, holea dwa samodzielne T.

Tytus
źródło
4

C (gcc) , 334 328 307 299 bajtów

char*s="here's a \0smile on the flea on the fly on the hair on the wart on the frog on the bump on the log in the hole in the bottom of the sea\n";i;k=105;a[]={0,1,1,1,1,0,1,2,2};main(j){for(;i<9;k-=11+a[i++])do{printf("T%s%s",s,s+k);}while(j++&1||!printf("T%shole, t%shole\nT%s%s\n",s,s,s,s+105));}

Wypróbuj online!

cleblanc
źródło
265 bajtów
pułap pułapu
4

Perl 6 , 166 bajtów

($/=@(($!="There's a")X [\R,](<hole log bump frog wart hair fly flea smile>Z(<i o>[$++>1]~"n the")xx*)X"bottom of the sea
")).map:{say "$_$_$! hole, {$!.lc} hole
$0"}

Wypróbuj online!

Jo King
źródło
4

Japt -R , 142 bajty

`—¤clogc¿mpcfžgcØÖŽrcf§cf¤acsÚè`qc
`ˆ e Þ­om  e  a`
`T”œ's a `
£W+U¯YÄ ÔËE?"io"gE<Y +`n e `:P +Dø+` {V}
` ²+W+`—¤, t”œ's a —¤
{W}—¤ {V+R

Wypróbuj online!

Oliver
źródło
4

Partia, 267 bajtów

@echo off
set r=i
set t= There's a hole
set s=bottom of the sea
for %%w in (hole log bump frog wart hair fly flea smile)do call:c %%w
exit/b
:c
set s=%1 %r%n the %s%
echo%t:~,11%%s%
echo%t:~,11%%s%
echo%t%,%t:T=t%
echo%t%%s:~-25%
echo(
if %1==log set r=o

tzawiera ciąg powtórzony w refrenie, szawiera większość wiersza wiersza, a jednocześnie rwybiera pomiędzy in thei on the. We wersetach tpotrzeba tylko pierwszych 11 znaków , podczas gdy w pierwszej linii refrenu druga kopia tma Tmałą literę, a druga linia refrenu używa ostatnich 25 znaków s.

Neil
źródło
4

Rubinowy , 173 170 bajtów

a="T#{["here's a hole"]*3*"%s"%[", t","
T"]+c=" in the "}bottom of the sea

"
b=a[31,39]
%w{log bump frog wart hair fly flea smile x}.map{|i|puts b,b,a;b[9]+=i+c;c[1]=?o}

Wypróbuj online!

Level River St
źródło
4

Haskell , 243 215 bajtów

Zmniejszony do 215 bajtów z wielką pomocą nich

c[[l n,l n,'T'#h++", "++'t'#h,l 8,""]|n<-[8,7..0]]
t#u=t:"here's a "++u
h="hole"
c=concat
l n='T'#c(drop n$map(++" on the ")(words"smile flea fly hair wart frog bump")++["log in the ",h," in the bottom of the sea"])

Wypróbuj online!

(Stara wersja 243 bajtów jest tutaj ).

Całkiem proste rozwiązanie.

-- main function producing a list of lines
v = concat [[
    l n,
    l n, -- second line of each verse equals to its first line
    'T' # h ++ ", " ++ 't' # h,
    l 8, -- last line of each verse is the same in all verses
    ""
  ] | n <- [8,7..0]]

-- a small helper to construct similar strings 
t # u = t : "here's a " ++ u

h = "hole"

-- construct a first line of n-th verse (with n = 8 is the first and n = 0 is the last one)
-- Every such line begins with a constant prefix followed by expanding list of nested entities
l n = 'T' # concat (
      drop n $
         map (++ " on the ") (words "smile flea fly hair wart frog bump")
         ++ ["log in the ", h, " in the bottom of the sea"]
    )
Max Yekhlakov
źródło
1
Kilka wskazówek: a) używasz stylko raz, więc możesz to wstawić. b) zawsze poprzedzić i dołączyć coś t, dzięki czemu można zrobić to funkcja (infix) t#u=t:"here's a "++u. c) budowy dużego listę w funkcji lze map(++" on the ")(words"smile flea ..."jest krótszy. Ponadto: przenieś wszystko dołączone do tej listy do samej listy. d) lista liczb do upuszczenia biegnie teraz od 8zera do 0(liczby jednocyfrowe!) e) teraz wstawianie irównież zapisuje niektóre bajty. f) nie trzeba podawać nazwy głównej funkcji. Zgodnie z naszą metą wartości Haskella są uważane za prawidłowe funkcje, więc upuść v=.
nimi
... W sumie 215 bajtów Wypróbuj online!
nimi
1
Kolejne 3 bajty do zapisania: zamiast zrozumienia listy można użyć >>=(concatMap) z listy monada i concatfunkcji inline l. Wypróbuj online!
nimi
3

JavaScript (węzeł Babel) , 239 bajtów

-7 bajtów od @Oliver *.*

(x=0,r='hole0log0bump0frog0wart0hair0fly0flea0smile'.split`0`).map(a=>(t=(i="There's a ")+a+r.slice(0,x++).reverse().map((h,_)=>` ${"io"[_<x-2|0]}n the ${h}`).join``+(o=` in the bottom of the sea
`))+t+(`${k=i+"hole"}, ${k}
`)+k+o).join`
`

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
1
Drugi Tw trzeciej linii każdego wersetu powinien być pisany małymi literami.
Kudłaty
3

Python 3 , 213 206 198 193 bajtów

k='n the ';o=e='bottom of the sea\n';b="There's a ";h='hole'
for j in[h]+'log bump frog wart hair fly smile'.split():o=j+' '+'io'['g'in o]+k+o;print(b+o+b+o+b+h+', t'+b[1:]+h+'\n'+b+h+' i'+k+e)

Wypróbuj online!


-15 bajtów dzięki @Sara
-5 bajtów dzięki @ ASCII-only

Prawdopodobnie trochę bardziej golfowy, ale niewiele.

Artemis Fowl
źródło
198 bajtów
Sara J
@SaraJ Thanks. Miałem wrażenie (wyraźnie pomylone), które o=e=wywarłoby oba oi edotyczyłoby tego samego przedmiotu. Myślałem również, że podział będzie dłuższy.
Artemis Fowl
@ArtemisFowl oi e nie odnoszą się do tego samego obiektu ... tylko że ciągi są niezmienne w Pythonie tak rzeczy, jak +=utworzy nową kopię zamiast mutacji istniejącego
ASCII-tylko
193
tylko ASCII
@ Tylko ASCII, wiem, ale pomyślałem, że python w jakiś sposób upewnił się, że nadal odnoszą się do tego samego obiektu.
Artemis Ptactwo
2

Czysty , 267 bajtów

import StdEnv,Text,Data.List
t="here's a "
h="hole"
b=" in the bottom of the sea"
f=foldr((+)o\s#p="T"+t+join" on the "(reverse s)+" in the "+h+b
=join"\n"[p,p,"T"+t+h+", t"+t+h+"\nT"+t+h+b+"\n\n"])""(tl(inits["log","bump","frog","wart","hair","fly","flea","smile"]))

Wypróbuj online!

Obrzydliwe
źródło
2

cQuents , 238 219 bajtów

|@
#36::"T"~c1)~j\rbk));@ )~c2,Z,"T"~c1)~"hole, t"~c1)~"hole","T"~c1)~c2)~@

::"","log in the","bump"~c3,"frog"~c3,"wart"~c3,"hair"~c3,"fly"~c3,"flea"~c3,"smile"~c3
:"here's a ","hole in the bottom of the sea"," on the"

Wypróbuj online!

To wyzwanie sprawiło, że w końcu wdrożyłem listy i ciągi znaków w moim języku. Ten język jest zbudowany dla sekwencji całkowitych, więc całkiem nieźle!

Wyjaśnienie

:"here's a ","hole in the bottom of the sea"," on the"

    helper line: c1), c2), and c3) access the three terms in this list

::"","log in the","bump"~c3,"frog"~c3,"wart"~c3,"hair"~c3,"fly"~c3,"flea"~c3,"smile"~c3

    helper line: yields a list containing the first n terms in it, accessed with bx)
    for example, the first three terms are:

"","log in the","bump"~c3

    so b3) would yield ["","log in the","bump on the"] (~ is concatenation and c3 is " on the")


|@
#36::"T"~c1)~j\rbk));@ )~c2,Z,"T"~c1)~"hole, t"~c1)~"hole","T"~c1)~c2)~@


|@
                              join sequence on literal newline
#36::                         output first 36 terms in sequence joined together
                              following are the 4 terms in the sequence, which will cycle through 9 times (for a total of 36 terms)
"T"~c1)~j\rbk));@ )~c2,       first term
"T"~c1)~                      "T" concat "here's a " concat
        j\rbk));@ )           the first k terms of b, reversed, and joined on " "
                   ~c2,       concat "hole in the bottom of the sea"
Z,                            second term - same as previous
"T"~c1)~"hole, t"~c1)~"hole", third term
"T"~c1)~                      "T" concat "here's a " concat
        "hole, t"~c1)~"hole", "hole, t" concat "here's a " concat "hole"
"T"~c1)~c2)~@
                              fourth term - "T" concat "here's a " concat "hole on the bottom of the sea" concat newline
Stephen
źródło
2

Perl 5 , 194 bajtów

@ Tylko ASCII ogolił 6 bajtów dosłownie znakami nowej linii i \lsztuczką, o której zapomniałem

$"=" on the ";say+($b=($e="There's a ").hole,$c=" in the bottom of the sea",$/)x2,$.="$b, \l$b
$b$c
";say"$e@a[-$_..-1] in the hole$c
"x2,$.for 1..(@a=qw/smile flea fly hair wart frog bump log/)

Wypróbuj online!

Xcali
źródło
194?
Tylko ASCII,
Tak. Dobra robota. Na pewno powinienem był pamiętać nowe linie. Widziałem \lwcześniej, ale nigdy nie miałem powodu, aby z niego korzystać, więc nigdy o tym nie myślałem.
Xcali
190?
Tylko ASCII
bliżej
tylko ASCII
2

Węgiel drzewny , 115 106 bajtów

≔There's a holeθEE⁹⁺…θχ⪫⮌…⪪”↶±∧⟲!↶⁼,(_⎇RB↧ω⪪zθⅉQθ`✳&⬤⸿◧σ⁻y▷»ΣK▶↙⁻υX`SξQ6 /ι⁹Wq”x⁺²ιn the ⟦ιι⁺⁺θ, ↧θ⁺θ✂ι±²⁵

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisałem 9 bajtów, kopiując mój kod partii dla ostatniego wiersza refrenu. Wyjaśnienie:

≔There's a holeθ

Zapisz ciąg There's a hole, który jest używany dwa razy tak, jak jest, trzeci raz małymi literami, a także czwarty raz, ale tylko pierwsze 10 znaków.

⪪”↶±∧⟲!↶⁼,(_⎇RB↧ω⪪zθⅉQθ`✳&⬤⸿◧σ⁻y▷»ΣK▶↙⁻υX`SξQ6 /ι⁹Wq”x

Podziel ciąg bottom of the seaxhole ixlog ixbump oxfrog oxwart oxhair oxfly oxflea oxsmile ona xs.

E⁹⁺…θχ⪫⮌…...⁺²ιn the 

Zapętlaj 9 wierszy, biorąc pierwsze i+2elementy tablicy, odwracając je, łącząc je n thei poprzedzając There's awynikiem.

E...⟦ιι⁺⁺θ, ↧θ⁺θ✂ι±²⁵

Rozwiń każdą linię na wiersz, powielając ją i konstruując refren. Każdy wiersz wersetu jest następnie domyślnie drukowany na każdej własnej linii, a każdy wiersz jest domyślnie oddzielony pustą linią.

Neil
źródło
2

V , 184 170 bajtów

4iThere's a hole in the bottom of the sea
kky5w5eá,lpD5brtHj4yyGp4w8ion the 2briilog 3bibump 3bifrog 3biwart 3bihair 3bifly 3biflea 3bismile 7ñ4yykp4wd3wñ8ñÄ5jñ

Wypróbuj online!

Wyjaśnienie:

  • 4iThere's a hole in the bottom of the sea<\n><esc> Wstaw „Tam” dziurę w dnie morza 4 razy.
  • kk Przejdź do trzeciej linii
  • y5w skopiuj „Jest dziura”
  • 5eá, wstaw przecinek po „Jest dziura”
  • lp wklej po przecinku
  • D usuń resztę wiersza
  • 5brt mała litera druga T.
  • Hj4yy skopiuj 4 linie z drugiej linii
  • Gp Wklej wszystko po pierwszej linii
  • 4w8ion the <esc>(na końcu pierwszego wiersza) przejdź do pierwszej „dziury” w drugim wierszu i wstaw „” na „8 razy”
  • 2briilog <esc> przejdź do ostatniego „on”, zamień o na i, a następnie wstaw „log”
  • 3bibump <esc>3bifrog <esc>3biwart <esc>3bihair <esc>3bifly <esc>3biflea <esc>3bismile <esc> Przejdź do tyłu przez linię, wstawiając odpowiednie słowa między każdym „na”
  • 7ñ4yykp4wd3wñwykonać 4yykp4wd3w7 razy
    • 4yykp zduplikuj werset przed tym
    • 4wd3w przejdź do pierwszego słowa po „Jest dziura” i usuń 3 słowa
  • 8ñÄ5jñ zduplikuj pierwszy wiersz każdego wersetu po pierwszym (jest ich 8 do zrobienia)
Wołowina
źródło
2

/// , 216 bajtów

/V/\/\///U/\/ VS/TCVR/iBVQUtheVPUoBVOUholeVN/RASVM/ASO, tCO
SA
VL/RMSVKUlog VJUbumpPKVIUfrogPJVHUwartPIVGUhairPHVFUflyPGVEUfleaPFVDUsmilePEVC/here's aVB/nQVA/O R bottom ofQ sea
/SASMSKNKLJNJLINILHNHLGNGLFNFLENELDNDRM

Wypróbuj online!

Tego rodzaju zadanie jest jedyną rzeczą, w której /// jest dość dobry. : D Hej, wynik jest krótszy niż C, C # lub Java!

Dane wyjściowe z tego programu kończą się dwoma podziałami linii końcowej; mam nadzieję, że to nie jest przełom.

W każdym razie nie ma tu żadnej sprytności. Po prostu zidentyfikowałem powtarzające się ciągi i zdefiniowałem dla nich jednoznakowe skróty i powtarzałem, dopóki nie zobaczyłem więcej powtarzających się ciągów. Zrobiłem to w sposób mniej lub bardziej naiwny i chciwy. Celowo zdefiniowałem jednak skrót „uśmiech na pchły na ... morzu”, a następnie „pchła w locie na ... morzu” i tak dalej, aby utworzyć łańcuch skrótów . Rezultat jest taki, że cała sekwencja nowych rzeczowników jest wyraźnie widoczna w kodzie i uważam to za całkiem przyjemne. :)

Po zastąpieniu V i U mamy następujący, bardziej czytelny kod:

/S/TC//R/iB//Q/ the//P/ oB//O/ hole//N/RAS//M/ASO, tCO
SA
//L/RMS//K/ log //J/ bumpPK//I/ frogPJ//H/ wartPI//G/ hairPH//F/ flyPG//E/ fleaPF//D/ smilePE//C/here's a//B/nQ//A/O R bottom ofQ sea
/SASMSKNKLJNJLINILHNHLGNGLFNFLENELDNDRM
Tanner Swett
źródło
2

LaTeX, 265 268 znaków

\documentclass{book}\input{pgffor}\def\i{bottom of the sea}\let~\i\def\b{here's a }\def\h{hole}\def\s#1{ in}\begin{document}\foreach\x in{\h\s,log\s,bump,frog,wart,hair,fly,flea,smile}{\xdef~{\x{ on} the ~}T\b~\\T\b~\\T\b\h, t\b\h\\T\b\h\,in the \i\par}\enddocument

kompiluje się w fajny plik PDF z wcięciami akapitów i wszystkim innym.

Nie golfił i skomentował:

\documentclass{book}
\input{pgffor}
\def\i{bottom of the sea}   %for re-use in the last two verses 
\let~\i                     %here I keep attaching words
\def\b{here's a }               
\def\h{hole}
\def\s#1{ in}               %this replaces the next token with "in", useful for log and hole where "in" is used instead of"on"
\begin{document}
\foreach\x in{\h\s,log\s,bump,frog,wart,hair,fly,flea,smile}{
    \xdef~{\x{ on} the ~}   %keep attaching words and on/on to ~
    T\b~\\                  %verse 1
    T\b~\\                  %verse 2
    T\b\h, t\b\h\\          %verse 3
    T\b\h\,in the \i\par    %verse 4
}
\enddocument

Produkcji:

wprowadź opis zdjęcia tutaj

sheß
źródło
2

C # (interaktywny kompilator Visual C #) , 220 bajtów

string b="There's a ",d="hole in the bottom of the sea\n",e,f;" log bump frog wart hair fly flea smile".Split().Any(s=>Write((e=b+(f=s!=""?s+(f!=""?" o":" i")+"n the "+f:s)+d)+e+b+$@"hole, there's a hole
{b+d}
")is int);

Wypróbuj online!

-5 bajtów dzięki @ASCIIOnly i -2 bajtów dzięki @someone!

Mam małe dziecko i zapewniam, że ta piosenka jest w równym stopniu chwytliwa i denerwująca.

dana
źródło
1
Przykro mi, że przypomniałem, że istnieje: o)
Sok
.Any()-> !=""?
Tylko ASCII
również 223
tylko ASCII
i nie trzeba przestrzeń po inwforeach > _>
ASCII tylko
@ASCIIOnly - Dzięki za wskazówki :)
dana