最短のソート済みHello World


27

入力を受け取らHello, World!ず、stdoutまたは使用言語の最も近い代替に出力するプログラムを作成します。キャッチは、プログラムの各行に印刷可能なASCII文字のみを含める必要があり、辞書順、つまりソートされている必要があることです。

95個すべての印刷可能なASCII文字を順番に示します。

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

したがって、たとえば、およびは順序が!!A0~正しくないため、行は無効になります。行は有効です。A0!!0A~

プログラムの各行の長さは任意であり、行の数は任意です。空行はソート済みと見なされます。プログラム内の各改行は同じでなければなりません(ミキシング\n\r\n)。タブやその他の印刷できないASCII文字は禁止されています。

人気のある需要により、勝ちの条件は入れ替わりました:
最少のラインの提出が勝ちます。Tiebreakerは最短プログラムに進みます(改行は単一文字としてカウントされます)。

Hello, World!オプションの末尾の改行のみを出力する必要があります。ことを注意HQ9 +は、それが出力するので無効ですhello, world。「Hello、World!」という文字が1つあるHQ9 +に類似した言語を禁止する場合があります。自明によるコマンド。

ヒント:

非常に簡潔ではありませんが、これは単項および言語で間違いなく可能です。


7
今は少し遅れだが、どういうわけか、私は少なくともラインのように感じ、その後 ...最少のバイトはもっと面白いだったかもしれない
SP3000

6
@ Sp3000組み合わせた測定値が必要になります。さもなければ、単項式と言語が1ライナーのみが競合できることを意味します。
-isaacg

@ Sp3000たぶん、単項/言語が勝つ可能性が低いことを確認したかっただけです。ただし、変更することは可能です(isaacg)。賛成であれば、Spのコメントに賛成票を投じてください。
カルバンの趣味

@ Sp3000アドバイスをいただきました。アップデートをご覧ください。
カルビンの趣味

順序を逆にすることはできますか?たとえば、左から右に読んでいますか?
イスマエルミゲル

回答:


17

Headsecks、1行、366バイト

                                                                        $(((((((((((((((((((((((((((((,000000044888<AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIIIIIIIIIIIILPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPTXXXXXXXXXXXXXXXXXXXXXXXX\```diiiiiilqqqqqqqqtyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy|

Headsecksは、重要なことは8を法とするコードポイントのみである、ささいなBrainfuckの代替です。同等のBrainfuckは単に

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++.+++++++..+++.-------------------------------------------------------------------.------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++.+++.------.--------.-------------------------------------------------------------------.

幸いなことに、この素​​朴なアプローチぴったりです。バイトダウンする可能性はありますが、難しいかもしれません。

このPythonインタープリターを使用しテストしました。


コードを生成する

code = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++.+++++++..+++.-------------------------------------------------------------------.------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++.+++.------.--------.-------------------------------------------------------------------."
command_map = "+-<>.,[]"

last_point = 32
out = []

for char in code:
    curr_mod = command_map.index(char)
    last_mod = last_point % 8

    if curr_mod > last_mod:
        last_point += curr_mod - last_mod

    elif curr_mod < last_mod:
        last_point += (8 - last_mod) + curr_mod

    out.append(chr(last_point))

print("".join(out))

それは賢かった!+1
theonlygusti

より短いBFプログラムを使用できますか、それともプログラムは特定の方法でビルドされていますか?ジェネレータで使用したBFプログラムを試しましたが、出力にはユニコードが含まれていました。
mbomb007

1
@ mbomb007短いBFプログラムの問題は、この単純なメソッドでもコードポイント124で終了するため、新しい文字を導入するのに十分な余地があるとは思わないことです
...-Sp3000

30

///、7行、22バイト

/
//Hello
,
 Wor
l
d
!

まれに///が競合する可能性があります(誰もUnaryとLenguageで始めない限り)。

コードは最初にに遭遇し/、解析します

/
//

プログラムの残りの部分からすべての改行を削除する置換命令として。その後、プログラムは単に読み取ります

Hello, World!

それはそれ以上のスラッシュを含まないので逐語的に印刷されます。


19
URLにその数のスラッシュが連続して含まれている可能性があることすら知りませんでした。
アレックスA.

4
@AlexA。そのURLが機能するようになるには数か月かかりました、IIRC。サーバー構成とMediaWiki構成の変更に対処するために、記事の名前を変更し続ける必要がありました。

17

JavaScript(67 66 62行、 227 269バイト)

(注:Firefox 36およびSafari 8でのみテストされ、マイナーなES6機能(Setクラス)が含まれています)

Z
=
!""+
(0[[]]
+
(
!!""+Set
));c
=Z[~
-22]
$=Z[
3]
$$=Z[
15]
$$$=Z[
24]
$$$$=Z[
1]
$$$$$=Z[
0]
Set
[c
+
$$$+Z[
5]
+Z[
16]
+
$$$$$+
$$$$+Z[
2]
+c
+
$$$$$+
$$$+
$$$$]
(Z[
14]
+
$$+
$+
$$$$+
$$$$$+
"(\
'H\
"+
$+
$$+
$$+
$$$+
",\
 W\
"+
$$$+
$$$$+
$$+Z[
6]
+
"\
!')\
")
()

上記のコードは基本的に次のことを行います。

alert("Hello, World!")

明らかにalertソートされていません。そのため、代わりに文を文字列として生成し、「評価」する必要があります。

s = "alert('Hello, World!')";   // generate this using sorted code
eval(s)

文字列を生成する方法は?ES5は行継続をサポートしているため、

"AL\
ERT" === "ALERT"

しかし、文字コード\はすべての小文字の前に表示されるため、他の方法を使用して小文字を生成する必要があります。

ここでJSFuckのアイデアを借ります。アラートステートメントに含まれる小文字は次のとおりです。

t e r a o l d

これらはすべて、標準オブジェクトの文字から抽出できます。これは、ソートされたシーケンスの観点から表現できます。

t, e, r ← true      = !""
a, l    ← false     = !!""
o       ← function  = Set
d       ← undefined = 0[[]]

文字列をどのように評価しますか?eval(s)ソートされていないため、使用できません。または、を使用することもできますがFunction(s)()Function並べ替えられていないため使用できません。ただし、Functionは、すべての関数のコンストラクタですSet.constructor === Function。つまり、です。

識別子constructorを追加すると、小文字のリストが次のようになります。

t e r a o l d c u n s

幸いにもまだ生成できたものは"truefalseundefinedfunction"次のとおりです。

t, e, r, u ← true      = !""
a, l, s    ← false     = !!""
o, c, n    ← function  = Set
d          ← undefined = 0[[]]

予言した後、上記のコードは次のようになります。

// lines 1~8 defines our string containing all lowercase letters we want
Z = true + (undefined + (false + Set))
// Z = "trueundefinedfalsefunction Set() { [native code] }"

// lines 8~20 defines the variables `c`, `$` (e), `$$` (l), `$$$` (o), 
// `$$$$` (r), `$$$$$` (t)
// for the corresponding lowercase letters extracted from `Z`

// the rest calls:
Set["constructor"]("alert('Hello, World')")()
// lines 22~36 generates the "constructor" string
// lines 37~61 generates the "alert('Hello, World')" string

アップデート:改名ELORTの様々な繰り返しに$4行を削減します。


2
絶対に素晴らしい!Pythonで同じ時間戦略を使用できるかどうかはわかりません(大文字と小文字が区別されます)。
mbomb007

非常に素晴らしい!2つではなく1つの改行のみが必要なもの=Z[3*7]として記述できることに注意してください=Z[~-22]
私と私の猫

@ mbomb007うん、でもスペースがあり、彼らは... ASCIIセットの最初のだ
ハリー・ビードル

@meandmycatありがとう!更新しました。
ケニー

13

不眠症、4行、59バイト

 FFFFGjnnnnooty
FLLddeejkopqyyyyy~~
(<ddjnoppppqrtu
<<Fddfj

このプログラムは、行数を最適化することにより生成されます。

10行、43バイト

(u
pt
(dppty
p~
j
<Fptt{
(otz
?o
FLu
<?FFu~

上記のプログラムは、バイトカウントを最適化することで生成されます。


11

Cygwin bash、16行、60バイト

これは、Windowsの大文字と小文字を区別しないファイル名と、大文字と小文字を区別せずにパスを認識するように設定していなくても、Cygwinが大文字と小文字を区別せずにユーティリティを検索するためです。

A\
=Hello
A\
+=\
",
"Wor
A\
+=l
A\
+=d
A\
+=\
!
E\
CHO\
 $A

ECHO最後に注意してください。


これが17行なのか16行なのかわかりません(最後に新しい行があります)が、いずれにしても、これは何も勝ちません。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

あなたは10のアップ投票に勝った、それはすでにたくさんある。最も投票されたもの(現在)には12の投票があります!そして、23の賛成票を持つ///ソリューション。
イスマエルミゲル

11

> <>、6行、111バイト

  """""""/;;Hello
        &\o
      &++\oooo~~
"++++++++\bbbdlr
    +++++\ccccccccfooo}
    $++66\cfffffooooopr

私は余分なラインをゴルフアウトするのに苦労していますが、いずれにしても、7ラインの方法に勝ったことは嬉しいです。

説明

> <>は、スタックベースの2D言語であり、命令は単一の文字であり、プログラムフローは上、下、左、または右にできます。"命令は、クロージングがするまで文字を押して、文字列解析をトグル"満たされているが、理由の性質> <> CJamの文字列やPythonのトリプル引用符で囲まれた文字列と同じように、「複数行の文字列解析」のようなものはありません。これは大きな問題であることが判明しました。これは、aで行を開始および終了し、"その間に他の文字(例:)を含める"some chars"ことが許可されていないためです!

プログラムフロー/\反映していることに注意してください。したがって、実際には最初の行を実行し、次にすべての行を逆の順序で実行します。ほとんどの行は実際に逆方向に実行されます。

[Line 1]

""""""              Three empty strings, push nothing
"/;;Hello  "        Push "/;;Hello  ". Note the wrapping - ><> is toroidal!
""""""              Three empty strings, push nothing

[Line 6]
66++$               Turn the top " " into "," by adding 12, then swap top two
rp                  Reverse stack and pop top 3
ooooo               Print "Hello", stack is now " ,"
fffffc              Push some 15s and a 12

[Line 5]
+++++               Sum the 15s and 12 to give 87, or "W"
}ooo                Move "W" to the back and output ", W"
fcccccccc           Push a 15 and some 12s

[Line 4]
++++++++            Sum the 15 and 12s to give 111, or "o"
"rldbbb\++++++++"   Push chars to stack
r                   Reverse stack
ld                  Push length of stack and 13, not used
bbb                 Push three 11s

[Line 3]
++&                 Sum the 11s to give 33, or "!" and put in register
~~                  Pop top two
oooo                Print "orld"

[Line 2]
&                   Put "!" from register to stack
o                   Print "!"

[Line 1]
;                   Terminate

補足として、最小バイト(<23行、47バイト)での面白い試みを次に示します。

v
"
!
d
l
r
o
W

,
o
l
l
e
H
"
/<
l
?
!
;
o
\^

2
:第二のコードでは、垂直方向のラップアラウンドのおかげでバイト2を保存することができpastebin.com/heqCr1vJ
randomra

10

CJam、5 4行、162バイト

"Hello
")))))))))))))))))))))))))))))))))))68S\cel
"Wor
")))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))@SX\c|

不眠症と同じ行数!(ただし、さらに多くのバイト)

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

説明

"Hello\n"        Push "Hello" and a newline
)                Uncons the newline
)))...)))        Increment the newline into a ","
68S\             Push 68 and a space then swap, leaving 68 on top
c                Convert 68 into a char "D"
el               Lowercase "D" into "d"
"Wor\n"          Push "Wor" and a newline
)                Uncons the newline
)))...)))        Increment the newline into an "l"
@                Rotate top three elements, moving the "d" to the top
SX\              Push a space and 1 then swap, leaving the space on top
c                Convert the space (which is an array) into a char
|                Bitwise or the space (32) with 1 to give "!" (33)    

CJamはその後、スタックを自動的に印刷します。

ことを私に思い出させるため@OptimizerのおかげでScそれ以外のための作品は、SX|失敗した(それはスペースと1からなる配列を与え、代わりにsetwiseかを行います)。


8

> <>(魚)、5行、多くのバイト

コードは非常に長く、コードの最初の行で言う[6535529689086686142930090 '+' signs][6535529689086686142930090 'd' characters]、文字通り6535529689086686142930090プラス記号が連続していることを意味します!

(次の行では、必要なプレフィックススペースを追加します。)

'[6535529689086686142930090 '+' signs]^`[6535529689086686142930090 'd' characters]
                                   **,/288
                                     -/:o
                             %**288:;?\
                                   (1:\

印刷するだけの短いテスト可能な代替物Hi

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++^`hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
                                                                                                                               **,/288
                                                                                                                                 -/:o
                                                                                                                         %**288:;?\
                                                                                                                               (1:\

方法:

  • 最初の行では、base128の文字列を表す巨大な数値を作成します。
  • 残りの行(下から上へ)で、整数の値が0に達するまで、すべてのループで次の文字を出力します。
  • ループコードは:1(?;:882**%:o-288**,です。

(このメソッドで任意の2+文字の長い文字列を印刷できます。)


有効なソリューションではありません。6535529689086686142930090は注文されていません。
theonlygusti

@theonlygusti「コードが解釈し、非常に長いです[6535529689086686142930090 '+' signs]し、[6535529689086686142930090 'd' characters]文字通りコードの1行目に。」(その意味が不明な場合は、2番目のコードを確認してください。)
randomra

ああ、大丈夫!申し訳ありませんが、私は愚かな:PIは文字通りそれを取った。
theonlygusti

2
サイズは13 YBで、インターネットのサイズの約1000倍です。
チャールズ

@Charles私は後者の行を含めて〜40YBを取得します。
Veedrac

8

PHP(7/17行、36/59バイト):

無効な回答が多かったため、この回答を書き直しました。

ブラウザのバージョンは?消えた。

ただし、PHPの文字列のビット単位xor^)に基づく2つのソリューションがあります。

これは非常に強力なソリューションです!場合によっては、大量のバイトを節約できます。

まず、最短の答え:

Echo
Hello
,AM^mm
,Wor
,OOO^
"#+n
";

私は知っている、それはひどいに見えますが、それは動作します!

次は改行に依存します。

はい、改行を使用します(\n/ UNIXスタイルが必要です)!

Echo
Bo
.ff
.e
.
"&*]ex
fn
"^
"\n
\n
\n
\n
\n
\n
\n
",B^c
;

これに関する改行は機能するために必要です。

完璧ではありませんが、機能します!


どちらの答えも@MartinBüttnerソリューションに基づいています

Echo
Hello
.
chr
(44
).
chr
(29
+3
).Wor
.l
.d
."!
";

特別に感謝@n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳@CJDennis@MartinBüttner@skagedalすべて私の過ちを検出すると、彼らの提案のため。


1
ブラウザの出力はHello , Wor l d !です。余分なスペースに注意してください!残念ながら、これは有効な答えではありません。
CJデニス

1
Windows XP上のFirefox 36、IE 8、Opera 12.17およびOpera 28(Chromium)でテスト済み。すべて同じように出力をレンダリングしました。任意の数の空白文字が単一のスペース文字として表示されるため(ブレークスペースがない場合など)、各改行はスペースに変換されます。ブラウザがスペースなしで出力をレンダリングするかどうかを知りたいと思います!
CJデニス

1
言語の素晴らしい虐待!技術的に生成されたエラーは、stdoutではなくstderrに送られるため、私の場合、ブラウザに多くのエラーが表示されていても、コードは有効です。そして、信じられないほどきびきびした、私のPHPセットアップは短いタグをオフにしているので、私のコンピューターの最初の行<?phpは無効です!ただし、これについてはご容赦ください。OK、<?Php動作するテスト済みなので、開始タグでは大文字と小文字が区別されないことがわかりました!
CJデニス

1
この回答の上位2つのソリューションは、ルールに従っていません。一番上の行は8行目です。"!<br-これはソートされません。2番目の行は10行目."!です。-ソートされていません。
skagedal

1
@IsmaelMiguelすみませんが、いいえ。最初の提案の7行目はソートされていません。2番目の提案の5行目と7行目はソートされていません。
-skagedal

7

Pyth、7行、23バイト

-
"Hello
,
 Wor
l
d
!"b

非常に簡単です。複数行の文字列を使用して改行を削除するだけです。

ここで試してみてください。


@orlp数日前に複数行の文字列を追加しましたが、Pythは長年の入力で改行をサポートしていました。これはマルチラインモードをまったく使用しません。オンラインコンパイラで試してみてください。オンラインコンパイラには、間違いなくマルチラインモードがありません。
isaacg

2
CJamでもほとんど同じですが、バイトカウントも同じです。
オプティマイザー

4

4番目、41行、143バイト

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

私はこれを非常に誇りに思っています。大文字と小文字を区別しない言語をGoogleで検索して、できることを見つけたら、すぐにそれを打ち出しました。Forthをすでによく知っています。ほとんど間違いなく、バイトと行の両方で短縮できます。提案を歓迎します。:D

このプログラムは、基本的に各ASCII文字の10進値をプッシュしてから、それぞれを出力します。私はそれを書いている間に最適化を試みたので、私が望むよりも読みにくいです。

33
99
1
+
DUp
8
+
2DUp
6
+
SWap
11
+
2OVer
SWap
8
9
*
EMit
1
+
EMit
DUp
DUp
EMit
EMit
3
+
EMit
29
3
2DUp
+
EMit
*
EMit
EMit
EMit
EMit
EMit
EMit

Emit行は、動作しないi(105)未満であるm(109)。
bcsb1001

それでは、「EMit」にする必要がありますか?
-skagedal

4

マーベラス、9行、94バイト

3333
    @ADD
    358C
++--29\\
++--3555DE
<<<<<<>>~~
+++++446666D
++++++++../\
      ++------

こちらでオンラインでテストしてください。 Using spaces for blank cells確認する必要があります。

ソースの視覚的表現:

上記のソースの視覚的表現

説明:このプログラムの各16進値は、「tick」ごとに下に移動します(オンの場合を除き\\、その場合は右に移動します)。++値をインクリメント、--デクリメント、~~ビット単位否定を適用などします。下の値はASCII文字として出力されます。

例:33上隅のはになり(((0x33 +1 +1) << 1) +1 +1 = 0x6C (l)ます。



2

Rebol-15行(51バイト)

PRin
AJOin
[
'Hello
Sp 
+
12
Sp
'Wor
'l
'd
Sp
+
1
]

REBOLの中の単語は大文字と小文字を区別しません(例えばPRINTPrintおよびprintすべて同じ機能を呼び出します)。

上記のコードは整理されました:

prin ajoin [
    'Hello  sp + 12  sp  'Wor  'l  'd  sp + 1
]

NB。spスペース文字を返します


あなたのプログラムは無効{です。文字の前に置くことはできません。
theonlygusti

@theonlygusti-修正(9行から13行に変更)。私に問題を引き起こした唯一の行はでした{,}。これは現在Sp + 12(3行以上)、スペース文字+ 12(つまり、コンマ)に相当します
-draegtun

2

単項、1行、大量のバイト

このプログラムのすべてのキャラクターは0です。ソースは長すぎてここに入れることはできませんが、この多数のゼロの文字列で構成されています。

327380789025192647555922325233404088310881092761595127419003295178342329930050528932118548

これは、この2進数の10進数表現です。

0b1010010010010010010010010110000010010010010110000010010000010010010000010010010000010001001001001011111000010000010000011110001111001011111000000100000011011011100010010010010010010010100100010010010100000000100001011100001100010010010100011011011011011011100011011011011011011011011100000000010100

このBrainF ***プログラムから作成されたもの:

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

生成方法を見る:http : //ideone.com/lMT40p


2

バッチ-39行(202バイト)

スイッチcmdを使用して呼び出し内でコードを実行することで遅延拡張を有効にしてサイズを削減したかったのですが、/v onすべてのカラットを超えることはできませんでした。

@S^
ET^
LO^
C^
AL^
 EN^
ABL^
E^
DEL^
AY^
E^
DEX^
P^
ANS^
IO^
N
@S^
ET^
 0=Hello
@S^
ET^
 1=^
,^
 Wor
@S^
ET^
 2=l
@S^
ET^
 3=d
@E^
CHO^
 !^
0^
!!1^
!!2^
!!3^
!^^^
!

改行なし(および改行をエスケープするカラット):

@SETLOCAL ENABLEDELAYEDEXPANSION
@SET 0=Hello
@SET 1=, Wor
@SET 2=l
@SET 3=d
@ECHO !0!!1!!2!!3!^^!

1

ルビー、19行、95バイト

$;=
$>
$;<<
:Hello
$;<<
44::chr
$.=
33::
-1
$;<<
$.::chr
$;<<
:Wor
$;<<
:l
$;<<
:d
$;<<
33::chr

恐らく、このサイトで見たRubyの2番目に厳しいコード制限は、ここでの怪物の後です

説明のために編集:ソートされる唯一のRuby出力メソッドは、<<STDOUT のメソッドです。残念ながら、STDOUTの定数は$>であり>、ほとんどのシンボルよりもASCIIが高いため、そのメソッドを呼び出すことは実際には不可能です。より扱いやすい変数名にするには、複数行の割り当てステートメントが必要です$;(セミコロンはまだかなり高いですが、この形式のほとんどの変数は割り当て不可であるか、文字列のみにすることができます)。

シンボル(:Worなど)はリテラルを実行する最も簡単な方法であり、文字列から改行を削除する方法が見当たらないため、複数のprintステートメントが必要です。スペースと句読点を記号リテラルに入れることはできませんが、幸いなことchrに数字のメソッドは合法なので、ASCII値から文字を取得できます。::メソッドを呼び出す別の方法です。私は書くことができないため32、スペースは扱いにくいので、33から1を引き、変数に割り当てます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.