비틀즈에서“Hey Jude”프린트


27

당신의 임무는 비틀즈의 노래 "Hey Jude"(© Sony / ATV Music Publishing LLC)의 가사에서 추출한 4 개의 구절을 인쇄하는 프로그램을 작성하는 것입니다.

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

그러나

이 네 구절을 구성하는 데 사용할 수있는 유일한 입력은이 토큰 목록입니다.

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

일부 토큰에는 공백이 있으며 따옴표로 묶는 것은 토큰의 일부가 아닙니다. 리스트의 형식을 자유롭게 사용하고 토큰의 순서를 재정렬 할 수 있습니다.

생성 된 출력은 위의 네 구절과 정확히 일치해야합니다. 참고 \n줄 바꿈에 사용하고 여분의 줄 바꿈이 각 구절 뒤에 추가됩니다. 이 파일 (MD5 :)을 사용 4551829c84a370fc5e6eb1d5c854cbec하여 출력을 확인할 수 있습니다.

다음 철도 다이어그램을 사용하여 구절의 구조를 이해할 수 있습니다 (각 요소는 토큰을 나타냄). 여기에 이미지 설명을 입력하십시오

바이트 단위의 최단 코드가 이깁니다. 행복한 골프.


47
Nah nah nah nah nah, nah nah nah 로가는 부분은 압축하기가 쉬울 것입니다. ^^
Arnauld

3
@Arnauld 관련 : P
DJMcMayhem

10
@Arnauld 의무 XKCD xkcd.com/851_make_it_better
나다니엘

3
모든 라인의 끝에 모든 백 슬래시를 부를 수는 없습니다.
Tamás Sengel 10

답변:


9

젤리 , 42 바이트

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

온라인으로 사용해보십시오!

하드 코딩 버전.

입력:

["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

자바 스크립트 (ES6), 108 바이트

a=>`01
4
9bc
efgjk

02
567
abd
efijk

03
587
9bc
efgjk

01
4
9bd
efhij

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

온라인으로 사용해보십시오!


대체 버전, 114 바이트

약간 더 나은 압축이지만 더 큰 압축 해제 코드로 인해 슬프게도 망했습니다.

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

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

온라인으로 사용해보십시오!


m여러 줄 템플릿 리터럴 에는 플래그가 필요 하지 않다는 것을 몰랐습니다 . 흥미 롭군
그랜트 밀러

7

루비 + -p, 177 136 120 118 115 109 바이트 (전체 프로그램)

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

온라인으로 사용해보십시오!

-41 바이트 : 변수 사용에서 문자를 배열 색인으로 사용으로 전환

-16 바이트 :보다 편리한 입력 형식으로 전환

-1 바이트 : puts와 사이에 공간이 필요하지 않습니다"abv...

-1 바이트 : 리터럴 $/대신 전역을 사용하십시오.?\n

-3 바이트 : gsub(/./)대신 사용.chars.map

-6 바이트 :로 호출하여 -p사용 $_합니다. 감사합니다 파벨 !

매직 문자열의 각 문자는 입력 배열에 대한 인덱스를 나타냅니다. STDIN에서 한 번만 읽을 수 있도록 변수가 필요합니다 z.

배열을 수락하고 문자열을 반환하는 람다를 작성하여 IO에서 약간의 비용을 절약 할 수 있습니다. v에서 무료 개행을 얻지 않기 때문에 끝에 추가 항목이 필요합니다 -p.

루비 , 162 110 108 105 바이트 (기능)

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

온라인으로 사용해보십시오!


with String#unpack보다 짧은 방법을 찾지 못했지만 방법이있을 수 있습니다. .chars.ord-97
benj2240

1
다음은 몇 바이트입니다. tio.run/##VY/…
Pavel

깔끔합니다, 고마워요! 오늘은에 대해 알게 -p하고$_
benj2240

내 무지를 용서하지만 명령 줄이나 IRB에서 어떻게 실행합니까?
John Topley

1
@JohnTopley IRB를 사용하려면 이 세 줄을 하나씩 복사하여 붙여 넣을 수 있습니다. 커맨드 라인에서 전체 프로그램을 사용하려면 여기
benj2240

4

자바 (8) 241 233 141 140 138 바이트

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

설명:

온라인으로 사용해보십시오.

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`

그것은 기본적으로 ASCII 문자로 변환 0을 통해 (48) E0 - 인덱스 인덱스로 (69)를 0통해 21i-48.



4

05AB1E , 142 68 66 65 바이트

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

온라인으로 사용해보십시오!

base-255 압축 문자열을 사용하는 EriktheOutgolfer 덕분에 -74 바이트

3 개의 0을 연결하지 않도록 압축 문자열을 반대로하여 -2 바이트

EriktheOutgolfer 덕분에 -1 바이트는 선행 0을 피하기 위해 입력 배열에서 두 항목을 전환하여 Reverse R 명령 을 제거합니다 .



2

Stax , 59 58 바이트

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

실행 및 디버깅

동일한 프로그램의 해당 ASCII 표현은 이렇습니다.

`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!`값이 압축 된 리터럴입니다 "CDBGBLNOBQRSVWBBCEBHIJBMNPBQRUVWBBCFBHKJBLNOBQRSVWBBCDBGBLNPBQRTUVBB". 문자는 토큰 테이블의 인덱스를 나타냅니다. 이 프로그램은 개행을 나타내는 또 다른 토큰을 추가합니다. 입력에 없지만 실행 중에 추가되었습니다. 나머지 프로그램은 다음과 같이 작동합니다.

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) 함수, 139 바이트

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

온라인으로 사용해보십시오!


좋은. 코드를 설명 할 수 있습니까?
arminb

@arminb 너무 멋진 것도없고, 긴 "AB @ E ..."문자열은 토큰 및 개행 문자의 인덱스를 포함한다 ABC ... = token [012] .. '@'= 개행, 토큰 또는 개행 문자는 ' 나는 그 문자열을 반복합니다.
PrincePolka

병합 printf의를for
l4m2

1
코딩 반전
l4m2


1

빨강 , 133 바이트

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

온라인으로 사용해보십시오!

언 골프

t 토큰 목록이있는 블록입니다.

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

수학, 102 바이트

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

순수한 기능. 문자열 목록을 입력으로 받아서 문자열을 출력으로 반환합니다. 다른 답변과 마찬가지로 모든 토큰 색인을 인코딩합니다.


1

루비 , 97 바이트

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

온라인으로 사용해보십시오!

대부분의 다른 답변에 다른 접근 방식으로 몇 바이트를 절약했습니다.

각 줄에서 가능한 토큰 수는 다음과 같습니다.

Line number   Tokens 
1             4
2             5
3             5
4             7

매직 스트링은 한 줄에 한 문자를 포함하는데, 이는 노래의 16 줄 각각에 대해 최대 7 개의 사용 가능한 토큰 중 비트 맵으로 해석됩니다.

a[i%7-1+i%28/7*5] 각 줄의 토큰을 반복하여 새 줄마다 5 씩 이동하고 첫 번째 줄에 4 개의 토큰 만 있다는 사실을 설명하기 위해 오프셋을 1로 설정합니다.

1 ~ 3 행의 경우 64 ~ 4 비트 만 사용됩니다. 2와 1의 비트를 사용하지 않으면 다음 행에서 토큰을 인쇄하지 않습니다. 라인 4의 경우, 64에서 1까지의 모든 7 비트가 사용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.