猫はあなたの入力を再び食べました!


30

catプログラムを作成します。別名、入力を受け取って出力するプログラムです。

...ただし、プログラムは入力から文字をランダムに削除し、代わりに印刷します。

入力の各文字は、プログラムで削除されるオッズが一般的に等しい必要がありますが、それを作成するのは難しいため、各文字のオッズは最大で10%しか変化しません。

プログラムは入力を受け取り、入力から文字をランダムに削除してから、そのバージョンを再度印刷する必要があります。(言語で改行を印刷する必要がある場合は、末尾の改行または他の文字で印刷できます。)

入力がの場合、BOOOWLすべてのOを等しい確率で削除するべきではありません。各文字(一意ではない)を考慮する必要があるため、結合されたすべてのOが1/5の確率を持つ代わりに(たとえば)、各Oは1 / 5のチャンスです。したがって、1/5のチャンスではなくBWL、1/5のチャンスがBOWLありBOOWLます。

入力はSTDINまたはそれに最も近いものに制限されます。

各キャラクターは、最低10%、最高30%の確率で除去されなければなりません

各キャラクターのオッズは個別に計算する必要があります。

ランダムアクションをサポートする言語の任意のコンポーネントを使用できます。それが機能していても、他のものでもかまいません。

出力はSTDOUTまたは最も近い同等のものである必要があります。言語にSTDOUTがある場合は、他の方法で出力しないでください。あなたの言語が文字列をテキストとして出力できない場合、最も近いものを使用してください(Cの文字配列出力はここでOKです)。

これはコードゴルフです。最短のプログラムが勝ちます。


4
特定のキャラクターが削除される可能性は常に10%から30%の間でしょうか?それとも、単に例の目的のためですか?
attinat

2
「1文字のセット」とはどういう意味ですか?入力がBOWL OF SOUPすべてのO'が一度に削除される可能性がある場合
ロブログ

1
これまでのすべての回答では、キャラクターが削除される確率が20%に固定されていました。質問の意図がすべてのキャラクターが同じオッズを持っているかどうかわかりません。
Nzall

3
Output must be through STDOUT, as a text. Do not output a character array.<-文字配列を出力できる言語があります(出力前にフラット化されます)。それは禁止されていますか?文字列が基本的に文字配列であるCのような言語はどうですか?
イスマエル・ミゲル

1
最も近いものを使用してください。Cの文字配列文字列は、テキストに最も近いので問題ありません。
アンドリュー

回答:


10

Japt -f、2バイト

-fフラグが「truthy値を返すものの配列を出力する第1の入力の各要素上でプログラムを実行します。」0(包括的)から5(排他的)の間の乱数を返します。JavaScriptと同様、Japtでは0は偽です。

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


2
私は時間をさかのぼり、oがこの課題である言語を作成してから戻って回答を送信するか、または空の文字列を作成します:p
Andrew

コマンドラインフラグはバイトカウントにカウントされるはずではありませんか?
ダニエルヴェストル

1
@DanielVestølタイトルのをクリックし-fます。
イスマエル・ミゲル


1
冗談だったが大丈夫
アンドリュー

8

Python 3、63バイト

from random import*
for c in input():print(end=c[random()<.2:])

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

Pythonの267の 65バイト

from random import*
print''.join(c for c in input()if.8>random())

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

各キャラクターは20%の確率でビーイングがドロップします。

異なるアプローチ、同じ長さ:

from random import*
print''.join(c[random()<.2:]for c in input())

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


関数付きのPython 2で63バイト
attinat

ルールは、明示的に完全なプログラムを書くの状態:Create a cat program, a.k.a a program that takes an input and prints it.
movatica

これは、入力の最初の行のみを読み取ります。
AKX

問題は、複数行を読み取る必要があるとは述べていません。
movatica

8

木炭、4バイト

ΦS‽⁵

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

 S      Input a string
Φ       Filter where nonzero
  ‽⁵    Random number 0..4
        Implicitly print

あなたはから任意の番号を使用することができます410のチャンスを得るために25%10%それぞれ。


7

Befunge-98(PyFunge)、11バイト

>#@~3j4???,

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

各キャラクターは25%の確率で除去されます。この決定は、3つの?指示で行われます。

?等しい確率で、プログラムカウンターを4つの方向のいずれかに設定します。この場合、上下は同じ命令に戻りますので、それらをオプションとして無視できます。

??p2=1/2?p3=1/21+1/2p2=3/4?



5

ゼリー9 5バイト

5X’µƇ

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

Jelly文字列を引数として受け取り、処理されたJelly文字列を返すモナド。完全なプログラムとして使用すると、暗黙的に出力が印刷されます。各キャラクターは20%の確率で除去されます。

説明

   µƇ | Filter using the following as a monad for each character:
5X    | - Random number between 1 and 5
  ’   | - Decreased by 1

5

Japt、3バイト

各キャラクターは、5分の1の確率で除去されます。は549を含む、またはオッズを変更するAための任意の値に変更できます10

Æ5ö

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

Æ5ö     :Implicit input of string
Æ       :Filter by
 5ö     :  Random integer in the range [0,5), with 0 being falsey


5

05AB1E5 4 バイト

ʒ₄Ω≠

@Grimyのおかげで-1バイト。

オンラインで試す、同じプログラムを10回実行します。

各キャラクターには、ドロップされる25%の変化があります。

説明:

ʒ     # Filter the characters of the (implicit) input-string by:
     #  Push 1000
  Ω   #  Pop and push a random digit from it
     #  And check that it's NOT 1 (!=1)
      # (after which the result is output implicitly)

_==0)の場合もあります。


2
5L-1の可能性があります(20%から25%にチャンスを変更しますが、それでも受け入れられます)。
グリムミー

@Grimyいいね、ありがとう!:)
ケビンクルーッセン

4

MATL、9バイト

t&n&r.2>)

説明:

t         implicitly take input and duplicate it
 &n       compute the size of the input and...
   &r     generate a random array of that size
     .2>  check which entries of that array are greater than 0.2
        ) and use the result using logical indices to extract certain characters of the input

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


4

Pyth8 5バイト

sfO4Q

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

sfO4Q   Implicit: Q=eval(input())
 f  Q   Filter characters of Q where the following is truthy:
  O4      Random number in the range [0-4)
          Any non-zero value is truthy, so this will drop characters 25% of the time
s       Concatenate into string, implicit print

以前のバージョン、8バイト:

s*Vm!!O4

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

s*Vm!!O4QQ   Implicit: Q=eval(input())
             Trailing QQ inferred
   m    Q    Map each character in Q using:
      O4       Choose random integer in [0-4)
    !!         Logical NOT twice - maps 0 to 0, anything else to 1
             The result is a list of 0s and 1s, with 0 having 25% chance to appear
 *V      Q   Vectorised multiplication of the above with Q
s            Concatenate into string, implicit print

Q入力がpython-esqueでない場合、エラーがスローされます。たとえば、[1またはからのエラーa/bQwおよびzシングルライン入力のための唯一の仕事は、その最良の選択肢は、おそらくになりますj.z
ar4093

4

Cubix、20バイト

u$w\A|UDw@?;...>o._U

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

取り除くことができないように多くのノーオペレーションがあったので、私が期待していたよりも長く。キャラクターをドロップする確率は25%です。これは大丈夫だと思います。

    u $
    w \
A | U D w @ ? ;
. . . > o . _ U
    . .
    . .

実行を見る

簡単な説明:

  • A|A これにより、スタックが初期化され、すべて入力、反射、すべて入力(EOI -1のみ)
  • ;? スタックのポップ、EOI(-1)のテスト。
  • _?@ 負の場合、テストに戻り、停止して終了
  • $D\ランダムな方向セッターにジャンプします。
    • 方向設定器から、3方向がofor出力につながり、ループに戻りoます。そのパスに失敗すると、ループに直行します。


3

網膜、15バイト

/./_?(`.







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

/./_

各文字を個別に処理します。

?(`

置換をランダムに実行します。最初の置換は文字を削除しますが、他の3つは変更せずに25%文字を削除します。これは、必要に応じて追加の改行ペアを追加することで減らすことができます。


3

R32 23バイト

function(x)x[rt(x,3)<1]

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

入力として文字ベクトルを取り、処理された文字ベクトルを返す関数。各キャラクターは20%の確率で除去されます。

7バイトの節約を支援してくれた@Rolandと@Giueseppe、さらに2バイトの@JDLに感謝します!


1
function(x)x[!rbinom(x,1,0.2)]
ローランド

@Rolandと同じ行に沿ってfunction(x)x[rf(x,1,1)>1]df(1,1,1)です0.16トリックをしています。
ジュゼッペ

またはrt(x,3)>1(約20%の確率)
JDL

2
@JDL <1ですが、ありがとう!別の2個が保存されました。
ニックケネディ

3

T-SQL 2012、83バイト

入力を右から左にループして、0または1文字を削除します。

各キャラクターが削除される確率は25%です。

DECLARE @i varchar(max)='The cat ate my homework'

DECLARE @ int=len(@i)WHILE @>0SELECT
@i=stuff(@i,@,str(rand()*2)/2,''),@-=1PRINT @i

説明:

rand()*2stuffコマンドで使用できないフロートを返します。

は、strこれを最も近い整数に丸めた後、varcharに変換します。フロートはvarcharに変換されています(stuffどちらも3番目のパラメーターとして許可されていません)。

このvarcharには、25%の確率で「2」、50%の確率で「1」、25%の確率で「0」があります。2で除算すると、結果が1になる確率は25%です。この除算は、varcharを整数に変換します。

整数は、stuff関数で予想される3番目のパラメーターです。

オンラインで試す


との非常に素晴らしいトリックSTR、私はそれを覚えておく必要があります。DECLARE(カウントされた)コードで(カウントされていない)おんぶするのが正しいかどうかはわかりません。あなたが余分排除することができますので、それを変更するだけで、あなたに1バイトの費用がかかるだろうSETDECLARE @ INT=len(@i)
BradC

@BradC私は同意する、と私は将来的にピギーバックしないように覚えてしようとします
t-clausen.dk

2

J、10バイト

#~5>6?@$~#

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

AdamのAPLの回答に似ていますが、実際に彼の意見を見る前に書きました。

  • 6.. $~ #入力の長さを取り、数字6をその長さのリストに#整形$~します。
  • ?@そのリストの各6個をダイスとして扱い、?それをロールします。
  • >5ダイは5未満ですか(可能な値は0..5)?そのブール結果を使用して、ビットマスクを作成します。
  • #~ そのマスクで入力をフィルタリングします。


2

Javascript、 46   44  51バイト

i=>alert([...i].filter(c=>Math.random()>.2).join``)

STDOUT要件が追加されたため、+ 7バイト

-2バイト、Birjolaxewに感謝


元の回答:STDOUT要件なしの44バイト

i=>[...i].filter(c=>Math.random()>.2).join``

関数の名前を使用しないので、関数自体を提供するだけです。削除f=すると、44バイトになります。配列として入出力することもできます。これにより、かなりの節約になります。
ビルジョラクセ

私はそれをchar配列の使用言語は、文字列がある場合は不許可の問題を理解するように私にはよく分からないけど@Birjolaxew
jonatjano

はい、アンドリューは私のコメントの後に追加要件を付けて質問を編集しました。これは、以前は有効だった回答を無効にするため、一般的に嫌われています(この場合、最初の回答が「出力はSTDOUT経由でなければならない」要件に適合するかどうかは議論の余地があります)。
ビルジョラクセ

どういうjoin``意味ですか?仕様でそれを見つけることができません(私は本当にそれが何であるか知らないので)
nick zoum

1
ES6で@nickzoumそれは同等ですjoin("") mdn revelent page
jonatjano

2

Scala51 46 30バイト

s=>s.flatMap(x=>if(math.random>.2)Some(x)else None)

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

PS。他の多くのソリューションと同様に、チャーを落とす確率は20%です。

更新:

flatMapでOption [String]の代わりにStringを使用して-5バイト

s=>s.flatMap(x=>if(math.random>.2)x+""else "")

フィルターを使用して30バイト

s=>s.filter(x=>math.random>.2)

1
とを変更するscala.math.randomことでmath.random、7バイトを削ることができます。^のような^を使用した素敵なトリック。0.2.2
Kjetil S.

@KjetilS、ありがとう。また、ソリューションとして関数定義の代わりに関数リテラルを投稿しました。これは、これに応じて許容可能である:codegolf.stackexchange.com/questions/3885/...
博士Yウィット

2

C#(Visual C#Interactive Compiler)、71バイト

var y=new Random();foreach(var k in ReadLine())if(y.Next(5)<4)Write(k);

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


<1は食べ過ぎです。<3または<4は、問題のパラメーターと一致する可能性があります。とにかく、これはコードの長さを変更しません。
ルカ

私はしばらくの間C#でプログラミングしていませんが、なぜnew Random().Next(5)直接不可能ですか?
ケビンクルーッセン

1
@KevinCruijssenその場合、各シードには同じシードが使用されるため、各数値は同じになります。で試してみてnew Random().Next(5)ください。あなたが得るのは、入力全体か無かです。
無知の具体化

1
@KevinCruijssenを使用するnew Random()場合、デフォルトのシード値はEnvironment.TickCountで、ミリ秒ごとに増加します。それらがすべて同じミリ秒の目盛りで作成される場合、それらはすべて同じシードを持ちます。答えは、Randomの単一のインスタンスのみを使用し、呼び出されると内部シード値を更新するため、Next()が呼び出されるたびに、異なる出力値が作成されます。ただし、.Net CoreはシングルトンRNGを使用してシードを生成するため、この問題は発生しません
Zac Faragher

1
@BenjaminUrquhart修正されましたが、26バイト追加されました。また、一つは入力からでなければなら言っていないと主張することができSTDIN、しかしrestricted to STDIN or closest equivalent、および関数の引数は、最も近い同等のかもしれませんが、私はやるつもりはない
無知の実施の形態を


1

C(gcc)、50バイト

このプログラムでは、20%の確率で手紙がドロップされます。残念ながら、乱数ジェネレータはシードされていないため、実行するたびに同じシーケンスが取得されます。基本的に、唯一のトリックは、EOFでループを停止するために入力文字を反転することです。

main(c){for(;c=~getchar();rand()%5&&putchar(~c));}

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

C(gcc)64 59バイト

-5バイトのceilingcatに感謝します。

各実行でRNGをシードする場合。

main(c){for(srand(&c);c=~getchar();rand()%5&&putchar(~c));}

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


main()Code Golfの提出に使用する必要はありません。必要なことを行う任意の関数を定義することもできます。だからあなたは書くことができますf(c){...}
G.スリーペン


1

Java

非終端:82バイト

v->{for(int i;;i=System.in.read(),System.out.print(Math.random()<.2?"":(char)i));}

終端(TIO):105バイト

v->{var n=System.in;for(int i;n.available()>0;i=n.read(),System.out.print(Math.random()<.2?"":(char)i));}

標準出力の処理は本当に必要ですか?他の答えは、文字列を変換するだけの関数を作成するだけです。Javaに対して不公平のようです。このC#ソリューションが有効であれば、それs->s.filter(c->Math.random()<.2)も有効です。
ホルガー

@ホルガーInput is restricted to STDIN or closest equivalent.、そしてOutput must be through STDOUT or the closest equivalent. If your language does have STDOUT, do not output in any other way.いや、その答えは無効です
ベンジャミン・アー

1

Zsh53 41バイト

-12、GammaFunctionのおかげ

41バイト:オンラインで試してみてください!

文字の配列への入力に変換し、その後、各要素を印刷しようとするとc、それは食べていますしない限りで、((RANDOM%4))falseに評価します!

for c (${(s::)1})((RANDOM%4))&&echo $c\\c

53バイト:オンラインで試してください!

文字列の長さに対するより単純で冗長な反復。

for ((;i<$#1;i++)){((RANDOM%4>0))&&echo "${1[i]}\c";}

1
のスマートな使用\c、私はそれを覚えていなかっただろう!まだいくつかの最適化が行われています...
GammaFunction

ナイスで巧妙なRANDOM配列変換と配列変換
roblogic

1

Zsh、50バイト

for c (${(s::)"$(<&0)"})
((RANDOM%5))&&echo -nE $c

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

RobLogicの答えに似ていますが、入力要件をより厳密に順守しており、バックスラッシュを含む入力に対して機能します。

"$(<&0)"代わりに、"<&0"または$(<&0)1つ目は置換では機能せず、2つ目は改行を使用します。-nEフラグはエスケープシーケンスとして解析されるのバックスラッシュを防ぐために、改行が挿入されるのを防ぐために必要です。

echo -nE


1

MathGolf、5バイト

æƒ√∞*

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

説明

æ       foreach character...
 ƒ      random float in range [0,1)
  √     take square root (making P(x < 0.5) = 0.25)
   ∞    pop a, push 2*a
    *   repeat character int(x) times

ランダム値に応じて、各文字が0回または1回繰り返されます。平方根の後の期待値はシフトされるため、各文字が削除される確率は25%です。

代替の5バイト

gÉ;4w

[0、4]の乱数で文字をフィルターします。フィルタリングの仕組みにより、フィルターループ内の実際の文字を破棄する必要があり、1バイトが追加されます。


0

GFortran、120バイト

廃止予定のRAN()関数を使用すると、それほど悪くはありません。これは、疑似ランダムです。つまり、毎回同じシーケンスを取得します。GFortranで乱数を生成する適切な方法はでCALL RANDOM_SEED()ありCALL RANDOM_NUMBER(R)、それは大量のバイトです!

character(99)S;read(*,'(A)')S;do i=1,len_trim(S)
if(ran(0)*5.gt.1)then;write(*,'(A)',advance="no")S(i:i)
endif;enddo;end

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


1
ランダムアクションを保持するために最も近い方法である場合、疑似ランダム性が許可されます。
アンドリュー

0

Oracle SQL、133バイト

select listagg(decode(sign(dbms_random.value-0.2),1,substr(x,level,1)))within group(order by level)from t connect by level<=length(x)

入力データがテーブルt(x)に保存されるという仮定で動作します。例えば

with t(x) as (select 'The cat ate my homework' from dual)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.