*任意の*文字列を印刷するためのプログラムテンプレート


40

次のプロパティを持つプログラムを作成します。

  • そのまま実行すると、プログラムは出力を生成しません(つまり、0バイトの出力)。

  • プログラム内の位置は、(お好みの:それは、開始、終了、または途中でどこかにすることができる)があり、次のプロパティを持つ:置く経由でプログラムを修正する任意の文字列は、結果のプログラムが時にその文字列を印刷することが原因となります実行されました。

    これは、文字列に引用符、バックスラッシュ、コメントマーク、区切り文字、NULバイトなどが含まれているかどうかに関係なく機能する必要があります。そこに何を配置しても、文字列は文字列として解釈され、完全にそのまま出力されます。ただし、非常に長い文字列の処理に失敗すると、コンパイラーがメモリ不足などを引き起こす可能性があります(正確には、少なくとも1000バイトまたは最大で3倍の文字列を処理できる必要がありますプログラムの長さ、どちらか長い方)。

無効なソリューションの例は次のとおりです。

print("");
#      ^ text goes here

Python、Perl、Rubyなど。多くの文字列で機能しますが、二重引用符を含む文字列、または部分文字列\n(改行として解釈される)を含む文字列では機能しません。

この問題はほとんどの言語ではおそらく不可能であることに注意してください。課題の少なくとも一部は、それが機能する言語を見つけることです。選択した言語は、このサイトの定義に基づくプログラミング言語である必要があります。たとえば、テキストでソリューションを送信しないでください。

これはので、最短のプログラムテンプレートが優先されます。ただし、現在の勝者に勝てない場合でも、ソリューションを提出することを思いとどまらないでください。それでも、2番目、3番目などの場所を競ったり、可能な限りできるだけ多くの答えを見つけたりすることができます。ただし、送信する前に、プログラムが仕様全体を満たしていることを確認する必要があります。おおよその解決策では、問題のポイントを見逃してしまいます。


関連するサンドボックスの投稿はこちらです。

挿入された文字列に対してサポートする必要がある文字の範囲を明確にできますか?ASCII?ASCII +印刷不可?ユニコードのすべて?
DJMcMayhem

3
すべての256オクテット。それらをバイトとして解釈するかユニコードとして解釈するかはあなた次第です。印刷してもそれほど違いはありません。

1
質問の目的(および現在の言い方)は、追加の出力を取得できないことです。それを回避するように適応できない解決策を念頭に置いていましたか?(余分なバイトを使用して浮遊出力を回避することは、浮遊出力を作成し、仕様に準拠しないよりも望ましいです。)

1
これがコード変更を必要としないなら、それは簡単ですAWK、ただ1それをするでしょう。
ロバートベンソン

回答:


37

Excel、1バイト

'

ゴルフされていないバージョン

'        <-- print the following text,
             and exit the current formula

私はこれが改行を受け入れることができるとは思わない。
コナーオブライエン

3
@ ConorO'Brienそれはshift + enterで行います
Adam

2
@MrPaulchこれは非常に多くのレトロエンジニアリングでした。このコマンドは、システムのクラッシュなど、他のいくつかの未知の機能を隠すと確信しています。
アダム

1
これはOpenOffice Calcでも機能します。セルをフォーマットに設定すると自動的に使用されます@
イスマエルミゲル

1
個人的には、この答えは素晴らしいと思います。@Dennisは、同じ概念を使用しているMathematicaの投稿を削除しました。excelのフロントエンドは、テスト// "" "///を非逐語的な文字列として保存するため、彼のロジックにより、これを削除する必要があります。文字列 "x:Ticked =" 1 ">テスト//&quot;&quot;&quot; /// </ Data> </ Cell> </ Row>
ケリーロウダー


15

Perl 5の30の 21 19バイト

print <DATA> __ END__

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

末尾の改行。これは、ソースファイルに任意のデータを追加できるPerlの機能を利用して、DATAファイルハンドルを介して読み取ることができます。の引数としてファイルハンドルを指定するprintと、リストコンテキストが指定されます。これにより、ファイルハンドルはファイル内のすべての行のリストを返します。改行が含まれます(同様に、最終行の改行は省​​略されます)。次にprint、それらをすべて暗黙的に連結し、行への分割を取り消して、改行の位置に関係なく元の文字列を正確に提供します。

改行を手動で処理する必要がないことに気付いた@Dadaと、ゴルフをすることができるキャラクターをそれぞれ見つけた@ninjaljと@b_jonasに感謝します。


2
あなたが必要とは思わないundef$/。引数としてprint<DATA>それはそこにあるすべての行を読まなければならないので、リストコンテキストで呼ばれています。
ダダ

あなたが正しい。入力を一度に1行ずつ読み取り、行区切り文字を保持し、印刷時にそれらをすべて暗黙的に連結します。したがって、そもそも丸lurみする必要はありません。それは8バイトの節約でもあります。投稿を修正します。

4
__END__代わりに使用できます__DATA__
-ninjalj

@ninjaljが言ったことに加えて、大なり記号の後の改行を省略できます(ただし、プログラムの最後に改行が必要です)。
-b_jonas

14

Zsh、6バイト

<<'
'

末尾に改行があります。文字列はプログラムの最後に挿入されます。

バッシュ、 20 17バイト

3バイトを削除してくれたAdamに感謝します。

exec sed 1d "$0"

* nixシェルスクリプト、 21 14バイト

7バイトを削除してくれたAdamに感謝します。

#!/bin/sed 1d

1
@Copper 末尾に改行があります。その後に文字列が挿入されます。
jimmy23013

ああ、なるほど。私を修正してくれてありがとう!

6/9バイトのソリューションは、インタープリターのバグを悪用しているように見えます(もちろんそれは許可されていません)。(AFAICTはいくつかの実験を行っており、行自体で改行を探していますが、行は改行で分割することで定義されているため、行自体で改行が発生することはありません。)zsh解決策は正しいようです。ただし、9バイトのbashソリューションは間違っています(ファイルに改行がない場合、末尾の改行が追加されます)。

@ ais523も私にはバグのようです。そして、私は彼らが通訳によって許可されるとは思っていませんでした。Bashソリューションを削除しました。
jimmy23013

1
bashのsed 1d代わりに使用できますtail -n+2
アダム

13

brainfuck(読めないBrainfuck)、9バイト

,+[-.,+]!

入力を最後に追加します。今回は、末尾の改行はありません。

プログラムの最後に追加された入力を受け入れる言語を探していたとき、brainfuckは明確な可能性のように思えました。エソランで書かれた多くのブレインファックインタープリターは、プログラムとプログラムの入力の両方を標準入力から取得するため、それらを区別する何らかの方法が必要です。この場合!、プログラムと入力をキャラクターが区別するという慣習があり,[.,]!Hello, world!ます。これは基本的に!、通常とは異なる意味を持つBrainfuckの異なる方言を作成します。

したがって、理論的には、これらのインタープリターの1つを見つけてcat、仕様を満たすためのプログラムを提供することができます。ただし、大きな微妙さがあります。brainfuckは通常、各セルに256個の値を使用します。256オクテットがあり、EOFに使用する必要があります。したがって、256オクテットすべてを文字通りエコーできるようにするには、EOFをまったく検出できず、他の方法でプログラムを終了する必要があります。言い換えると、256オクテットとEOF 257に異なる値を与えるか、EOFでクラッシュする実装を見つける必要があります。

Unreadableと入力します。この課題に先立ち、UnreadibleにBrainfuckインタープリターがあり、これは!;の後の入力を受け入れます。さらに、ほとんどのBrainfuckインタープリターとは異なり、bignumセルとEOFに-1を使用するため、EOFを他の256オクテットと区別できます。したがって、プログラムの特定のインタープリターとして読み取り不可能なBrainfuckを使用することによりcat、EOF = -1で停止するBrainfuck プログラムを作成することで、わずか9バイトで課題を解決できます。

もっと良くすることは可能ですか?さて、次の7バイトプログラムを試すことができます。このプログラムは、ループから抜け出す前に、文字列の最後にEOF を出力しようとします。

+[,.+]!

このプログラムの動作は、エラー状態での読み取り不能インタープリターの動作に依存します(したがって、brainfuckの実装だけでなく、brainfuckの実装を実行するために使用される実装にも依存します)。残念ながら、私が使用する読み取り不能なインタープリターは標準出力にエラーを出力します。つまり、この保存は機能しません。EOFを出力しようとすると終了する、または暗黙のうちにその試行をスキップする判読不能なインタープリターを知っている人がいたら教えてください。それはすぐそこにある7バイトのソリューションです。


1
,[.,]!ここで動作、6バイトです(マークされたボックスにチェックを入れるだけ!です)。また、終了します。
FinW

@FinW:NULバイトをそのWebサイトに入力する方法を理解することはできませんが、そのコードを見た場合、そのコードは間違いなく早く終了します。

私がそれをしたとき、それはNULバイトなしでうまく働きました。
FinW

1
文字通り,(現在のテープ要素への標準入力を読み取る)があり、その後に](現在のテープ要素が0の場合はループを終了します)。したがって、値0(つまりNUL)で入力バイトを読み取ると、ループが中断されます。

ただし、インタープリターが入力を読み取らない場合(たとえば、文字列の末尾の!)は、現在のテープ要素を自動的に0に設定し、ループを終了します。
FinW

9

Dyalog APL、11 バイト

以下は、関数fの本体です。

2↓⎕CR'f'⋄→

末尾に改行があり、その後に何かが挿入される場合があります。

2↓ 最初の2行(ヘッダーとこの行)をドロップします

⎕CR'f'C haracter Rのepresentation F

それから

終了する


9

ルビー、20バイト

印刷* DATA
__終わり__

入力は最後(末尾の改行の後)に移動します。このDATAイディオムは、Ruby がPerlから盗んだものの1つです。

eval.inで試してください:https ://eval.in/684370


1
それはそれを盗んだだけでなく、さらに短い
...-simbabque

9

JavaScript + HTML5 DOM、163バイト

<html><body><script>fetch(location).then((r)=>r.text().then((t)=>console.log(t.slice(145,t.lastIndexOf("</b")))));document.body.remove()</script></body></html>

body終了タグの前に、好きなものを直接挿入できます。これは、ページのソースを取得し、開始コードと終了タグを取り除くことで機能します。

本当のキッカーは、無限ループから抜け出す方法を考えていました。置くwhile(true){}、すべてのコールバック永遠ページブロックに実行を凍結し、JavaScriptはメインスレッドを一時停止する方法はありません。ただし、存在しないコードは実行されることはないため、最後のコマンドでドキュメント本体がseppukuをコミットし、クローンの読み込みを待機している間に自身を削除します。

ええ、それは長くて遠回りですが、JSでそれが可能であるという単なる事実は、驚くべきものです。


1
Chromeは最近、パーサーブロックスクリプトに悩まされており、それらについて不満を述べています。パーサーを意図的にブロックして、その中のスクリプトが印刷の試みを台無しにしないようにするというアイデアが好きです。

7

PHP、46バイト

(末尾の改行を含む)

<?=join([""]+file(__FILE__));halt_compiler();
STRING HERE

はい:file関数もバイナリセーフです。

[""]+ 0-index(ファイルの最初の行)を空の文字列で置き換えます



5

PHP 94バイト

<?$f=fopen(__FILE__,'rb');fseek($f,93);while(false!==($c=fgetc($f)))echo$c;__halt_compiler();

最後のセミコロンの後に文字列を配置します。

あいまいな機能が必要だと思いますか?__halt_compiler()は、名前から期待するとおりのことを行います。前のコードはファイルを開いて、最後のセミコロンの後のバイトをstdoutに書き込みます。NUL、BELなどは問題なく出力されます。Unicodeリテラル(♪)はWindowsで台無しになりますが、UnicodeでWindows cmdが失敗するだけだと思います。


1)94バイトではなく93バイトをカウントします。2)false!==$c=...括弧は不要です。3)rb引用符は必要ありません。4)1バイトを保存し、for($f=fopen(...),fseek($f,88);false!==(...);)echo$c;5)別の2バイトを短くすることができます:<?for($f=fopen(__FILE__,rb);false!==$s=fgets($f,86);)echo$i++?$s:"";__halt_compiler();
Titus

6)および2番目のパラメーターを省略fgetsし、テンプレートに末尾の改行を追加する場合は、さらに2バイト。
タイタス


3

PHP、48 60バイト

<?=substr(file_get_contents(__FILE__),60);__halt_compiler();STRING HERE

PHPを閉じても、文字列に<?


間違った場所に閉じブラケットがあります。私の試みよりもずっときれいなファイルダンプですが、substr()はnullバイトで窒息するだろうと思っていました-推測しないでください。
ToXik-yogHurt

これを試してください<?die(substr(file_get_contents(__FILE__),48))?>STRING HERE。動作するはずです。私は試してみましたが、うまくいきました<?die('a')?>
イスマエルミゲル

@IsmaelMiguelは機能しません。dieパラメータを出力しませんが、終了コードとして送信します。それはする必要がありdie(print ...)ます。
タイタス

@ ToXik-yogHurtほとんどの文字列関数はバイナリセーフです。さえfile。実際、私は現在、そうでないことを考えることができません。
タイタス

@タイタストライdie('text');
イスマエルミゲル

2

バイナリラムダ計算、1バイト

 [text goes here]

これは、テキストの前の単一のスペース(0x20)です。

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

使い方

0x20 = 00100000 2は次のように解析されます

00    λx.
01        x
0000  (ignored, can be anything)

(実際、どのキャラクター!"#$%&\'()*+,-./も同じように機能します。)

これは完全な式であるため、プログラムの残りの部分は入力データとして解釈され、バイナリラムダ計算I / O規則では、恒等関数λxとして解釈されます xは、入力を出力に直接コピーします。


興味深いことに、アイデンティティ関数と挿入の間の後続ゼロビットがエコーされないのはなぜですか?

@ ais523インタプリタは、一度にバイトを読み込み、λ一度のxxは解析され、パディングはすでに消費されています。
アンデルスカセオルグ



1

Excel VBA、6バイト

これは主に、VBA環境の[イミディエイトウィンドウへのアダムの回答]にあるテキストを印刷する方法の質問に答えるためです。

基本設定:

アクティブシートのセルA1で、次の式を使用して、印刷する文字列を保持します。バイトカウントのために、これは1バイトを追加します

'[Your Text Here]

例えば:

'Hello 
World

イミディエイトウィンドウ関数、5 + 1 = 6バイト

?[A1]

'セルA1の+1バイト


0

Vim(exモード)、28バイト

#!/bin/ex -c ':1d' -c ':wq'
[string]

28バイトには最後の改行が含まれます。


0

Vim、738バイト

:imap <esc> <c-v><esc>
:imap <c-a> <c-v><c-a>
:imap <c-b> <c-v><c-b>
:imap <c-c> <c-v><c-c>
:imap <c-d> <c-v><c-d>
:imap <c-e> <c-v><c-e>
:imap <c-f> <c-v><c-f>
:imap <c-g> <c-v><c-g>
:imap <c-h> <c-v><c-h>
:imap <c-i> <c-v><c-i>
:imap <c-j> <c-v><c-j>
:imap <c-k> <c-v><c-k>
:imap <c-l> <c-v><c-l>
:imap <c-m> <c-v><c-m>
:imap <c-n> <c-v><c-n>
:imap <c-o> <c-v><c-o>
:imap <c-p> <c-v><c-p>
:imap <c-q> <c-v><c-q>
:imap <c-r> <c-v><c-r>
:imap <c-s> <c-v><c-s>
:imap <c-t> <c-v><c-t>
:imap <c-u> <c-v><c-u>
:imap <c-v> <c-v><c-v>
:imap <c-w> <c-v><c-w>
:imap <c-x> <c-v><c-x>
:imap <c-y> <c-v><c-y>
:imap <c-z> <c-v><c-z>
:imap <c-@> <c-v><c-@>
:imap <c-\> <c-v><c-\>
:imap <c-]> <c-v><c-]>
:imap <c-^> <c-v><c-^>
:imap <c-?> <c-v><c-?>
i

挿入モードのすべての制御文字をに再バインドし<c-v>、その後にその制御文字が続き、文字どおりに入力されます。^ _(ユニットセパレーター)は、デフォルトで文字通り出力されるため、再バインドする必要はないようです。

もちろん、可変テキストは最後にあります。

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