(m)文字を使用せずにŋarâþcrîþアルファベットの歌を出力する


12

あなたの目標は、入力を取らずに次のテキストを出力するプログラムを作成することです。

ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos.

ただし、問題がありLます。ソースの各文字(Unicodeの一般的なカテゴリがで始まる文字)ごとに、20文字のペナルティが発生します。(参照用に、印刷されるテキストは81文字です。)

以下のPerl 6コードは145バイトと84文字であるため、1,845のスコアを取得します。

say "ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos."

以下のコードには152バイトと70文字が含まれているため、スコアは1,552になります。

$_="C e N ŋa V o S;
Þ Š R L Ł.
M a P F G T Č;
în J i D Ð.
ar ħo ên ôn ân uħo;
Crþ Tŋ neŋ es nem.
elo cenvos.";s:g/<:Lu>/{$/.lc~'a'}/;.say

標準的な抜け穴は禁止されています。

もともと、私は文字を完全に禁止することを考えていましたが、これを可能にする多くの言語があるとは思いません。試してみてください。

(ŋarâþcrîþ[ˈŋaɹa̰θkɹḭθ]は私のコンラングスの1つです。ここでその名前を大文字にしたかったのですが、ここでい大きな英語を取得しました。

編集:行の1つが間違っていることに気づきましたが、すでに答えがあるので、私はそれを保持します。3行目の正しいバージョンはma a fa ga pa ta ča;です。必要に応じて、代わりに修正されたテキストを生成することを選択できます。


11
kolmogorov-complexitystricted- source、および特別なスコアリングは、サンドボックスで慎重に検討することから大きな恩恵を受けるあらゆる種類のものです。現在、この課題への最善のアプローチは、すべてのコードポイントを10進数で書き、組み込みでテキストに変換することであるaようです。 20文字は非常に大きなペナルティであるため、文字が必要になります(ただし、他のすべてがバイト単位でスコア付けされる場合は、十分に定義されていません...)!
関連のない文字列

4
また、Unicodeの呼び出しを考慮すると、ほとんどのgolflangsで使用される特別なコードページを管理するいくつかの明示的なルールがおそらく必要です(スコアリングを検証するスクリプトへのリンクと並んで)。
無関係な文字列

回答:


21

7、410文字、7の符号154バイト、0文字が= 154スコア

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

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

文字の使用を嫌う課題で、数字だけで構成される言語よりも優れた言語は何ですか?

これはクラッシュを介して終了する完全なプログラムであるため、stderrには無関係な出力がありますが、stdoutは正しいです。

説明

7プログラムは、その最初の反復で、多くの要素をスタックにプッシュします(7に存在する12個のコマンドのうち、ソースプログラムで表現できるのはそのうちの8個のみであり、これらの8個はコードの記述に特化しています特定のデータ構造をスタックにプッシュします)。このプログラムは6コマンドを使用しないため(ネストされた構造を作成する最も簡単な方法ですが、ソースプログラムに文字通り表示されない傾向があります)、7構造を決定するのはコマンドのみです。7新しい空の要素をスタックの先頭にプッシュします(05コマンドはスタックの先頭に追加するだけです)。したがって、プログラムに空白を追加して、その構造を表示できます。

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424024030455 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

プログラムの終わり近くの要素は最後にプッシュされるため、2回目の反復の開始時にスタックの一番上にあります。この反復および将来のすべての反復で、インタープリターは自動的にスタックの最上部のコピーを作成し、それをプログラムとして解釈します。リテラル41403は(非リテラル、ライブコード)をプッシュし47463ます(7には12個のコマンドがありますが、そのうち8個だけに名前があります。そのため、コードを表示するために太字を使用し、そのコードを生成するリテラルを表示するために太字を使用しませんそれは、たとえば、一番上のスタック要素に4追加4するコマンドです)。したがって、2回目の反復で実行されるプログラムは47463です。これが何をするかです:

47463の
4        スワップ上の2つのスタック要素は、間に空の要素を追加
  7が       スタックの最上部に空のスタック要素を追加し
   4      との間に空の要素を追加、スワップ上の2つのスタック要素
    6     コマンドは、上部スタック素子を生成することになるうまく。
        それを下の要素に追加します(そしてスタックの古いトップをポップします)
    3    一番上のスタック要素を出力し、下の要素をポップします

スタックに何が起こるかを見ると、これは理解しやすいです。

  • ... dは C B (実行するコード:) 4746347463
  • ... dは Cの B (実行するためのコードを:)47463 7463
  • ... dは Cの bが (実行するコードを:)47463 463
  • ... dは C B の空、空の空のA(実行するコード:)47463 63
  • ... dは C B の空の「」(コードが実行します)47463 3
  • d c b empty(実行するコード:empty47463

つまり、スタックaの最上位を取得し、どのコードがそれを生成した可能性が最も高いかを調べそのコードを出力します。7インタープリターは、反復の終わりにスタックの最上部から空の要素を自動的にポップするため47463、元のプログラムの場合と同様に、スタックの最上部に戻ることになります。次に何が起こるかは簡単にわかるはずです。スタックがアンダーフローし、プログラムがクラッシュするまで、すべてのスタック要素を次々にかき回し、すべてを出力します。したがって、基本的には、プログラムのソースコードを参照して出力対象を決定する単純な出力ループを作成しました(スタックにプッシュされたデータ構造を出力するのではなく、05コマンドの場合、代わりに、作成された構造を確認して出力することにより、使用されたコマンドを再作成します)。したがって、最初のデータ出力は551220304010420030455(上から2番目のスタック要素3341351…114525を生成するソースコード)、2番目は(上から3番目のスタック要素を生成するソースコード)などとなります。

ただし、明らかに、これらのソースコードはエンコードされずに出力されるわけではありません。7には、エンコード出力用のいくつかの異なるドメイン固有言語が含まれています。ドメイン固有の言語が選択されると、明示的にクリアされるまで使用され続けますが、まだ言語が選択されていない場合は、出力されるコードの最初の桁がどの言語を使用するかを決定します。このプログラムでは、2つだけの言語が使用されます5513

551基本的には、5ビット文字セットとしてテレタイプを介して文字を送信するために使用される古いBaudot /テレタイプコードですが、すべての文字が小文字になるように変更されています。したがって、出力される最初のコードチャンクは次のようにデコードされます。

551  22 03 04 01 04 20 03 04  55
     c  a  SP e  SP n  a  SP  reset output format

ご覧のとおり、各文字を2桁の8進数に合わせています。これはかなりの圧縮率です。0から5の範囲の数字のペアは、Baudotが必要とする32の可能性とは対照的に、36の可能性を提供します。したがって、残りの4は特別なコマンドに使用されます。この場合、55最後に記憶されている出力形式がクリアされ、生成する次の出力に別の形式を使用できます。

3概念的にはさらにシンプルですが、ひねりがあります。基本的な考え方は、3桁のグループ(ここでも、出力から元のソースコードを再作成できることを保証できる数字であるため、0〜5の範囲)を取得し、3桁として解釈することです。基数6の数値を2進数のバイトとして出力します(したがって、複数のバイトを出力するだけで、目的の出力にマルチバイト文字を出力できます)。しかし、ねじれは、基数6に216の3桁の数字(可能性のある先行ゼロを含む)しかなく、256の可能バイトがあるという事実に由来しています。7は、332₆=128₁₀から2つの異なるバイトに数字をリンクすることでこれを回避します。332バイト128または192、333バイト129または193などの515いずれかを出力できます。これまでは、バイト191または255を出力します。

プログラムは、出力する2つの可能性のどちらをどのように知るのですか?520これを明示的に制御するために上から3桁の数字を使用することは可能ですが、このプログラムでは次のことは必要ありません:7のデフォルトは、出力が有効なUTF-8になるようにすべてのあいまいなバイトを選択することです!これを行う方法は常に最大1つであることが判明しているため、UTF-8が必要である限り(この場合も同様です)、あいまいなままにしておけばプログラムは動作します。

3…セクションの終わりはで525、出力形式がリセットさ551れ、次のセクションに戻ります。


これは、パックされていない表現では410バイト+ 0文字、またはパックされた表現では154バイト+大量の文字です。一方のバイトを数え、もう一方の文字を数えるのは面倒です。
グリムミー

1
@Grimy:バイトと文字を混同しています。パックされた表現は、それぞれが文字ではなく数字である8進数の410桁をエンコードする7のエンコードの154バイトで構成されます。あなたの推論は、たとえば、ɓゼリーでは文字ではないことを意味します(ゼリーのエンコーディングのエンコーディングは、文字ではなく典型的な8ビット文字セットで解釈される場合、制御コード「CSI」に対応するため)。Jellyと同様に、7もカスタムエンコーディングを使用します。しかし、7は文字を使用しないため、エンコードでは文字をエンコードする必要がないため、エンコードできません。
ais523

10

Haskell、0文字、423バイト=スコア423

(['\10'..]!!)<$>[89,87,22,91,22,100,87,22,321,87,22,108,87,22,101,22,105,87,49,0,244,87,22,343,87,22,104,87,22,98,87,22,312,87,36,0,99,87,22,87,22,102,87,22,92,87,22,93,87,22,106,87,22,259,87,49,0,228,100,22,96,87,22,95,22,90,87,22,230,87,36,0,87,104,22,285,101,22,224,100,22,234,100,22,216,100,22,107,285,101,49,0,89,87,104,244,22,106,87,321,22,100,91,321,22,91,105,22,100,91,99,36,0,91,98,101,22,89,91,100,108,101,105,36]

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


6

ゼリー 274 260  212 バイト + 2つの文字 =  314 300  252

ニックケネディのおかげで-48バイト

“19ב+49;7883,8220,8216,7884Ọ“19937801,1169680277365253“38“68112“;107¤+1+\“@“&%"("/%"@%"6%"0"3%$!<%" %"2%"-%"?%#!.%"%"1%")%"*%"4%"=%$!9/",%"+"'%":%#!%2">0"8/";/"7/"5>0$!&%2<"4%@"/(@"(3"/(.#!(-0"&(/603#“_32¤”;";/V

(用途!"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”Vユニコード文字であり、それぞれ一度使用されます)

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




@NickKennedy数をゴルフで遊んでみましたが、一歩下がらず、単に序数を相殺するだけでした。
ジョナサンアラン

3

PowerShell、スコア601 546

-join(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14|%{[char]($_+32)})

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

素朴なアプローチ; 私は、コードポイントを取り、小数にそれらを変換し、として、それらをこのコードの扱いを32を、減算charする前に-join単一の文字列に一緒に戻ってそれをINGの。




3

ゼリー、321バイト+ 2文字=スコア361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

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

これは恐ろしいことであり、誰かが間違いなくより良くすることができます。

スコアを確認します。


1
それはそうよりも実際に少ない悪い
ASCIIのみ

2

Python 3、380バイト+ 5文字= 480

print("""\143\141 \145 \156\141 \513\141 \166\141 \157 \163\141;
\376\141 \541\141 \162\141 \154\141 \502\141.
\155\141 \141 \160\141 \146\141 \147\141 \164\141 \415\141;
\356\156 \152\141 \151 \144\141 \360\141.
\141\162 \447\157 \352\156 \364\156 \342\156 \165\447\157;
\143\141\162\376 \164\141\513 \156\145\513 \145\163 \156\145\155.
\145\154\157 \143\145\156\166\157\163.""")

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


1

網膜、140文字、159バイト、14文字=スコア439


%# ' 1# !# 9# 2 6#;¶þ# š# 5# /# ł#.¶0# # 3# (# )# 7# č#;¶î1 ,# + &# ð#.¶#5 ħ2 ê1 ô1 â1 8ħ2;¶%#5þ 7#! 1'! '6 1'0.¶'/2 %'1926.
T`!--/-9`ŋ\`-{

オンラインでお試しください!編集:K`改行に切り替えて1文字を保存しました。Retina 0.8.2でも機能するようになりました(ただし、タイトルが長すぎます)。


1

Japt -S304 286バイト+ 2 1文字s = 344 306

まあ、これはただひどいです!

"3 1
5
14 1
235 1
22 1
15
19 1 -37 -86 158 1
257 1
18 1
12 1
226 1 -50 -86 13 1
1
16 1
6 1
7 1
20 1
173 1 -37 -86 142 14
10 1
9
4 1
144 1 -50 -86 1 18
199 15
138 14
148 14
130 14
21 199 15 -37 -86 3 1 18 158
20 1 235
14 5 235
5 19
14 5 13 -50 -86 5 12 15
3 5 14 22 15 19 -50"·®¸®°d96} ¬

それを試してみてください


1

PHP -a、402バイト+ 200ペナルティ= 602スコア

foreach([67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,8,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14] as $i){echo ''.mb_chr($i+32);}

のポート Artermis Fowlの回答、および私の最初のcodegolfエントリー!

chr()UTF-8のみをサポートできることを願っています。これらの余分な3バイト+ 40文字が痛い!


PPCGへようこそ:)
シャギー

1

05AB1E、スコア209(189バイト+ 1文字につき20ペナルティ)

•£?;\:'%¢;.'¡£/':¢?'¢°':¢°#@¢«>#%¡¤;®[¢:¥¢:©¢:¦¢;®¢>#¡£#¨¢#&¢+¢#,¢:§¡¤#¬¢#@¢#)¢#(¢#<¢#¢#/¡£#¯¢#.¢#>¢#±¢#«¡¤#?¢;¢#\¢#°¢#:¢'¢#%•[₅‰`©®_#∞158+902201401301670804020409010150250102709022¾¡.¥>:ç?

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

唯一の文字はçです。通貨記号€£¢はユニコードの文字とは見なされません。


0

Python 3、397バイト+ 19文字= 777スコア

print(''.join(chr(i+32)for i in[67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14]))

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

AdmBorkBorkの回答のポート。




562、Python 2を使用する場合は-2
ASCIIのみ

TIOは私の組織では機能しないため、家に帰ってそれらを追加するのを待つ必要があります。
アルテミスはまだSEを信用していない

0

R、384バイト+ 12文字* 20ポイント= 684スコア

ひどくオリジナルではありません。

cat(intToUtf8(c(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14)+32))

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


0

05AB1E、スコア383 365(325 バイト + 2文字* 20ペナルティ)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

@HyperNeutrinoのJelly回答のポート

ここで改善しようとします。数は数の数で割り切れますますが、残念ながらバイトを節約するものはなく、圧縮された大きな除数には少なくとも1文字が含まれます。

-18(+2バイトおよび-20ペナルティ)@Grimyのおかげで、文字J(結合)を.««(連結によって削減)に置き換えています。

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


1
Jすることができ.««-18ため。または完全に異なるアプローチについては、私の答えを参照しください。
グリムミー

@Grimyありがとう!:)そして素敵な答え!
ケビンクルーッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.