모드 골프의 프로그래밍 퍼즐


43

당신의 임무는 Good morning, Green orb!모든 문자가 소스에서 가장 빈번한 바이트 수만큼 반복되는 텍스트를 인쇄하는 것입니다 (모드). 후행 줄 바꿈이 허용되며 반복 할 필요가 없습니다.

예를 들어 소스가

print p

p두 번 나타나고 다른 모든 바이트는 한 번 나타나 므로 인쇄해야합니다.

GGoooodd  mmoorrnniinngg,,  GGrreeeenn  oorrbb!!

응답은 바이트 수와 출력이 반복 된 횟수의 곱으로 점수가 매겨집니다. 예를 들어 위 코드 (작동 한 경우)의 점수는 7 * 2 = 14 입니다. 목표는 점수를 최소화하는 것이어야합니다.

코드에는 1 바이트 이상이 포함되어야합니다.

이 프로그램을 사용하여 코드와 출력이 일치하는지 확인하십시오


기능이 허용됩니까?
완전히 인간적인

1
@totallyhuman 예, 입력을받지 않는 한 가능합니다.
위트 마법사

1
태그가 quine 이어야 합니까?
FantaC

아침은 대문자로 할 수 없습니다, 하하?
Magic Octopus Urn

@magicoctopusurn 아니요 텍스트는 동일해야합니다.
밀 마법사

답변:


18

Brain-Flak , 384 * 106366 * 100 = 36,600

(((((((()()()))))))(()({}{}{}(([(({}{})){}()]((((({}())){})){}{}()(({})<([{}](((({}()())))([{}]([{}]()((()()())(()()({}()([(({})){}()](((((({}))))({}({}{}{}){})(({}){}()))))<((((([]){}){}){}<>)<>)>[])))))))(((((()()())()){}{}){}){})<>(((({})<>)))>{}{})))))<(<>({})<>)>))(<>((({}))()){}{}<>)<>(((({}<>()))))({}{}{}<>)<>{((<>{}<><({}<>)>)<{({}[()]<(({}))>)}{}>)<>}<>{}

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

설명

내가하는 첫 번째 일은 문자열을 밀어 넣는 것입니다.

!bro neerG ,gninrom dooG

꽤 표준적인 뇌 플랙 Kolmogorov 복잡성 전술을 사용하여 스택에.

(((((((()()()))))))(()({}{}{}(([(({}{})){}()]((((({}())){})){}{}()(({})<([{}](((({}()())))([{}]([{}]()((()()())(()()({}()([(({})){}()](((((({}))))({}({}{}{}){})(({}){}()))))<((((([]){}){}){}<>)<>)>[])))))))(((((()()())()){}{}){}){})<>(((({})<>)))>{}{})))))<(<>({})<>)>))(<>((({}))()){}{}<>)<>({}<>())

그런 다음 카운터를 오프 스택으로 밀어 각 문자를 복제하는 횟수를 알려줍니다. 그러나 프로그램 작성이 끝날 때까지이 카운터가 무엇인지 확인할 수 없었습니다.

다음으로 우리는 동시에 문자열을 뒤집고 각 문자를 올바른 횟수만큼 복제합니다. 특히 카운터 + 1

{((<>{}<><({}<>)>)<{({}[()]<(({}))>)}{}>)<>}<>{}

프로그램의이 두 부분은 99 개의 열린 괄호 모드입니다. 그러나 가장 확실하게 적어도 1 개의 괄호가 필요하기 때문입니다. 여기서 우리가 마지막으로 밀 !었던 문자에 문자 코드 33이 있다는 것을 알았습니다. 이는 문자 코드 33을 사용하여 하나의 추가 괄호를 사용하여 원하는 정확한 숫자 99를 만들 수 있음을 의미합니다. 이것은 우연의 일치이지만 작동합니다.


9
아, 그렇습니다. 아주 표준적인 뇌파 Kolmogorov- 복잡한 전술입니다. 그게 문제입니다.
John Keates

나의 좋은 친구 인 당신도 이것을 시도하기 위해 화를 내야합니다. 나는 뇌가 모든 괄호를 이해하려고 시도하기 전에 폭발하기 전에 +1로 이동하고 걸어갑니다.
caird coinheringaahing

15

하스켈 , 37 바이트 × 3 = 111

H.PWiz 덕분에 -20. 니미 덕분에 -25.

"Good m\111rning, Green orb!"<*[2..4]

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

하스켈 운영자 FTW.

모바일에서 절대 골프를 치는자가 알림. 나는 바보 같은 실수를 계속한다. 나는 모바일에서 책임의 절반 이상을 밀 수 있습니다. :피


5
사용 <*바이트 저장 (나는 그것의 유효성을 확인하지 않았 음을 참고)
H.PWiz

... 피가 나지, Haskell에는 운영자가 너무 많습니다. 감사!
완전히 인간적인

15

brainfuck , 235 x 77 = 18,095 포인트

편집 : @Dennis 덕분에 -2 바이트

-[>--<-------]>-[>+++++>+>+>+>+++++>+>+>+>+>+++>+++++>-->+>+>+>+>+>+>+>+++++>+>+>+>+++[<]>-]>>----------->+++++>++>->+>-------->-------->+++++>>->++++++>------>+>---->+>+++++>++>>->--------->++>++>>-[>+<---]>--------<<[>>[-<+<.>>]<<,<]

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

TIO 테스트

잠깐, 이것은 코드 볼링 이 아니야 ?? \에스

사용 가능한 문자가 8 개 뿐인 brainfuck은이 질문을 수행 할 수있는 최악의 언어 중 하나입니다. 나는 일반적으로 중, 필연적으로 가장 나타날 것이다 문자를 최소화하기 시작했다 +-. 코드의 첫 번째 반복을 작성한 후 +s 에 유리하게 끔찍한 불균형을 발견했습니다 . 더 많은 숫자를 생성하기 위해 코드의 일부를 재정렬하여 더 많이 사용했습니다 -. 마지막으로, 나는에 결국 동일한 77에서 두 문자의 양을 한 적은 것보다 . 확실히 이것을 더 줄일 수 있습니다. 내일 가겠습니다.-+

하지만 이봐, 난 최소한 Brainflak 답변을 이겼어


축하합니다! 나는 BF에서 이것을 할 수 있다고 믿을 수 없다 ... ;#언어 (͡ ° ͜ʖ ͡ °)로 할 수 있다면 꽤
RedClover

13

젤리 , 13 바이트 * 1 = 13

“¢Ȧ@XĊ'WÑṭḂ#»

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


3
마지막으로 누군가가 어려운 * 1 답변을 관리합니다. 나는 젤리가 그것을 할 수있는 언어라는 느낌이 들었습니다.
ETHproductions

@ETHproductions Haha, 방금 코드를 반으로 줄이면서 * 1
Mr. Xcoder

Haha dang 방금 편집 한 직후에
dylnan

호기심에서 차이점은 정확히 무엇입니까? 새로운 압축 문자열은 이전 문자열 길이의 절반입니까?
ETHproductions

@ETHproductions 기본적으로 처음에는 최적이 아닌 압축 문자열을 사용한 다음 사전에서 일치하는 것을 찾은 최적화 된 Jelly 압축기 를 사용했습니다 .
Mr. Xcoder

10

Alice , 49 바이트 * 2 = 98144

/:G!4o3r8"1=5',0Grey9Z<@
\"b0=dnm 2'i%g<7R6~e.;o/

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

설명

/...@
\.../

이것은 서수 모드에서 완전히 작동하는 선형 프로그램의 일반적인 프레임 워크입니다. 지그재그 제어 흐름을 전개하면 다음과 같은 이점이 있습니다.

"G04d3m821i5g,7G6ee9;<:b!=onr "'=%'<0Rr~y.Zo@

기본 개념은 음역을 통해 두 번 이상 반복되는 문자를 피하는 것입니다. 우리가 할 음역은 다음과 같습니다.

input: "G04d3m821i5g,7G6ee9;<:b!"
from:  "0123456789:;<"
to:    "onr "

앨리스의 방법 음역 작품은 것입니다 fromto이 경우, 모든 문제는 길이 있지만 문자열이 처음으로, 자신의 길이의 LCM에 반복되는 from문자열이 우리가 얻을 수 있도록 :

from:  "0123456789:;<"
to:    "onr onr onr o"

이 방법은 우리가 대표하는 네 가지 문자를 얻을 o들, 그리고 세 가지 각 n, r그리고 공간. from범위 확장을 사용하여 다음과 같이 문자열을 생성 할 수 있습니다 .

'<   Push "<".
0    Append a zero.
R    Reverse.
r    Range expansion.

유일한 문제는 이제 문자열 과 문자열 "모두에 4 개가 필요하다는 것 입니다. 이를 피하기 위해 두 문자열을 단일 문자열에 넣고 구분 기호로 사용 하여 분할합니다 .inputto=

"G04d3m821i5g,7G6ee9;<:b!=onr "
     Push the string containing both parts.
'=%  Split around "=".

나머지는 단지 :

~   Swap "from" and "to".
y   Transliterate.
.Z  Duplicate and interleave. This duplicates each character.
o   Print.
@   Terminate the program.



5

C (gcc) , 68 × 3 = 204

0000000: 6a 3b 6d 61 69 6e 28 29 7b 77 68 69 6c 65 28 6a  j;main(){while(j
0000010: 3c 37 32 29 70 75 74 63 68 61 72 28 7e 22 b8 90  <72)putchar(~"..
0000020: 90 9b df 92 90 8d 91 96 91 98 d3 df b8 8d 9a 9a  ................
0000030: 91 df 5c 32 32 30 8d 9d de 22 5b 6a 2b 2b 2f 33  ..\220..."[j++/3
0000040: 5d 29 3b 7d                                      ]);}

9 포인트를 절약하고 6 개 더 길을 포장 한 @MDXF 덕분에!

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

대체 버전, 인쇄 가능 ASCII, 69 × 3 = 207

j;main(k){while(j<72)putchar("Gnmg$hiuf`dl -I}ut|3{gt6"[k=j++/3]^k);}

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




5

Vim, 42 41 번 키 스트로크 × 3 = 123

iGod morning, Green orb!<Esc>2|qsyl2pl@sqX0@s

설명:

  1. iGod morning, Green orb!<Esc>
    문자열을 작성하십시오 God morning, Green orb!(하나 o누락).
  2. 2|
    첫 번째로 이동하십시오 o.
  3. qsyl2pl@sq
    재귀 매크로를 만듭니다 s. 부작용으로, 전류를 3 배로하십시오 o.
  4. X0
    하나를 제거 o하고 처음으로 이동하십시오.
  5. @s
    s각 문자를 두 번 반복 하는 매크로를 실행하십시오 .


3

apt , 24 바이트 * 2 = 48

`Good ¶rÍÁ,
GÎ9 b!`m²·¸

인쇄 할 수 없습니다. 온라인으로 테스트하십시오!

프로그램의 대부분은 압축 된 문자열 일뿐입니다.

Good morning,
Green orb!

그리고 다음 m은 반복하여 각 문자를 APS ²wice 스트레칭 약간 이었다는 것을, 좋아 . 공백은 압축 된 문자열에 3 번 나타나는 유일한 문자입니다. 하나의 인스턴스를 저장하기 위해 인스턴스를 줄 바꿈으로 바꾼 다음 줄 바꿈 ·¸으로 나누고 즉시 공백으로 결합합니다. 2 바이트 더 길지만 점수가 크게 줄어 듭니다 (66에서 48로).

이제 문자를 두 번 사용하지 않는 짧은 방법 만 있다면 ...


나는 그것을 볼 수 없기 때문에 : 소스에 어떤 캐릭터가 세 번 있습니까? 나는 2의 수는 있지만 3이 아닌 몇 가지를 봅니다.
Draco18s

1
@ Draco18s 없음, 점수는 24 * 2입니다.
ETHproductions

그런 다음 출력이 잘못되었습니다. 각 문자를 두 번이 아닌 세 번 인쇄하고 있습니다.
Draco18s

@ Draco18s Dangit, 잘못된 링크를 게시했습니다 ... 지적 해 주셔서 감사합니다.
ETHproductions

*salute*그리고 지금 당신의 대답을 보면 링크가 ³이지만 반면에 링크는 ³ :)
Draco18s

3

SNOBOL4 (CSNOBOL4) , 97 바이트 * 10 = 970

	S ='Good Morning, Green orb!'
y	S	LEN(1) . y rem . s	:f(p)
	x	=x DUPL(y,10)	:(y)
p	OUTPUT	=x
END

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

예 ... SNOBOL은 연산자를 공백으로 구분해야하며 공백 요구 사항이 상당히 어색합니다. 코드 에는 9 '\t'와 10 ' '이 있으므로 모든 개선에는 접근 방식이 상당히 크게 변경되어야합니다.




3

펄 5 , 59 × 2 = 118 포인트

$_="GSSdYmoVRing,YGVIen orb!";y<H-Z>[d-t ],s<.>[$&x2]eg;say

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

펄 5 , 51 × 3 = 153156 포인트들

s""GOOd morning, Green orb!";y'O'o';s/./$&x3/eg;say

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

펄 5 , 43 × 4 = 172 포인트

say"Good morning, Green orb!"=~s/./$&x4/egr

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

@Xcali 덕분에 각 솔루션에서 2 바이트를 절약했습니다 (몇 전 변경). 모든 최적화를 위해 편집 내용을보십시오.


이것을 함수 대신 프로그램으로 만들면 2 바이트 (4 포인트)를 절약 할 수 있습니다. 온라인으로 사용해보십시오!
Xcali

@Xcali,하지만 변경 사항에는 비표준 옵션이 필요 -M5.010합니다.
mik

그 중 하나는 무료입니다 : codegolf.meta.stackexchange.com/questions/11924/…
Xcali

2

V , 35 바이트 * 2 = 70

IG²od morning, GreeN ORb!5h3~Óˆ/°°

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

16 진 덤프 :

00000000: 4947 b26f 6420 6d6f 726e 696e 672c 2047  IG.od morning, G
00000010: 7265 654e 204f 5262 211b 3568 337e d388  reeN ORb!.5h3~..
00000020: 2fb0 b0                                  /..


2

파이썬 2 , 62 * 4 = 248

@ovs와 @Giuseppe에게 감사합니다!

lambda:"".join(c*4for(c)in"G\x6f\x6fd mor\x6eing, Green orb!")

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

파이썬 2 , 51 * 6 = 306

print"".join(c*6for c in"Good morning, Green orb!")

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

파이썬 2 , 70 * 5 = 350

lambda:"".join(c*5for(c)in"Gxxd mxrning, Green xrb!".replace('x','o'))

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

@Mr에게 감사합니다. 두 버전에서 바이트를 저장하는 Xcoder!


6와 사이의 공백을 제거 할 수 있습니다 for.
Mr. Xcoder

@ Mr.Xcoder 감사합니다!
Steadybox


@ovs 그것은 옳지 않다, 나는 당신 \x6f이 여전히 244에 좋은 두 개의 s가 필요하다고 생각합니다
Giuseppe




2

05AB1E , 점수 : 22 (22 바이트 * 1)

…‚¿•´,„ˆ¨èã).ªðý23£'!«

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

설명:

참고 1 : 목록에 랩 스택 내장은 )대신 내장에 사용됩니다 (가) 때문에, 이미 사전에 나오는 단어의 일부입니다 good.
참고 2 :이 코드에서 쉼표 ,같은 보일 수 있습니다, 하지만 다른 유니 코드 문자입니다 . 첫 번째는 일반적으로 내장 쌍에 사용되고 두 번째는 후행 줄 바꿈으로 STDOUT에 내장 인쇄에 사용됩니다 . 이 경우 사전 단어 good, 출력에 예상되는 쉼표로 사용됩니다.

…‚¿•´,        # 3-word dictionary string "good morning," (the comma counts as the third word)
„ˆ¨èã         # 2-word dictionary string "green orbit"
)             # Wrap everything on the stack into a list: ["good morning,","green orbit"]
            # Sentence capitalize all strings: ["Good morning,","Green orbit"]
   ðý         # Join by spaces: "Good morning, Green orbit"
     23£      # Only leave the first 23 characters: "Good morning, Green orb"
        '!«  '# Append a "!": "Good morning, Green orb!" (and output the result implicitly)

내이 05AB1E 팁을 참조하십시오 (섹션 어떻게 사전을 사용하는 방법을? ) 이유를 이해하는 …‚¿•´,것입니다 "good morning,"하고 „ˆ¨èã있다 "green orbit".




1

젤리 , 31 바이트 × 2 = 62 포인트

“2ðƈZ(Øṡdȷ¿Ɱ’ṃ“God mrnig,eb!”x2

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

설명

“2ðƈZ(Øṡdȷ¿Ɱ’ṃ“God mrnig,eb!”x2
“2ðƈZ(Øṡdȷ¿Ɱ’                     Base 250 number
              “God mrnig,eb!”     Unique characters of "Good morning..."
             ṃ                    Convert the base 250 number in base 13 then index into the string "God mr..."
                             x2   Repeat each character twice because “ occurs twice in the source (and now 2)

1

자바 스크립트 (ES6), 61 바이트 * 3 = 183

_=>'Good morning, Gr\145en \x6f\x72b!'.replace(/./g,"$&$&$&")

자바 스크립트 (ES6), 51 바이트 * 4 = 204

_=>'Good morning, Green orb!'.replace(/./g,'$&$&$&$&')

@ETHproductions가 제안한 답변 .

자바 스크립트 (ES6), 73 바이트 * 4 = 292

_=>`G00d mo1ning, G244n orb!`.replace(/./g,_=>(('o'+!0)[_]||_).repeat(4))

자바 스크립트 (ES6), 58 바이트 * 6 = 348

_=>'Good morning, Green orb!'.replace(/./g,_=>_.repeat(6))


또한, 변화 _=>_'$&'
ETHproductions

1
대안 적으로, 나는 당신이 단지 '$&$&$&$&$&$&'교체를 위해 할 수 있다고 생각합니다. 그러면 당신은 두 개의 인스턴스를 제거하고 4에서 몇 개의 문자를 묶어 점수를 크게 줄이게됩니다 ...
ETHproductions

@ETHproductions 감사합니다. 교체 패턴에 대해 몰랐습니다!
darrylyeo


1

루비, 55x4 = 220 점

"Good morning, Green orb!".split(//).each{|x|print x*4}

each_char를 사용하면 r의 개수가 5가된다는 것이 상당히 짜증납니다.


1

푸쉬 , 36 * 2 = 72

`GXVWOP^4W_[afdc\hiB`N$29+L-''.

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

이 답변의 주요 원칙은 각 문자열이 원래 문자열에서 반복되는 것을 피하기 위해 n저장되는 것 n + index - 29입니다. 이 맵핑은 백틱에서 문자열을 작성했습니다. 프로그램의 나머지 부분은 단순히 이것을 해독하고 각 문자를 두 번 인쇄합니다.

` ... `              \ Push the encoded string
       N             \ Remove printing delimiter
        $            \ While there are items left on stack:
         29+         \   Add 29 to top of stack
            L-       \   Subtract current length from top of stack
              ''.    \   Print twice, then pop

바이트는 두 번 사용되었습니다. `'W

변경 로그

  • 디코딩 방법을 변경하여 41에서 38까지 골프 길이.
  • 멀티 바이트 문자를 방지하기 위해 각 인코딩 된 문자에서 29를 빼서 38에서 37까지의 골프 길이.
  • 암시 적 '종료 루프'를 사용하여 37에서 36까지 골프 길이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.