面倒な7つのルール


11

ランダウン

乱数でランダムな長さの配列を生成するプログラムを作成し、配列を変更する一連のルールを適用します。ルールが適用された後、特に指定されない限り、配列の合計を出力します

アレイのセットアップ

配列は5〜10のランダムな長さで、1〜20のランダムな整数でなければなりません。各配列の長さは発生する確率が等しく、各整数は要素ごとに選択される確率が等しい必要があります。

7つのルール

ルールは順番に適用されたかのように動作する必要があり(たとえば、ルール1はルール2の前に動作します)、一度だけ適用されます。ルールの適用を証明するために、各ルールの適用後、ルールが適用される前に1回、配列をコンソールに出力する必要があります。

  1. 配列に7が含まれる場合、すべての要素から1を引きます
  2. ルール1が適用され、配列に0が含まれている場合、各要素に1を追加します
  3. 配列に13が含まれる場合、13から、およびそれに続くすべての要素を配列から除外します
  4. 配列に2が含まれる場合、すべての奇数を除外します
  5. 配列に20が含まれ、3番目の要素が偶数の場合、合計として20を返し、終了します。20が存在し、3番目の要素が奇数の場合、合計が終了するときに配列の長さの20倍を返します。
  6. 合計が50を超える場合、最後の要素が50以下になるまで繰り返し最後の要素を削除します
  7. 配列に16が含まれている場合、合計を10進数と16進数の両方で出力します。

これが初期配列です。

[20, 2, 5, 7, 14, 8]

ルール1を適用できます:

[19, 1, 4, 6, 13, 7]

次にルール3が適用されます。

[19, 1, 4, 6]

他のルールは必要ないため、プログラムは合計として30を返します。

ノート

  • 私は経験豊富なコードゴルファーではありませんが、私の個人的な記録は369バイトの Python 3であると言えます
  • ルールを実際に順番に適用する必要はありませんが、実際に適用するかのように動作する必要があります。

1
「ランダム」はどのくらいランダムである必要がありますか?
-HyperNeutrino

1
@HyperNeutrinoそれはあなたが望むようにsudo-randomにすることができますが、投げに挑戦しません。繰り返し可能です。
グラビトン

ルールを実際に適用したかどうかをどのように確認しますか?50未満の乱数を生成するだけで、技術的にはルールに違反することはなく、ルールに「従った」と言えます。編集:これはうまくいかないことに気づきましたが、人々はランダムなルールを回避する方法を見つけるでしょう。それを防ぐつもりですか?
-clismique

1
現時点では、2つの配列[3 3 3 3 4 3]とのいずれかを選択し[4 4 3 4 4]、それぞれ確率50%で、「配列の設定」に記載されている内容に準拠しています。だから私は19毎回出力することができますか?(もちろん、私が本当に思うのは、「ランダム」の定義を明確にする必要があるということです。)
グレッグ・マーティン

2
If the array contains a 20, and the third element is even/odd、このステップで配列の要素が3つ未満の場合はどうなりますか?
エミグナ

回答:


8

Python 3、294 301 287 356バイト

import random as r
r=r.randint
k=[r(i)+1for i in[20]*r(5,11)]
p=print
if 7in k:k=[i-1for i in k]
p(k)
if 0in k:k=[i+1for i in k]
p(k)
i=k.find(13)
if not~i:k=k[:i]
p(k)
if 2in k:k=[i for i in k if~i%2]
p(k)
a=0
z=len(k)>2and k[2]%2
if 20in k:a=20*len(k)**z
if~z:p(k)
while sum(k)>50:k=k[:-1]
if~z:p(k)
if a:p(a)
else:a=sum(k);p(a,hex(a)*(16in k))
if~z:p(k)

ルールを回避する人をどのように防ぐかはわかりませんが、これは指定された手順を使用します。

+7バイト。数バイトを節約してくれた@YamBに感謝します。以前のエラーを修正するためにさらに多くを追加しました。
@RootTwoと私に-14バイトを感謝し、エラーも修正しました。
+83バイト; OPはルールを変更し続けるため、これはひどく長くなっています。-@ZacharyTのおかげで、ある程度のバイト数


正直に言ってくれてありがとう。
グラビトン

「randint as r」をインポートし、「if 7in k and 1not in k:k = [i-1 ...」を「if 7in k:k = [i + 1-int(1in k )... '
グラビトン

kを初期化するとき、iの値は必要ないので、で6バイト節約できますk=[r(1,20)for _ in'-'*r(5,11)]k=[i+~-(1in k)*(7in k)for i in k]ルール1と2 を使用して別のバイトを保存できます
。– RootTwo

1
@ Notts90このチャレンジを書いた後、ルールが変更されました。コンピューターに着いたら直します。ありがとう。
ハイパーニュートリノ

5行目と7行目では1、の後に不要なスペースがありprint、2行目と3行目から最後の行までをに変更できますp。そして、あなたは...バイトカウントを更新していません。
ザカリー

6

05AB1E、91バイト

5TŸ.RF20©L.R})=D7åi<=D0åi>=}}D13åiD13k£=}D2åiDÈÏ=}D®åiDgs2èÉ®si*},q}[DO50›_#¨=]D16åiDOH,}O,

オンラインでお試しください! または入力あり


84バイト、そして潜在的に正しい?違う?わからない。 tio.run/nexus/...
マジックタコ壺

@carusocomputing:徹底的に調べたことはありませんが、最初はランダム配列を生成せず、中間結果も出力しません。これらのパーツを追加すると、少し長くなります。
エミグナ

6

Javascript(ES6)、344 342 340 342 335 331 333 313 311 305 298 297 290 289 283 279バイト

ハザ!最終的ビートアーナウドと結ばれました

チャレンジのコメントでこの交換に続い、多くの審議の後new Date、の代わりに乱数ジェネレーターのシードとして使用することにしましたMath.random()。これにより、配列内のすべての整数が同じ値になります。

_=>(l=alert,r=new Date,l(a=[...Array(r%6+5)].map(x=>r%20+1)),i=v=>~a.indexOf(v),i(7)&&l(a=a.map(x=>--x)),i(0)&&l(a=a.map(x=>++x)),i(13)&&l(a=a.slice(0,~i(13))),i(2)&&l(a=a.filter(x=>x%2)),i(t=20)?a[2]%2?t*a.length:t:l(a=a.filter(x=>s+x<51?s+=x:0,s=0))|i(16)?[s,s.toString(16)]:s)

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

f=
_=>(l=alert,r=new Date,l(a=[...Array(r%6+5)].map(x=>r%20+1)),i=v=>~a.indexOf(v),i(7)&&l(a=a.map(x=>--x)),i(0)&&l(a=a.map(x=>++x)),i(13)&&l(a=a.slice(0,~i(13))),i(2)&&l(a=a.filter(x=>x%2)),i(t=20)?a[2]%2?t*a.length:t:l(a=a.filter(x=>s+x<51?s+=x:0,s=0))|i(16)?[s,s.toString(16)]:s)
alert(f())

  • ルール6でポップされた要素のみを記録することで2バイトを節約しました。
  • に置き換えArray(x).fill()て2バイトを節約しました[...Array(x)]
  • ルール5で台無しになったため、2バイトを追加しました!
  • 以前の混乱を修正しようとして作成した混乱を修正する7バイトを保存しました!
  • Arnauldのおかげで、ルール2でブレインファートを治すことができ、3バイトを節約でき+1ました。~
  • 2バイトを追加しました 0空の配列に対してに返される。
  • 最終的にその欠陥を捨てる方法を考え出すことで20バイトを節約しました whileループ。
  • ,最後の2つのステートメントの間をaに置き換えることで2バイトを節約しました|、囲んを削除することにより、()
  • 置換により6バイトを節約 console.logてたalert
  • のショートカットを改善して7バイトを節約しました a.includes()
  • ルール3の実装を編集して1バイトを保存しました。
  • 溝を開けincludes()て使用するだけで7バイト節約indexOf()全体を通してでました。
  • s変数の初期宣言をコンマを必要としない場所に移動して1バイトを節約しました。
  • に置き換えMath.random()て6バイトを節約しましたnew Date
  • 乱数の(現在は冗長な)丸めを削除して4バイトを節約しました。

読み取り可能およびテスト可能なバージョン

  • コードに改行とコメントを追加しました
  • あなたの正気のconsole.log代わりに使用さalertれます!(お使いのブラウザのコンソールで最適に表示されます)
  • 現在のルール番号を出力に追加しました。
  • ランダム配列の生成をコメントアウトして、カンマ区切りの数値リストの入力によるテストを可能にしました。


*スクリーンショット、削除された場合:


4

C(GCC) 621 619 593 585 570 562 557 552 529 517 500 482 461 444 442 441 438バイト

ここにはたくさんのゴルフが必要です...リストの16ごとに16進数を1回印刷するバグを修正しました...

ゴルフの助けを借りてZacharyTに感謝します

#define R r[i]
#define P printf("%d "
#define L for(d=i=0;i<l;i++)
d,i,j,l,r[11];p(i){L P,R);puts("");}main(){srand(time(0));for(l=5+rand()%5;i<l;R=1+rand()%20,i++);for(p();i--;)if(R==7){L--R;j=i=1;}for(p();j&&i<l;i++)if(!R){L++R;j=i=l;}p();L if(R==13)l=i;p();L if(R==2)for(d=1;d;)L if(R&1)for(d=1,--l;i<=l;i++)R=r[i+1];p();L if(R==20)return P,r[3]&1?20*l:20);for(j=i=0;i<l&&j+R<51;j+=R,i++);l=i;p();P,j);L if(R==16)printf("0x%x",j,i=l);}

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


1
あなたはまだたくさんゴルフをすることができますが、あなたはすでに私のJavaの答えより1バイト下にあります。;)
ケビンクルーッセン

OK用-3バイト何かを見つけた; P
ケビンCruijssen

あなたがこれを下にゴルフできるなら、あなたはそこに「消された444はまだ444」を得ることができるかもしれません!:D
HyperNeutrino

@HyperNeutrinoがさらに2バイトをゴルフオフ
cleblanc

わーい!良い仕事:D
HyperNeutrino

3

JavaScript(ES6)、296 295 290 289バイト

初期配列、中間結果、および最終合計をコンソールに記録する完全なプログラム。

f="z=[...Array(5+6j)]Z1+20jw7`-1w0`+1w13_qi+1<-kw2_qn&1^1w20_z[2]&1?a.length*20:20);else{q(s+=n)<51,s=0w16_b.toString(16_;b)}zconsole.log(aw_;if(k=~a.indexOf(v((n,i)=>qz=a.filtervj*Math.random()|0bz.reducevn+i,0)`_z=aZn_))Z.mapv";for(g of "Z_`bjqvwz")e=f.split(g),f=e.join(e.pop());eval(f)

使い方

これは、このJSパッカーを使用し圧縮されました。

壊す:

  • パックされた文字列:226 225バイト
  • 開梱コード:69 64バイト

以下は、読みやすくするために空白と改行を追加した元のソースコードです。標準的なゴルフトリックを適用するのではなく、パッカーを喜ばせるために、できるだけ多くの繰り返し文字列を生成する方法で作成されました。たとえば、構文if(k=~a.indexOf(N))はどこでも複製kされますが、3番目のルールでのみ使用されます。

console.log(a=[...Array(5+6*Math.random()|0)].map((n,i)=>1+20*Math.random()|0));
if(k=~a.indexOf(7))
  console.log(a=a.map((n,i)=>n-1));
if(k=~a.indexOf(0))
  console.log(a=a.map((n,i)=>n+1));
if(k=~a.indexOf(13))
  console.log(a=a.filter((n,i)=>i+1<-k));
if(k=~a.indexOf(2))
  console.log(a=a.filter((n,i)=>n&1^1));
if(k=~a.indexOf(20))
  console.log(a[2]&1?20*a.length:20);
else {
  console.log(a=a.filter((n,i)=>(s+=n)<51,s=0));
  if(k=~a.indexOf(16))
    console.log(a.reduce((n,i)=>n+i,0).toString(16));
  console.log(a.reduce((n,i)=>n+i,0))
}

開梱方法

元の解凍コードは次のとおりです。

f="packed_string";for(i in g="ABCDEFGHI")e=f.split(g[i]),f=e.join(e.pop());eval(f)

次のES6バリアントはすべて、まったく同じサイズです。

eval([..."ABCDEFGHI"].reduce((f,g)=>(e=f.split(g)).join(e.pop()),"packed_string"))
[..."ABCDEFGHI"].map(g=>f=(e=f.split(g)).join(e.pop()),f="packed_string")&&eval(f)
eval([..."ABCDEFGHI"].map(g=>f=(e=f.split(g)).join(e.pop()),f="packed_string")[8])

私がこれまでに数バイトを削る唯一の方法は、使用することfor ... ofです:

f="packed_string";for(g of "ABCDEFGHI")e=f.split(g),f=e.join(e.pop());eval(f)

電話でこれを読むと間違っているかもしれませんが、展開したコードでは、ルール1が適用されているかどうかに関係なく、ルール2が適用されているようです。
シャギー

1
@Shaggyそれは正しい。ただし、ルール1がトリガーされない限り、ゼロを取得することはできません。
アーナルド

どっ!もちろん!男、私はこの挑戦の間に途方もない数の脳梗塞を起こしてきました:(
シャギー

1
@Shaggy残念ながらそうではありません。ただし、1バイトを節約できますn&1^1(まったくパックされませんが、1バイトより短いだけです!(n&1))。ある時点でそれについて考え、それを含めるのを忘れました。
アーナルド

1
@Shaggy Ahah!良くやった!
アーナウド

2

最初にコードゴルフをお試しください!

すでに他のjavascriptersに勝っています!ダンギット!私は改善します!!! =)

Javascript-> 550 402バイト

間違いなく改善される可能性があります。今すぐ圧縮:

f="ba=[];bl;yz5+5`^=0;i<y;i++)a[i]z20+1|~7j-1|~0j+1|}}~13_l=indexOf(13`ql,y-l-Y_^ in a)if(a[i]%2)qi,Y0)&&(!a[3]%2_k'20'`throw new Error(`}do{l=Vreduce((X,num)=>X+num`ifW)qy-1,1`}whileW|kl`~16))kl.toString(16)`~if(Vincludes(|`ka`z=Zound(Zandom()*yVlengthqVsplice(kalert(j_Vmap((i)=>ibvar `);_)){^for(biZMath.rY1|}~2XtotalW(l>50Va.";for(i in g="VWXYZ^_`bjkqyz|~")e=f.split(g[i]),f=e.join(e.pop());eval(f)

元の:

var a=[];var l;a.length=Math.round(Math.random()*5+5);for(var i=0;i<a.length;i++)a[i]=Math.round(Math.random()*20+1);alert(a);if(a.includes(7)){a.map((i)=>i-1);alert(a);if(a.includes(0)){a.map((i)=>i+1);alert(a);}}if(a.includes(13)){l=indexOf(13);a.splice(l,a.length-l-1);alert(a);}if(a.includes(2)){for(var i in a)if(a[i]%2)a.splice(i,1);alert(a);}if(a.includes(20)&&(!a[3]%2)){alert('20');throw new Error();}do{l=a.reduce((total,num)=>total+num);if(l>50)a.splice(a.length-1,1);}while(l>50);alert(a);alert(l);if(a.includes(16))alert(l.toString(16));

2

Java 7、622 619 618バイト

import java.util.*;void c(){Random r=new Random();List<Long>l=new ArrayList();int i=0,c=r.nextInt(6)+5;for(;i++<c;l.add(r.nextInt(20)+1L));p(l);if(l.contains(7)){for(i=0;i<c;l.set(i,l.get(i++)-1));p(l);}if(l.contains(0)){for(i=0;i<c;l.set(i,l.get(i++)+1));p(l);}if((i=l.indexOf(13))>=0){for(;i<l.size();l.remove(i));p(l);}if(l.contains(2)){for(i=0;i<l.size();)if(l.get(i)%2>0)l.remove(l.get(i));else i++;p(l);}if(l.contains(20)){p(20*(l.get(2)%2<1?1:l.size()));return;}i=0;for(long x:l)i+=x;for(;i>50;)i-=l.remove(l.size()-1);p(l);if(l.contains(16))p(Byte.valueOf(i+"",16));p(i);}<T>void p(T t){System.out.println(t);}

@Pokeのおかげで-1バイト

説明:

import java.util.*;                      // Imports used for List, ArrayList and Random

void c(){                                // Main method
  Random r=new Random();                 //  Random generator
  List<Long>l=new ArrayList();           //  The list
  int i=0,                               //  Temp index we use multiple times
      q=r.nextInt(6)+5;                  //  Random size of the list (5-10)
  for(;i++<q;l.add(r.nextInt(20)+1L));   //  Fill the list with random long-integers (1-20)
  p(l);                                  //  Print the initial list
  if(l.contains(7)){                     //  If the list contains a 7
    for(i=0;i<c;l.set(i,l.get(i++)-1));  //   Decrease each number in the list by 1
    p(l);                                //   And then print the list again
  }                                      //  End of if
  if(l.contains(0)){                     //  If the list now contains a 0
    for(i=0;i<c;l.set(i,l.get(i++)+1));  //   Increase each number in the list by 1
    p(l);                                //   And then print the list again
  }                                      //  End of if
  if((i=l.indexOf(13))>=0){              //  If the list contains a 13 (and save it's index in `i` at the same time)
    for(;i<l.size();l.remove(i));        //   Remove everything from that index and onward
    p(l);                                //   And then print the list again
  }                                      //  End of if
  if(l.contains(2)){                     //  If the list now contains a 2
    for(i=0;i<l.size();)                 //   Loop over the list
      if(l.get(i)%2>0)                   //    If the current list item is odd
        l.remove(l.get(i));              //     Remove it
      else                               //    If it's even instead
        i++;                             //     Go to the next item
                                         //   End of loop (implicit / single-line body)
    p(l);                                //   And print the list again
  }                                      //  End of if
  if(l.contains(20)){                    //  If the list now contains a 20
    p(20*(l.get(2)%2<1?1:l.size()));     //   Print 20 if the third item in the list is odd, or 20*size if it's even instead
    return;                              //   And then terminate the method
  }                                      //  End of if
  i=0;                                   //  Reset `i` to 0
  for(long x:l)i+=x;                     //  And calculate the total sum of the list (stored in `i`)
  for(;i>50;)                            //  Loop as long as this list's sum is above 50
    i-=l.remove(l.size()-1);             //   Subtract the last item from this sum, and then remove it from the list
                                         //  End of loop (implicit / single line body)
  p(l);                                  //  And print the list again
  if(l.contains(16))                     //  If the list now contains a 16
    p(Byte.valueOf(i+"",16));            //   Print the sum (still stored in `i`) as hexadecimal
                                         //  End of if (implicit / single-line body)
  p(i);                                  //  And print the sum as integer either way
}                                        // End of main method

<T>void p(T t){                          // Separate method with a generic parameter
  System.out.println(t);                 //  Print the given parameter including a new-line
}                                        // End of separated method

サンプル出力:サンプル出力の
背後にあるコメントは印刷されませんが、説明として追加しました。

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

[17, 5, 3, 1, 16, 17, 11, 7, 13]   // Initial print (size 9)
[16, 4, 2, 0, 15, 16, 10, 6, 12]   // Rule 1 (contains a 7)
[17, 5, 3, 1, 16, 17, 11, 7, 13]   // Rule 2 (contains a 0)
[17, 5, 3, 1, 16, 17, 11, 7]       // Rule 3 (contains a 13)
[17, 5, 3, 1, 16]                  // Rule 6 (sum must be <= 50)
66                                 // Rule 7 (contains a 16 -> print as Hexadecimal)
42                                 // Print sum as integer

[4, 18, 17, 12, 11, 8]             // Initial print (size 6)
[4, 18, 17]                        // Rule 6 (sum must be <= 50)
39                                 // Print sum as integer

[4, 14, 6, 14, 7, 20, 2, 2]        // Initial print (size 8)
[3, 13, 5, 13, 6, 19, 1, 1]        // Rule 1 (contains a 7)
[3]                                // Rule 3 (contains a 13)
[3]                                // Print is always done after rule 6
3                                  // Print sum as integer

1
私は今594バイトになっています:
-D

@cleblanc 444になりました。Javaと競合することはできません。:)(おもしろいのは、444は他のすべての回答と比較して勝ち目が近いということではないからです。)
ケビンクルーッセン

05AB1Eのようなゴルフ言語でさえ、ほぼ100バイトの長さです。この挑戦は苦痛でした。
cleblanc

リストを汎用のままにしておくことはできますList a = new ArrayList()か?いくつかのバイトを節約できます。ただし、実際の算術演算を行う場合は、タイプキャストを追加する必要があります。そうでない場合、Longより短いInteger
ポケ

@PokeジェネリックListでは、(int)キャストを5回使用し、for-eachループをintto から変更してObject、6番目のキャストを追加する必要があります。Long:1つのバイトを節約おかげで、:)(まだからのために、それぞれ変更する必要がありますintlong、とr.nextInt(20)+1しますr.nextInt(20)+1L)。
ケビンCruijssen

2

Ruby 2.4、260バイト

にはRuby 2.4が必要ですEnumerable#sum

p a=(1..s=5+rand(5)).map{1+rand(19)}
a.map!{|i|i-1}if a.index 7
p a
a.map!{|i|i+1}if a.index 0
p a
a.pop s-(a.index(13)||s)
p a
a.reject! &:odd?if a.index 2
p a
a.index(20)?p(20*[1,s][(a[2]||1)%2]):((a.pop;p a)while a.sum>50
p m=a.sum;puts"%x"%m if a.index 16)

オンラインでお試しください!(repl.itもtio.runもまだRuby 2.4をサポートしていないため、このオンラインバージョンはに置き換えsumられinject(:+)、同じ動作をします。)


1

R(3.3.1)、325バイト

かなり素朴な実装。おそらく少し短くできると思います。

s=sample(1:20,sample(5:10,1));print(s);if(7%in%s){s=s-1;print(s);if(0%in%s)s=s+1;print(s)};if(13%in%s){s=s[1:(which(s==13)-1)];print(s)};if(2%in%s){s=s[!(s%%2)];print(s)};if(20%in%s){if(s[3]%%2){20*length(s);print(s)}else{20;print(s)}};while(sum(s)>50){s=s[-length(s)];print(s)};if(16%in%s){print(as.hexmode(sum(s)))};sum(s)

1

PowerShell525 413バイト

filter a{"$a"};0..(4..9|random)|%{$a+=@(1..20|random)};a;if(7-in$a){$a=($a|%{$_-1});a;if(0-in$a){$a=($a|%{$_+1});a}}$b=$a;$a=@();foreach($z in $b){if($z-ne13){$a+=@($z)}else{a;break}}if(2-in$a){$a=($a|?{$_%2-eq0});a}if(20-in$a){if($a[2]%2){20*$a.count;exit}else{20;exit}}while(($h=$a-join'+'|iex)-gt50){$a=$a[0..($a.count-2)];a}if(16-in$a){$l=0..9+'a b c d e f'-split' ';$q=[math]::floor($h/16);"$q"+$l[$h%16]};$h

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

私はこれを試してみたかったのですが、ここですでに答えに勝るものはないと思っていました。16進数のより良い方法を見つけましたが、おそらくまだ改善される可能性があります。

キャストしなければならなかった $a文字列に何回もしので、そのためのフィルターを作成した方が良い...

かっこやスペースなど、見落としがちなゴルフがかなりありました。まだそこにあるのでしょうか?

やや読みやすいコード:

filter a{"$a"};0..(4..9|random)|%{$a+=@(1..20|random)};a;
if(7-in$a){$a=($a|%{$_-1});a;if(0-in$a){$a=($a|%{$_+1});a}}
$b=$a;$a=@();foreach($z in $b){if($z-ne13){$a+=@($z)}else{a;break}}
if(2-in$a){$a=($a|?{$_%2-eq0});a}
if(20-in$a){if($a[2]%2){20*$a.count;exit}else{20;exit}}
while(($h=$a-join'+'|iex)-gt50){$a=$a[0..($a.count-2)];a}
if(16-in$a){$l=0..9+'a b c d e f'-split' ';$q=[math]::floor($h/16);"$q"+$l[$h%16]};$h

0

MATLAB、275バイト

私はもともとオクターブの1行の回答を計画していましたが、適用されたすべてのルールの出力が必要なため、計画が妨げられました。代わりに、ルール6 cumsumの明白な代わりに使用するなど、いくつかの興味深い最適化を備えたかなり簡単なMATLABの回答。whileif

A=randi(20,1,randi(6)+4)
if any(A==7)
A=A-1
if any(~A)
A=A+1
end;end
q=find(A==13,1);if q
A=A(1:q-1)
end
if any(A==2)
A=A(2:2:end)
end
if any(A==20)
if mod(A(3),2)
20*length(A)
else
20
end;return;end
q=cumsum(A)<51;if any(~q)
A=A(q)
end
q=sum(A)
if(any(A==16))
dec2hex(q)
end

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


0

Scala 587バイト1ライナー

import scala.util.Random;object A{def main(args:Array[String])={val s=5+Random.nextInt(6);var a=new Array[Int](s);for(i<-1 to s){a(i-1)=1+Random.nextInt(20)};p(a);if(a.contains(7)&& !a.contains(1)){a.map(a=>a-1);p(a)};if(a.contains(13)){if(a(0)==13)a=new Array[Int](0)else a=a.slice(0,a.indexOf(13));p(a)};if(a.contains(2)){a=a.filter(pred=>pred%2==0);p(a)};if(a.contains(20)){if(a(2)%2==0)println(20)else println(20*a.length)}else{while(a.sum>50)a=a.dropRight(1);val u=a.sum;if(a.contains(16))println(Integer.toHexString(u));println(u)}};def p[T](a: Array[T])=println(a.mkString(","))}

Scala、763バイトそのまま

import scala.util.Random
object TA {
  def main(args:Array[String])={
    val s=5+Random.nextInt(6)
    var a=new Array[Int](s)
    for (i<-1 to s)
      a(i-1)=1+Random.nextInt(20)
    p(a)
    if(a.contains(7) && !a.contains(1)){
      a.map(a=>a-1)
      p(a)
    }
    if(a.contains(13)){
      if (a(0)==13) a=new Array[Int](0) else a=a.slice(0,a.indexOf(13))
      p(a)
    }
   if(a.contains(2)){
      a=a.filter(pred=>pred%2== 0)
      p(a)
    }
    if(a.contains(20)){
      if (a(2)%2==0) println(20) else println(20*a.length)
    }else{
      while(a.sum>50)
        a=a.dropRight(1)
      val u =a.sum
      if (a.contains(16)) println(Integer.toHexString(u))
      println(u)
    }
  }
  def p[T](a: Array[T])={
    println(a.mkString(","))
  }
}

これはコードゴルフの質問なので、不要な空白を削除するなど、少なくとも簡単なゴルフをするようにお願いします。
ポストロックガーフハンター

1行の低バイトバージョンを追加しました
サイディープサンバラジュ

Scalaを知りませんが、スペースはa: Array[T]必要ですか?にスペースがありませんargs:Array[String]。これが私の調査の結果です。
ザカリー

いいえ、私はそれを逃したと思います。
サイディープサンバラジュ

0

MATLAB、228 241バイト

a=randi(20,1,randi(6)+4)
b=@any; 
a=a-b(a==7)
a=a+b(a==0)
a(find(a==13,1):end)=[]
a(and(mod(a,2),b(a==2)))=[]
if b(a==20)
a=[a 0 0 0];
s=20*(1+mod(a(3),1)*(numel(a)-4))
else
a(cumsum(a)>50)=[]
s=sum(a)
if b(a==16)
h=['0x' dec2hex(s)]
end
end

これにより、すべてのルールが順番に適用され、各ステップの後に配列値が出力されます。

結果の要素数が3未満の場合、プログラムはルール5でクラッシュします。現在、3番目の要素がない場合に何が起こるべきかを言うことはないので、クラッシュが許容されると想定しています。3個未満の要素があり、1つ以上が20である場合、プログラムは20を印刷するようになりました。

興味深いことに、ステップ2は、ステップ1が実行されたかどうかに関係なく適用できます。これは、入力配列に0が含まれないため、配列に0がある場合、ステップ1が発生した結果でなければならないためです。

すべてのルールは、変更が行われなくても、5個まで順番に適用されます。その結果、配列は開始時に印刷され、各ステップの後に5まで続きます。ステップ5の後、合計が適用される場合、またはステップ6の後まで出力されません。a後に追加することができ配列値が2バイトのコストでステップ5の後に出力されることを保証するelseステートメント。


また、これを書いた後まで、他の答えを見なかったことにも触れたいと思います。今、いくつかの類似点を持つ別のMATLAB回答があることがわかりました。それらはすべて偶然です。


0

Python 3、297 293 289 289、278バイト

Arnauldが発見したように、インデントで保存されたルール1が適用されない限り、0を取得することはできません。提案をコメントしてくれた他のみんなにも感謝します。

from random import*
p=print
a=b=sample(range(1,20),randint(5,10))
p(a)
if 7in a:a=[i-1for i in a];p(a)
if 0in a:a=b;p(a)
if 13in a:a=a[:a.index(13)];p(a)
if 2in a:a=[i for i in a if~i%2];p(a)
if 20in a and~a[2]%2:a=[20]
while sum(a)>50:a=a[:-1]
b=sum(a)
p(b)
if 16in a:p(hex(b))

オンラインで試す


私はあなたが間にスペース必要はないと思うandとを~
ザカリー

私は信じていfrom random import* a=b=sample(range(1,20),randint(5,10))ますが、2行目を削除することができますので、いくつかのバイトを節約する
nocturama

0

Perl 6、246バイト

my&f={.grep($^a)};my&s=->{.say};$_=[(1..20).pick xx(5..10).pick];s;$_»--
if f 7;s;$_»++ if f 0;s;.splice(.first(13):k//+$_);s;$_=[f*%%2]if f 2;
s;say(20*(.[2]%%2||$_)),exit if $_>2&&f 20;s;.pop while
.sum>49;$/=f 16;$_=.sum;s;.base(16).say if $/

ゴルフをしていない:

my &f = { .grep($^a) };  # Helper function: search $_ for something
my &s = -> { .say };     # Helper function: print $_
$_ = [ (1..20).pick xx (5..10).pick ];  # Generate the initial array
s;  # Print the array
$_»-- if f 7;  # Decrement all elements if it contains a 7
s;  # Print the array
$_»++ if f 0;  # Increment all elements if a zero is found
s;  # Print the array
.splice(.first(13):k // +$_);  # Splice out everything from the first 13 onward
s;  # Print the array
$_ = [ f *%%2 ] if f 2;  # Remove all odd elements if a 2 is found
s;  # Print the array
say(20*(.[2] %% 2 || $_)), exit if $_ > 2 && f 20;  # Print and exit, maybe
s;  # Print the array
.pop while .sum > 49;  # Remove elements from the end until sum is below 50
$/ = f 16;  # Save in $/ whether $_ contains a 16
$_ = .sum;  # Set $_ to its own sum
s;  # Print the sum
.base(16).say if $/  # Print the sum in hexadecimal if the last array contained a 16

0

Common Lisp、490バイト

ここでは、配列はCommon Lispリストとして表されています。

(let((a(loop for i from 1 to(+ 5(random 5))collect(1+(random 19)))))(flet((p()(format t"~a~%"a))(m(x)(member x a))(h(x)(map-into a x a)))(p)(and(m 7)(h'1-))(p)(and(m 0)(h'1+))(p)(let((p(position 13 a)))(and p(setf a(butlast a (-(length a)p)))))(p)(and(m 2)(setf a(remove-if'oddp a)))(p)(or(and(m 20)(or(and(third a)(oddp(third a))(* 20(length a)))20))(p)(and(setf a(loop for x in a sum x into s while (<= s 50) collect x)) nil)(p)(let((s(reduce'+ a)))(print s)(and(m 16)(format t"~x"s))))))

いつものように、多くの利用andor制御構造など。

(let ((a (loop for i from 1 to (+ 5 (random 5))  ; create initial list
            collect (1+ (random 19)))))
  (flet ((p () (format t "~a~%" a))     ; auxiliary functions: print list
         (m (x) (member x a))           ; check membership
         (h (x) (map-into a x a)))      ; operate on elements
    (p)
    (and (m 7) (h '1-))                 ; if 7 is present decrement all values
    (p)
    (and (m 0) (h '1+))                 ; if 0 is now present increment all values
    (p)
    (let ((p (position 13 a)))          ; remove from 13 (if exists)
      (and p (setf a (butlast a (- (length a) p)))))
    (p)
    (and (m 2) (setf a (remove-if 'oddp a)))   ; if 2 is present remove odd values
    (p)
    (or (and (m 20)                            ; if 20 is present
             (or (and (third a)                ;    when third is present
                      (oddp (third a))         ;         and it is odd
                      (* 20 (length a)))       ;         return 20 times the length
                 20))                          ;    otherwise return 20
        (p)                                    ; otherwise (20 is not present)
        (and (setf a (loop for x in a sum x into s ; compute sum of elements
                        while (<= s 50)            ; limited to 50
                        collect x))                ; and return those elements
             nil)                                  ; (to execute the rest of the code)
        (p)
        (let ((s (reduce '+ a)))                   ; compute the final sum
          (print s)                                ; print the result in decimal
          (and (m 16) (format t "~x" s))))))       ; if 16 is present print also in hexadecimal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.