Beatles'tan “Hey Jude” yazdı


27

Senin görevin The Beatles'ın şarkısı "Hey Jude" (© Sony / ATV Music Publishing LLC) 'den çıkan sözleri takip eden aşağıdaki dört ayeti basan bir program yazmaktır:

Hey Jude, don't make it bad\n
Take a sad song and make it better\n
Remember to let her into your heart\n
Then you can start to make it better\n
\n
Hey Jude, don't be afraid\n
You were made to go out and get her\n
The minute you let her under your skin\n
Then you begin to make it better\n
\n
Hey Jude, don't let me down\n
You have found her, now go and get her\n
Remember to let her into your heart\n
Then you can start to make it better\n
\n
Hey Jude, don't make it bad\n
Take a sad song and make it better\n
Remember to let her under your skin\n
Then you'll begin to make it\n
\n

FAKAT

Bu dört ayeti oluşturmak için kullanmanıza izin verilen tek girdi bu belirteçlerin listesidir:

"Hey Jude, don't"
" make it bad"
" be afraid"
" let me down"
"Take a sad song and make it better"
"You"
" were made to go out"
" and get her"
" have found her, now go"
"Remember to"
"The minute you"
" let her"
" into your heart"
" under your skin"
"Then"
" you"
" can start"
"'ll"
" begin"
" to make it"
" better"

Bazı belirteçlerin önceden boşluk bıraktığını ve ekli tırnakların belirteçlerin bir parçası olmadığını unutmayın. Liste için herhangi bir format kullanmakta ve belirteçlerin sırasını yeniden düzenlemekte özgürsünüz.

Üretilen çıktınızın yukarıdaki dört ayete tam olarak uyması gerekir. Yeni \nsatırlar için kullanıldığına ve her ayetin ardından ek bir yeni satır eklendiğine dikkat edin. Çıktınızı kontrol etmek için bu dosyayı (MD5:) kullanabilirsiniz 4551829c84a370fc5e6eb1d5c854cbec.

Ayetlerin yapısını anlamak için aşağıdaki demiryolu şemasını kullanabilirsiniz (her eleman bir jetonu temsil eder): görüntü tanımını buraya girin

Bayt cinsinden en kısa kod kazanır. Mutlu golf


47
Nah nah nah nah nah nah, nah nah nah, giden kısım sıkıştırmak daha kolay olurdu. ^^
Arnauld

3
@Arnauld İlgili : P
DJMcMayhem

10
@Arnauld zorunlu XKCD xkcd.com/851_make_it_better
Nathaniel

3
Her satırın sonunda tüm bu ters eğik çizgileri söylemek zor olmalı.
Tamás Sengel

Yanıtlar:


9

Jöle , 42 bayt

;⁷“Ṙç€ṘḋḷŒø|Ṁ2kḤ⁽⁼SƁẒVṿẎj]ð⁵ṀƒƤ)÷Ƒ¦Ẋ½Iɠ⁻’ṃ

Çevrimiçi deneyin!

Sabit kod versiyonu.

Giriş:

["Hey Jude, don't", ' make it bad', 'Take a sad song and make it better', 'Remember to', ' let her', ' into your heart', 'Then', ' you', ' can start', ' to make it', ' better', ' be afraid', 'You', ' were made to go out', ' and get her', 'The minute you', ' under your skin', ' begin', ' let me down', ' have found her, now go', "'ll"]

17

JavaScript (ES6), 108 bayt

a=>`01
4
9bc
efgjk

02
567
abd
efijk

03
587
9bc
efgjk

01
4
9bd
efhij

`.replace(/./g,n=>a[parseInt(n,36)])

Çevrimiçi deneyin!


Alternatif sürüm, 114 bayt

Biraz daha iyi bir sıkıştırma, ancak ne yazık ki daha büyük dekompresyon kodu ile harap.

a=>`835fc3cbbd3
84db3db4bbdb3
85cd1cc3cbbd3
835fc4bbcb3

`.replace(/./g,n=>a[n='0x'+n,i=n%8&&n%8-2+i]+[`
`[n>>3]])

Çevrimiçi deneyin!


mBayrağın çok satırlı şablon değişmezleri için gerekli olmadığını bilmiyordum . İlginç.
Grant Miller

7

Ruby + -p, 177 136 120 118 115 109 bayt (tam program)

$_="abvevjlmvopqtuvvacvfghvklnvopstuvvadvfihvjlmvopqtuvvabvevjlnvoprstv".gsub(/./){|c|(eval$_)[c.ord-97]||$/}

Çevrimiçi deneyin!

-41 bytes: Değişkenleri kullanmaktan karakterleri dizi indeksleri olarak kullanmaya geçiş

-16 bayt: Daha uygun bir giriş formatına geçin

-1 bayt: arasında ihtiyaç duyulan alan yok putsve"abv...

-1 bayt: değişmez $/yerine global kullanın?\n

-3 bayt: gsub(/./)yerine kullan.chars.map

-6 bayt: ile arayın -pve faydalanın $_. Pavel teşekkür !

Sihirli dizedeki her karakter, giriş dizisine bir dizini gösterir. Değişkene ihtiyacım var, zböylece STDIN'den sadece bir kez okuyabilirim.

Bir diziyi kabul eden bir lambda yazıp bir dize döndürerek IO'dan maliyet tasarrufu yapabilirim. Bu v, sonunda bir ekstra gerektirir çünkü ücretsiz bir yeni hat alamıyor -p.

Ruby , 162 110 108 105 bayt (işlev)

->z{"abvevjlmvopqtuvvacvfghvklnvopstuvvadvfihvjlmvopqtuvvabvevjlnvoprstvv".gsub(/./){|c|z[c.ord-97]||$/}}

Çevrimiçi deneyin!


Ben kullanmak için bir yol bulmak mümkün olmamıştır String#unpackdaha kısa olacak şekilde .charsbirlikte .ord-97, ama bir tane olabilir.
benj2240

1
İşte birkaç bayt kapalı: tio.run/##VY/…
Pavel

Düzgün, teşekkürler! Bugün öğrendim -pve$_
benj2240

Cehaletimi affet, ama bunu komut satırından veya IRB'den nasıl çalıştırırım?
John Topley,

1
@JohnTopley IRB kullanmak istiyorsanız, bu üç satırı birer birer kopyalayıp yapıştırabilirsiniz . Programın tamamını komut satırından kullanmak için, buradan başlayın
benj2240

4

Java 8, 241 233 141 140 138 bayt

a->{a.add("\n");"01E4E9;<E>?@CDEE02E567E:;=E>?@CDEE03E587E91<E>?@CDEE01E4E91=E>?ABCEE".chars().forEach(i->System.out.print(a.get(i-48)));}

Açıklama:

Çevrimiçi deneyin.

a->{                  // Method with ArrayList<String> parameter and no return-type
 a.add("\n");         //  Add a new-line as last item (index 21) to the input-List
 "01E4E9;<E>?@CDEE02E567E:;=E>?@CDEE03E587E91<E>?@CDEE01E4E91=E>?ABCEE".chars().forEach(i->
                      //  Loop over the bytes of this String above
   System.out.print(  //   Print:
     a.get(i-48)));}  //    The String in the list at index `i-48`

Temelde ASCII karakterlerini dönüştürür 0yoluyla (48) E0-endeksli endekslere (69) 0aracılığıyla 21ilei-48 .



4

05AB1E , 142 68 66 65 bayt

`¶)•7/è¸ĀuVI{è:÷MDS.₁bö¼d@ÉÃƶõî›Λðë’OŒβι"žHƒö>“ÃaÈǝõöÓ∍¿þœθÀ•2ôèJ

Çevrimiçi deneyin!

- 255 sıkıştırılmış bir string kullanarak EriktheOutgolfer sayesinde 74 byte.

Üç 0'ı birleştirmek zorunda kalmamak için sıkıştırılmış dizgiyi tersine çevirerek -2 bayt

EriktheOutgolfer sayesinde -1 bayt, baştaki 0'ları önlemek için giriş dizisindeki iki öğeyi değiştirerek ve böylece Ters R komutunu kaldırarak .


2

Retina 0.8.2 , 115 bayt

^
12F5F:<=F?@ADEFF13F678F;<>F?@CDEFF14F698F:<=F?@ADEFF12F5F:<>F?@BCDF¶
{`1(?=.*¶(.*))
$1
^(.*)¶.*
$1
}T`1-E`0-D
F
¶

Çevrimiçi deneyin! Girdiyi yeni satırlarla ayrılmış bir dizge listesi olarak alır.


2

Stax , 59 58 bayt

îòÖ╥╬╬╞:,y╓ønä⌠╦╒ï╦≤x◘‼ε╩ⁿ◙ΓZ►e«qpôr╡"╣Ü≥┤╢┴;╡ÑkAú0:=;m╠╠x

Koş ve hata ayıkla

Aynı programın karşılık gelen ascii gösterimi budur.

`ORIpY$T&z{m6Y=>mR)_ .VQ)eN70e[:0yO8j$^RN[ Bp{IN/$|"3^;G#^&lv!`FAx+@]p

`ORIpY$T&z{m6Y=>mR)_ .VQ)eN70e[:0yO8j$^RN[ Bp{IN/$|"3^;G#^&lv!`değeri ile sıkıştırılmış bir değişmezdir "CDBGBLNOBQRSVWBBCEBHIJBMNPBQRUVWBBCFBHKJBLNOBQRSVWBBCDBGBLNPBQRTUVBB". Karakterler belirteç tablosundaki dizinleri temsil eder. Bu program yeni bir satırı temsil etmek için başka bir belirteç ekler. Girdide değil, yürütme sırasında eklendi. Programın geri kalanı bu şekilde çalışır.

F           for each character, execute the rest of the program
 A          integer literal 10, character code of newline
  x+        append 10 to the input array
    @       get element at index, using wrap-around
                the list is size 22, and B is 66, so B gets the first token
     ]      wrap the result in a singleton array.
                this effectively turns 10 into "\n"
      p     print without newline

2

C (gcc) işlevi, 139 bayt

i,m;f(char**s){for(i=0;i<68;)m="AB@E@JLM@OPQTU@@AC@FGH@KLN@OPSTU@@AD@FIH@JLM@OPQTU@@AB@E@JLN@OPRST@@"[i++],printf(m^64?"%s":"\n",s[m-65]);}

Çevrimiçi deneyin!


Güzel. Kodu açıklayabilir misin?
arminb

@ arminb Çok süslü bir şey yok, uzun "AB @ E ..." Dize belirteçlerin indekslerini ve newlines ABC ... = token [012] .. '@' = newline, bir token veya newline 'olarak basıldı Ben o dize ile yinelenir.
PrincePolka

birleştirme printfiçindefor
l4m2

1
kodlamayı tersine çevir
l4m2


1

Kırmızı , 133 bayt

foreach c{abzezjlmzopqtuzzaczfghzklnzopstuzzadzfihzjlmzopqtuzzabzezjlnzoprstzz}[prin either c =#"z"["^/"][t/(to-integer c -#"a"+ 1)]]

Çevrimiçi deneyin!

Ungolfed

t belirteçlerin listesini içeren bir bloktur

s:{abzezjlmzopqtuzzaczfghzklnzopstuzzadzfihzjlmzopqtuzzabzezjlnzoprstzz}
foreach c s[                           ; for each character in s
    prin either c = #"z"               ; if it's a 'z' 
        ["^/"]                         ; print CR
        [t/(to-integer c - #"a" + 1)]  ; otherwise find which token to print
]                                      ; by mapping its offset to the alphabet

1

D , 166 bayt

import std.algorithm,std.range;T f(T)(T[]s){return"abvevjlmvopqtuvvacvfghvklnvopstuvvadvfihvjlmvopqtuvvabvevjlnvoprstvv".map!((int a){return(s~["\n"])[a-97];}).join;}

Çevrimiçi deneyin!


1

Mathematica, 102 bayt

""<>Append[#,"
"][[36^^ajikrj7lg8pya7wgtt43pvrilsik1dea1uht6mx3go33m4mjj02hb4wi9w3~IntegerDigits~23]]&

Saf işlevi. Dizelerin listesini girdi olarak alır ve çıktı olarak bir dizge döndürür. Sadece tüm belirteç indekslerini kodlar, diğer cevaplara benzer şekilde.


1

Ruby , 97 bayt

->a{112.times{|i|$><<a[i%7-1+i%28/7*5]*("0@Xg(44k$,Xg0@Tz"[i/7].ord>>~i%7&1)+$/*(i%7/6+i%28/27)}}

Çevrimiçi deneyin!

Diğer yanıtların çoğuna farklı bir yaklaşımla birkaç bayt kaydedildi.

Her satırdaki olası simge sayısı aşağıdaki gibidir

Line number   Tokens 
1             4
2             5
3             5
4             7

Sihirli dizgide, her satırda bir karakter bulunur; bu, şarkının 16 satırının her biri için 7 taneye kadar jetonun basılacağı bir bitmap olarak yorumlanır.

a[i%7-1+i%28/7*5] her çizginin belirteçleri boyunca yinelenir, her yeni çizgi için 5 ile kaydırılır ve ilk çizginin yalnızca 4 belirteç olduğu gerçeğini hesaba katarak 1 ofseti ile yinelenir.

1-3 satırları için sadece 64'lerin 4'leri bitleri kullanılır - 2'lerin ve 1'lerin bitleri kullanılmazsa, sonraki satırdan belirteçleri yazdırmaz. 4. satır için, 64'den 1'e kadar olan 7 bitin tümü kullanılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.