モードゴルフのプログラミングパズル


43

あなたの仕事はテキストを印刷することですGood morning, Green orb!。すべての文字がソース(モード)で最も頻繁に使用されるバイトと同じ回数だけ繰り返されます。末尾の改行は許可され、繰り返す必要はありません。

たとえば、ソースが

print p

p2回表示され、印刷が必要になると1バイトおきに表示されるため

GGoooodd  mmoorrnniinngg,,  GGrreeeenn  oorrbb!!

回答は、バイトカウントと出力が繰り返された回数の積によってスコア付けされます。たとえば、上記のコード(機能する場合)は7 * 2 = 14をスコアします。目標は、スコアを最小化することです。

コードには少なくとも1バイトが含まれている必要があります。

このプログラムを使用して、コードと出力が一致することを確認します


機能が許可されていますか?
完全に人間

1
@totallyhumanはい、彼らが入力を受け取らない限り。
小麦ウィザード

1
これにquineのタグを付けるべきではありませんか?
FantaC

朝は大文字にすることはできません。
魔法のタコ

@magicoctopusurnいいえ、テキストは同じでなければなりません。
小麦ウィザード

回答:


18

Brain-Flak384 * 106 366 * 100 = 36,600

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

オンラインでお試しください!

説明

私が最初にすることは、文字列をプッシュすることです

!bro neerG ,gninrom dooG

かなり標準的なブレインコルモゴロフ複雑さの戦術を使用してスタックに。

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

次に、カウンターをオフスタックにプッシュして、各文字を何回複製するかを通知します。ただし、プログラムの作成が完了するまで、このカウンターが何であるかを判別できませんでした。

次に、文字列を逆順にし、各文字を正しい回数だけ複製します。具体的には、カウンター+ 1。

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

プログラムのこれら2つの部分には、99個の括弧が開きます。ただし、少なくとも1つの括弧が必要になることは間違いありません。ここで、最後にプッシュした文字!が文字コード33であることに気付きました。これは、99を作成するために使用できることを意味しています。これは非常に偶然ですが、動作します。


9
ああ、非常に標準的な脳フレークコルモゴロフ複雑さの戦術。それらは事です。
ジョンキーツ

私の良き仲間であるあなたは、これを試してさえ怒っているに違いありません。頭が爆発してすべての括弧を理解しようとする前に、私はただ+1して立ち去ります。
コメアリンガーアーイング

15

Haskell、37バイト×3 = 111

-20 H.PWizに感謝します。-25ニミのおかげ。

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

オンラインでお試しください!

HaskellのオペレーターFTW。

モバイルでゴルフをすることは決してありません。私は愚かな間違いを犯し続けます。私は、モバイルのせいで少なくとも半分を非難することができます。:P


5
使用して<*バイトを保存するために(私はその妥当性をチェックしていないことに注意してください)
H.PWiz

...すみません、Haskellには演算子が多すぎます。ありがとう!
完全に人間の

15

brainfuck、235 x 77 = 18,095ポイント

編集:@Dennisのおかげで-2バイト

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

オンラインでお試しください!

TIOテスト

待ってください、これコードボウリングではありませんか?? \ s

使用可能なキャラクターが8人しかないため、brainfuckはこの質問を行うのに最悪の言語の1つです。どの文字が必然的に最も多く現れるか、通常は+またはのいずれかを最小化することから始めなければなりません-でした。コードの最初のイテレーションを書いた後、私はそれがひどく不均衡であることに気付きました+。より大きな数値を生成するなど、コードの一部を再配置して、より多くのを使用するようにしました-。最後に、私はで終わった同じ 77で2つの文字の量 1以下より。これをさらに減らすことは確かに可能ですが、明日はそれを試してみます。-+

しかし、少なくとも、私はBrainflakの答えを打ち負かしました


おめでとうございます!BFでこれを行うことさえ可能だとは信じられません... ;#言語でできるなら(Pretty °͜ʖ͡°)
RedClover

13

ゼリー、13バイト* 1 = 13

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

オンラインでお試しください!


3
最後に誰かがとらえどころのない* 1答えを管理します。私は...ゼリーはそれを行うための言語だろう気持ちを持っていた
ETHproductions

@ETHproductionsハハ、* 1を維持しながらコードを半分にしたばかり
Mr. Xcoder

あなたはそれを編集した後、母は一顧私はちょうどその権利を発見した
dylnan

好奇心から、正確に違いは何ですか?新しい圧縮文字列は、古いものの半分の長さですか?
ETHproductions

@ETHproductions基本的に最初は最適でない圧縮文字列を使用し、次に辞書で一致するものを見つけた最適化されたJellyコンプレッサーを使用しました。
ミスターXcoder

10

アリス、49バイト* 2 = 98 144

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

オンラインでお試しください!

説明

/...@
\.../

これは、順序モードで完全に動作する線形プログラムの通常のフレームワークです。ジグザグ制御フローを展開すると、以下が得られます。

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

基本的な考え方は、文字変換を使用して2回以上繰り返される文字を避けることです。これから行う音訳は次のとおりです。

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

アリスで音訳が機能する方法は、fromto文字列が最初にその長さのLCMまで繰り返されることですが、この場合、すべての問題はfrom文字列の長さなので、次のようになります:

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

このようにして、os を表す4つの異なる文字、およびnrおよびスペースを表す3つの文字を取得します。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!(1つo欠けています)。
  2. 2|
    最初にジャンプしoます。
  3. qsyl2pl@sq
    再帰マクロを作成しますs。副作用として、電流を3倍にしoます。
  4. X0
    1つoを削除して最初にジャンプします。
  5. @s
    s各文字を2回繰り返す マクロを実行します。

4

C、78×4 = 312

*s=L" ÞÞÈ@ÚÞäÜÒÜÎX@äÊÊÜ@ÞäÄB";main(y){while(*++s)for(;y++%5;putchar(*s/2));}

オンラインでお試しください!

356 332


私はゴルフをしたいたびにブラウザの履歴でそれを見つけるのにうんざりしているのでコメントします:私はこれを使ってキャラクターの繰り返しの数を見つけました。
MD XF

そして、これは文字列をエンコードします。
MD XF

3

Japt、24バイト* 2 = 48

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

印刷できないものが含まれています。オンラインでテストしてください!

プログラムの大部分は圧縮された文字列であり、それを解凍します

Good morning,
Green orb!

そしてその後、mそれが繰り返して各文字をAPS ²wice ストレッチのビットだったこと、大丈夫。スペースは、圧縮された文字列に3回出現する唯一の文字です。1つのインスタンスを保存するには、それを改行で置き換え、次に改行で·¸分割してすぐにスペースで結合します。2バイト長くなりますが、スコアが大幅に減少します(66から48)。

これで、文字を2回使用せずに簡単な方法しかなかった場合...


私はそれを見ることができないので、どの文字がソースに3回入っていますか?カウントが2であるが3ではないものがいくつかあります。
Draco18s

1
@ Draco18sなし、スコアは24 * 2です。
ETHproductions

次に、出力が間違っています。各文字を2回ではなく3回印刷しています。
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

Perl 5、59 ×2 = 118ポイント

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

オンラインでお試しください!

Perl 5、51 ×3 = 153156 ポイント

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

オンラインでお試しください!

Perl 5、43 ×4 = 172ポイント

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

オンラインでお試しください!

@Xcaliのおかげで、各ソリューションで2バイト節約されました(数回前の変更)。すべての最適化については、編集を確認してください。


これを関数ではなくプログラムにすると、2バイト(4ポイント)節約できます。オンラインで試してください!
Xcali

@Xcaliが、あなたの変更は、非標準オプション必要-M5.010もカウントし、
MIK




2

Python 2、62 * 4 = 248

@ovsと@Giuseppeに感謝します!

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

オンラインでお試しください!

Python 2、51 * 6 = 306

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

オンラインでお試しください!

Python 2、70 * 5 = 350

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

オンラインでお試しください!

@Mrに感謝します。両方のバージョンからバイトを保存するためのXcoder!


6との間のスペースを削除できforます。
ミスターXcoder

@ Mr.Xcoderありがとう!
Steadybox


@ovsそれはあまり正しくありません、私はあなたが\x6f244にまだ良い2つのs が必要だと思います
ジュゼッペ




2

05AB1E、スコア:22(22 バイト * 1)

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

オンラインでお試しください。

説明:

注1:ビルトインペアの代わりにリストビルトインラップスタック)が使用されます。これは、既に辞書の単語の一部であるためです。 注2:2つのコードではコンマと同じように見える、ことが、異なるUnicode文字です。最初のものは通常組み込みのペアに使用され、2番目は組み込みのためにSTDOUTに末尾の改行を付けて印刷します。この場合、これらは辞書の単語に使用されますが、出力ではコンマが使用されます。 good
,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

JavaScript(ES6)、61バイト* 3 = 183

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

JavaScript(ES6)、51バイト* 4 = 204

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

@ETHproductionsによって提案された回答。

JavaScript(ES6)、73バイト* 4 = 292

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

JavaScript(ES6)、58バイト* 6 = 348

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


または、次のように変更_=>_します'$&'
ETHproductions

1
Alternaternativelyは、私はあなただけで行うことができると思う'$&$&$&$&$&$&'し、私は...あなたは2つのインスタンスを削除して、大幅にスコアを減らし、4で結ばれ、いくつかの文字を持つまで行くことができますだと思うの交換のために
ETHproductions

@ETHproductionsありがとう、その置換パターンを知らなかった!
darrylyeo


1

ルビー、55x4 = 220ポイント

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

each_charを使用するとrの5がカウントされるので、とてもイライラします。


1

Pushy、36 * 2 = 72

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

オンラインでお試しください!

この答えの主な原則は、元の文字列での繰り返しを避けるために、各文字nが保存されることn + index - 29です。このマッピングにより、バックティックに文字列が作成されました。プログラムの残りの部分はこれを単にデコードし、各文字を2回印刷します。

` ... `              \ 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

2回使用されるバイト: `'W

変更履歴

  • デコード方法を変更して、ゴルフの長さを41から38に変更。
  • マルチバイト文字を防ぐために、エンコードされた各文字から29を引くことにより、ゴルフの長さを38から37にします。
  • 暗黙の「エンドループ」を使用した37〜36のゴルフ長
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.