信頼できないデータストリーム


8

あなたの課題は、データ送信ストリームを模倣するプログラムをゴルフすることです。プログラムはstdinから入力を読み取り、それを直接stdoutに出力する必要があります。問題をより興味深いものにするために、出力ストリームは「不完全」であり、いくつかの要件を満たす必要があります。

  1. 各文字がアスキーコード+1でシフトされる可能性は10%あるはずです(たとえば、「a」は「b」になり、「9」は「:」になります)、など。
  2. 入力と出力は、印刷可能なASCII値(「!」から「〜」、10進数の33から10進数の126まで)のみをカバーする必要があります。ランダム+1が「〜」(10進数の126)で発生した場合、「!」代わりに(10進数33)を出力する必要があります。
  3. 3つの文字がランダムに連続してシフトされている場合、プログラムは「エラーコード4625:回復不能なエラーです。システム管理者に連絡してください」(末尾の改行はオプション)、実行を停止します。

問題を単純化するために、他にいくつかの基準があります。

  1. 入力は常に有効であると想定できます。つまり、値には '!'のみが含まれます。「〜」を介して。
  2. プログラムは、3つの文字がランダムに連続してシフトされるまで続行されます。EOFが発生しないと想定しても安全です。
  3. ランダム性は実行ごとに異なる必要があります。実行ごとに一意の結果を取得するために乱数ジェネレータをシードする必要がある場合は、コードでシードする必要があります。
  4. 関数ではなく、プログラムを記述する必要があります。
  5. stdinから入力を受け取り、出力をstdoutに書き込む必要があります。
  6. 外部のライブラリやリソースを使用することはできません。
  7. あなたのコードは自由に利用でき、動作するイントレプリターまたはコンパイラーを持っている必要があります。

標準のコードゴルフ規則が適用されます。勝者は、2週間後(2014年2月20日木曜日)に最短のプログラムを投稿した人です。


EOF があると想定しても大丈夫ですか?特に、GolfScriptが通常行うように、出力を生成する前にすべての入力をメモリに読み込むことができますか?
— Ilmari Karonen 2014

@IlmariKaronenはおそらくそうではありません。RNGが3つの連続したエラーを起こすのに十分な入力を保証することは不可能です。
— TypeIA 2014

1
仕様に従って@ IlmariKaronen、EOFは発生しません。唯一の終了条件は、3文字が連続して反転することです。
— Josh、

回答:


4

Befunge-98、166 159 156 155 148

これは、正しい確率(1/10)で他の優れたBefunge回答を改善し、少しコンパクトになります。

~>?#v?1+\1>+\:'~1+-4k#x07_$'!>,:3-!#v_
>#?>>>\$\0^>
^<<
A"##  "CT YOUR SYSTEM ADMINISTRATOR"<@,kM'"ERROR CODE 4625: UNRECOVERABLE ERROR, PLEASE CONT

一部の実装コメント:x2つの場所で「goto」として使用されます。エッジラッピングは、ASEとの間のスペースギャップを流れる制御を含め、広く使用されていますCONTACT。「3-in-a-row」カウンターはスタックの一番下にあります。バックスラッシュは、必要な場所にスワップしてアクセスするために使用されます。
— TypeIA 2014

1
これは、ここでの品質保証です。私はあなたが最後に文字列を使って何をしたかを本当に気に入っています、それがあなたがそれを必要とするところにエントリーポイントを許しました
— Cruncher

私は今週末、これを抑えるためにたくさんのことを試みましたが、1人のキャラクターでさえできません。しかし、私はあきらめていません!:)
— TypeIA

1
3つの?命令のみを使用するようにRNGブロックを再構成し(そのうちの1つは2つのパスにヒットするため、確率は正確に1/10です)、他のいくつかのマイナーな調整を行って、さらに7文字を削りました!
— TypeIA 2014

勝利おめでとう!
— Josh、

4

C、168文字

i;main(c){for(srand(&c);i++<3;putchar(rand()%10?i=0,c:c-126?c+1:33))c=getchar();
puts("ERROR CODE 4625: UNRECOVERABLE ERROR, PLEASE CONTACT YOUR SYSTEM ADMINISTRATOR");}

このソリューションのPRNGのシードは、最新のOSがスタック破壊の悪用に対する基本的な対策として、実行ごとにメモリ内のスタックの場所を変更するという事実を利用しています。


変数をc完全に取り除くには、getchar()呼び出しをに入れてputchar()、いくつかの凝った数学を使用します...
— Josh

私はあなたがcそれgetchar()を渡すことに加えて126に対して値をテストできるようにまだ持っている必要があると思いますputchar()。
— ブレッドボックス、2014

したがって、派手な数学...私putchar((getchar()-33+(rand()%10?i=0:1))%94+33))はうまくいくと信じています。ソリューションをベースとして使用すると、165文字までに減ります。
— Josh

2

ルビー、156

e=3
putc(($_.ord-33+r=rand(10)/9)%94+33)/e=r>0?e-r :3while gets(1)rescue$><<'ERROR CODE 4625: UNRECOVERABLE ERROR, PLEASE CONTACT YOUR SYSTEM ADMINISTRATOR'

それは何:3whileですか?
— Uri Agassi

@UriAgassiこれ:3は実際にはこのステートメントの終わりです。e=r>0?e-r :3これは、r(処理された最後の文字がエラーの場合は1、そうでない場合は0)に基づいてeの値(中止する前に残っている順次エラーの数)を設定します。スペースを節約するために、しばらくの間押し上げられます:>
— Paul Prestidge 14

1
そしてルビーはそのwhile前にスペースなしで認識しますか?それはとてもあいまいで読めないです!;)
— Uri Agassi

2

バッチ-359

チャレンジルールに完全に準拠させるための提案を受け入れます。

私はそれをより小さく/より良くすることに取り組んでいきます-それを壊す前に、それが機能している間に投稿したかったのです。

@echo off&setLocal enableDelayedExpansion&for /L %%a in (33,1,126)do cmd/cexit %%a&set %%a=!=exitcodeAscii!
set a=%~1
:l
if defined a (
set c=!a:~0,1!&set a=!a:~1!&set b=0&set/ar=%RANDOM%*10/32768+1
if !r!==1 for /L %%b in (33,1,126)do (
if !b!==1 echo !%%b!>>f
if "!c!"=="!%%b!" set b=1
)
if !b!==1 set/pc=<f&del f
set o=%o%!c!&goto l
) 
echo %o%

ゴルフをする方法は確かにかなりたくさんあります。

h:\uprof>UDS.bat "test ing"
tesu inh

h:\uprof>UDS.bat "test ing"
tfsu ing

ゴルフなし-

@echo off
setLocal enableDelayedExpansion
for /L %%a in (33,1,126) do (
    cmd /c exit %%a
    set %%a=!=exitcodeAscii!
)
set a=%~1
:l
if defined a (
    set c=!a:~0,1!
    set a=!a:~1!
    set b=0
    set /a r=%RANDOM%*10/32768+1
    if !r!==1 for /L %%b in (33,1,126) do (
        if !b!==1  echo !%%b!>>f
        if "!c!"=="!%%b!" set b=1
    )
    if !b!==1 set /p c=<f& del f
    set o=%o%!c!
    goto l
) 
echo %o%

2

Befunge-93(206)

空白以外の文字が142個あります。エラーの確率は1/10ではなく1/9であるため、技術的には不適合です。

v$,_\1+:4-v
~> ^1:  <v_$$"ROTARTSINIMDA METSYS RUOY TCATNOC ESAELP ,RORRE ELBAREVOCERNU :5264 EDOC RORRE">:#,_@
 ^ < < < \
   1     "
 ^0?2^
   ^ 3  +"
> >?>?4^"-
   v 5  !"
 ^8?6> ^"^
   7    %"
   >   ^^<

として実行しcat /dev/urandom | tr -dc '!-~' | ./befungee.py -c 100 ../randます。

この入力により、エラーが正しく処理されたことを示す!!!!aaaaaaa~~~~~~~~~~出力が得られ!"!!aabaaba~~~!~~~~!!ます。


10%のチャンスを得ることはかなり難しいでしょう。あなたの9人はそれぞれ別の2人に分割する必要があります(3人目を後ろに投げます)。その後、18人中8人は最初に戻る必要があります
— ランチャー

@Cruncherは、Befungeサブミッションで使用したアプローチに似ていますが、正しい確率です。4つの?が使用され、一部のコードパスは「nops」としてRNGの先頭にフィードバックします。
— TypeIA 2014

1

PHP 190

それは私がそれをさらにゴルフすることができたが、私はそれが先頭から100文字未満であることはかなり良いと思います

<? while($a=fread(STDIN,1)){if(!rand(0,9)){$a=$a=='~'?'!':chr(ord($a)+1);@$i+=1;$i>2&&die("ERROR CODE 4625: UNRECOVERABLE ERROR, PLEASE CONTACT YOUR SYSTEM ADMINISTRATOR");}else$i=0;echo$a;}

1

C#-346 330 313 309 297 288 278 274

ちょっと長いですが、仕事をします。

using System;class m{static void Main(){int c=0;var r=new Random();while(c<3){int n=r.Next(10);var j=Console.In.Read();Console.Write((char)(n<1?j>'}'?'!':++j:j));c=n<1?c+1:0;}Console.Write("ERROR CODE 4625: UNRECOVERABLE ERROR, PLEASE CONTACT YOUR SYSTEM ADMINISTRATOR");}}

1
c=n==0?c+1:0c+=(n==0?1:-c)... より短い
— Timwi

1
(n==1?1:0)より短い(n==1?n--:(--n-n))(そしてもちろん、後でn==0n==1
— 後者

おかげさまで、プログラム全体をほぼ書き直しました!
— user3188175 2014

あなたが素晴らしいです。
— user3188175 2014

うーん、なぜ(false)?どちらかといえば、あなたはしたくないです(true)か?
— Timwi、2014

1

SH OSX上のbash、211、208、203、200、196、185

IFS=
while read -n1 a;do
((RANDOM>3276))&&echo $a&&t=0||{
tr !-}~ \"-~!<<<$a
((t++==2))&&echo ERROR CODE 4625: UNRECOVERABLE ERROR, PLEASE CONTACT YOUR SYSTEM ADMINISTRATOR&&exit
}
done

randomは0から32767までの数値を生成するため、10%より少し良いので、実際には32,768オッズ(3.277)です(10.0006%)。

ありがとう、@ Gilles(ただし、しばらくの間再構築についてどういう意味かはわかりません。他にもいくつかのアイデアがありました。


bash機能を使用しているため(これは実際にはbashソリューションです)、[ $RANDOM -gt 3276 ]to ((RANDOM>3276))と[ $[t++] -eq 2 ]toに短縮できます((t++==2))。として再構築することで、いくつかの文字を保存することもできると思いますwhile read -n1 a;((RANDOM>3276))&&…。
— Gilles 'SO-悪をやめる'

@ギレスありがとう。そのwhile read...部分についてどういう意味ですか?
— それはチャールズではない

すみません、間違った場所で切り捨てました。ループwhile …;do :;doneまたはuntil …;do :;doneを作成すると、いくつかの文字を剃ることができるはずです。
— Gilles 'SO-悪をやめる'

1

C、260 257 237 225 189 174

私の最初のゴルフ、提案に感謝します。

n;main(){for(srand(&n);n!=3;putchar((getchar()+(rand()%10==7?!!++n:(n=0))-33%94)+33));puts("ERROR CODE 4625: UNRECOVERABLE ERROR, PLEASE CONTACT YOUR SYSTEM ADMINISTRATOR");}

7は非常にランダムです。

コンパイルすると警告が表示されます。

ブレッドボックスとジョシュの助けをありがとう。


1
最初の提案:は省略し#includeます。Cは(警告付きで)宣言されていない関数の呼び出しを(制限内で)受け入れます。グローバル変数を使用して、自動ゼロ初期化を取得します。if/ elseステートメントの代わりに三項演算子を使用する方法を見つけます。のfor代わりにwhileを使用すると、トップレベルのステートメントの数を減らし、ループ本体の周りの大括弧を省略する機会が増えます。言及できることはもっとたくさんあります:このサイトの他のCソリューションを調べてください。
— ブレッドボックス、2014

提案をありがとう-gccは少なくともstdioなしで文句を言うだろうと思ったが、どうやらクールだ。また、「count」という名前の愚かな変数もありました。forループも大幅に削減されているようです。
— ミリノン2014

あなたは宣言できnかつcグローバルスコープで。これにより、int宣言を削除するだけでなく、初期化をゼロに自動化できます。
— Josh

でc初期化されていない値を使用することにしましたsrand。&cまたは&n代わりに使用できると思います。これがブレッドボックスの使用方法です。
— ミリノン2014

2番目の変数の必要性をなくすために思いついたトリックが大好きです!
— Josh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.