Array 7 aturan yang membosankan

11

Ikhtisar

Buat program yang menghasilkan array dengan panjang acak dengan angka acak, lalu terapkan serangkaian aturan yang mengubah array. Setelah aturan diterapkan, cetak jumlah array kecuali ditentukan lain

Pengaturan array

Array harus panjang acak antara 5 dan 10 inklusif, dengan bilangan bulat acak antara 1 dan 20 inklusif. Setiap panjang array harus memiliki probabilitas yang sama untuk terjadi dan setiap integer harus memiliki probabilitas yang sama untuk dipilih per elemen.

7 aturan

Aturan harus bertindak seolah-olah diterapkan secara berurutan (misalnya: aturan 1 bertindak sebelum aturan 2) dan hanya diterapkan sekali. Untuk bukti aplikasi aturan, array harus dicetak ke konsol setelah setiap aplikasi aturan dan satu kali sebelum aturan diterapkan.

  1. Jika array berisi angka 7, kurangi 1 dari setiap elemen
  2. Jika aturan 1 diterapkan dan array sekarang berisi 0, tambahkan 1 ke setiap elemen
  3. Jika array berisi 13, kecualikan 13, dan semua elemen yang mengikuti, dari array
  4. Jika array berisi 2, kecualikan semua angka ganjil
  5. Jika array berisi 20, dan elemen ketiga genap, kembalikan 20 sebagai penjumlahan, lalu terminasi. Jika 20 hadir dan elemen ketiga ganjil, kembalikan 20 kali panjang array sebagai jumlah kemudian diakhiri.
  6. Jika jumlahnya lebih besar dari 50, hapus elemen terakhir berulang kali hingga kurang dari atau sama dengan 50
  7. Jika array berisi 16, cetak jumlah dalam desimal dan heksadesimal.

Contoh

Berikut ini adalah array awal,

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

Aturan 1 dapat diterapkan:

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

Aturan 3 diterapkan selanjutnya:

[19, 1, 4, 6]

Tidak ada aturan lain yang diperlukan, sehingga program mengembalikan 30 sebagai jumlah.

Catatan

  • Saya bukan pegolf kode berpengalaman, meskipun saya dapat mengatakan catatan pribadi saya adalah di Python 3 dengan 369 byte .
  • Aturan tidak harus benar-benar diterapkan secara berurutan, tetapi harus bertindak seolah-olah mereka melakukannya.
Graviton
sumber
1
Seberapa acak "acak" itu?
HyperNeutrino
1
@HyperNeutrino dapat berupa sudo-acak yang Anda inginkan, tetapi tidak menantang melempar. Pengulangan diizinkan.
Graviton
Bagaimana Anda akan memeriksa jika kami benar-benar menerapkan aturan? Saya hanya bisa menghasilkan angka acak di bawah 50 dan secara teknis masih tidak akan melanggar aturan, dan saya bisa mengatakan itu "mengikuti" aturan. EDIT: Saya menyadari sekarang bahwa ini tidak akan berhasil, tetapi orang-orang akan menemukan cara untuk menghindari aturan acak. Apakah Anda akan mencegahnya?
clismique
1
Saat ini, memilih salah satu dari dua array [3 3 3 3 4 3]dan [4 4 3 4 4], masing-masing dengan probabilitas 50%, sesuai dengan apa yang tertulis di bawah "pengaturan array". Jadi saya bisa menampilkan 19setiap waktu? (Tentu saja, yang benar-benar saya pikirkan adalah bahwa definisi "acak" perlu diklarifikasi.)
Greg Martin
2
If the array contains a 20, and the third element is even/odd, bagaimana jika array memiliki kurang dari 3 elemen pada langkah ini?
Emigna

Jawaban:

8

Python 3, 294 301 287 356 byte

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)

Saya tidak tahu bagaimana Anda akan mencegah orang menghindari aturan, tetapi yang ini menggunakan prosedur yang ditentukan.

+7 byte; terima kasih kepada @YamB untuk menghemat beberapa byte; menambahkan lebih banyak untuk memperbaiki kesalahan sebelumnya.
-14 byte terima kasih kepada @RootTwo dan saya sendiri dan juga memperbaiki kesalahan.
+83 byte; ini menjadi sangat panjang karena OP terus mengubah aturan. -Beberapa jumlah byte berkat @ZacharyT

HyperNeutrino
sumber
Semua memeriksa saya, terima kasih untuk jujur.
Graviton
Anda dapat menyimpan 4 byte dengan mengimpor 'randint sebagai r' dan mengubah 'jika 7in k dan 1not dalam k: k = [i-1 ...' ke 'jika 7in k: k = [i + 1-int (1in k ) ... '
Graviton
Saat menginisialisasi k, Anda tidak perlu nilai i, sehingga Anda dapat menyimpan 6 byte k=[r(1,20)for _ in'-'*r(5,11)] . Anda dapat menyimpan byte lain menggunakan k=[i+~-(1in k)*(7in k)for i in k]untuk aturan 1 dan 2.
RootTwo
1
@ Notts90 Aturan diubah setelah saya menulis tantangan ini. Saya akan memperbaikinya ketika saya sampai di komputer. Terima kasih.
HyperNeutrino
Pada baris lima dan tujuh, Anda memiliki ruang yang tidak dibutuhkan setelah 1, dan Anda dapat mengubah printbaris kedua dan ketiga menjadi terakhir p. Dan Anda ... belum memperbarui bytecount Anda.
Zacharý
6

05AB1E , 91 byte

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

Cobalah online! atau Dengan input

Emigna
sumber
84 byte, dan berpotensi benar? Berbeda? Tidak ada ide. tio.run/nexus/…
Magic Octopus Mm
@carusocomputing: Saya belum melihatnya secara menyeluruh, tetapi tidak menghasilkan array acak di awal juga tidak mencetak hasil antara. Akan sedikit lebih lama saat menambahkan bagian-bagian itu.
Emigna
6

Javascript (ES6), 344 342 340 342 335 331 333 313 311 305 298 297 290 289 283 279 bytes

Sabas! Akhirnya diikat dengan mengalahkan Arnauld !

Mengikuti pertukaran ini * dalam komentar tantangan dan setelah banyak pertimbangan saya telah memutuskan untuk menggunakan new Datesebagai seed untuk generator angka acak Math.random(). Melakukannya berarti bahwa semua bilangan bulat dalam array akan memiliki nilai yang sama.

_=>(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)

Cobalah

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())

  • Disimpan 2 byte dengan hanya mencatat elemen yang muncul di aturan 6.
  • Disimpan 2 byte dengan mengganti Array(x).fill()dengan [...Array(x)].
  • Menambahkan 2 byte karena aku mengacaukan aturan 5!
  • Disimpan 7 byte memperbaiki kekacauan yang saya buat mencoba memperbaiki kekacauan sebelumnya!
  • Disimpan 3 byte berkat Arnauld membantu saya menyembuhkan brainfart pada aturan 2 dan menyimpan byte tambahan dengan mengganti a +1dengan a ~.
  • Menambahkan 2 byte memastikan 0dikembalikan untuk array kosong.
  • Disimpan 20 byte dengan akhirnya mencari cara untuk membuang fecking itu while .
  • Disimpan 2 byte dengan mengganti ,antara 2 pernyataan terakhir dengan a |dan menghapus lampiran ().
  • Disimpan 6 byte dengan mengganti console.logdengan alert.
  • Disimpan 7 byte dengan meningkatkan cara pintas dari a.includes().
  • Disimpan 1 byte dengan mengedit implementasi aturan 3.
  • Disimpan 7 byte dengan membuang includes()dan hanya menggunakanindexOf() seluruh.
  • Disimpan 1 byte dengan memindahkan deklarasi awal s variabel ke suatu tempat itu tidak perlu koma.
  • Disimpan 6 byte dengan mengganti Math.random()dengannew Date.
  • Disimpan 4 byte dengan menghapus pembulatan angka acak (sekarang redundan).

Versi yang dapat dibaca & Diuji

  • Menambahkan jeda baris & komentar ke kode
  • Digunakan console.logsebagai gantialert untuk kewarasan Anda! (Paling bagus dilihat di konsol peramban Anda)
  • Menambahkan nomor aturan saat ini ke output.
  • Mengomentari pembuatan array acak untuk memungkinkan pengujian dengan memasukkan daftar angka yang dipisahkan koma.


* Screenshot, kalau-kalau itu dihapus:

Shaggy
sumber
4

C (gcc) , 621 619 593 585 570 562 557 552 529 517 500 482 461 444 442 441 441 438 byte

Ada banyak sekali golf yang diperlukan di sini ... Memperbaiki bug di mana ia akan mencetak hexidecimal satu kali untuk masing-masing 16 dalam daftar ...

Terima kasih khusus kepada ZacharyT dengan bantuan golfnya

#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);}

Cobalah online!

Cleblanc
sumber
1
Meskipun Anda masih bisa bermain golf banyak, Anda sudah 1 byte di bawah jawaban Java saya .. XD Mari kita lihat apakah saya bisa golf entah bagaimana untuk mengalahkan kiriman Anda saat ini. ;)
Kevin Cruijssen
Oke, temukan sesuatu untuk -3 byte; p
Kevin Cruijssen
Jika Anda bisa bermain golf ini, Anda mungkin bisa mendapatkan "dicoret 444 masih 444" di sana! : D
HyperNeutrino
@HyperNeutrino Bermain golf 2 byte lagi
cleblanc
Yay!
Kerja
3

JavaScript (ES6), 296 295 290 289 byte

Program lengkap yang mencatat larik awal, hasil antara dan jumlah akhir untuk konsol.

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)

Bagaimana itu bekerja

Ini dikompres menggunakan JS packer ini .

Kerusakan:

  • String yang dikemas: 226 225 byte
  • Membongkar kode: 69 64 byte

Di bawah ini adalah kode sumber asli dengan beberapa spasi putih dan umpan baris agar mudah dibaca. Alih-alih menerapkan trik golf standar, itu ditulis dengan cara yang menghasilkan string berulang sebanyak mungkin untuk menyenangkan pembungkus. Sebagai contoh, sintaksis if(k=~a.indexOf(N))digandakan di mana-mana meskipun khanya digunakan dalam aturan ke-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))
}

Metode membongkar

Kode pembongkaran asli adalah:

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

Semua varian ES6 berikut memiliki ukuran yang persis sama:

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])

Satu-satunya cara yang saya temukan sejauh ini untuk memangkas beberapa byte adalah dengan menggunakan for ... of:

f="packed_string";for(g of "ABCDEFGHI")e=f.split(g),f=e.join(e.pop());eval(f)
Arnauld
sumber
Membaca ini di telepon jadi saya mungkin salah tetapi, dalam kode Anda yang belum dibongkar, sepertinya aturan 2 sedang diterapkan terlepas dari apakah aturan 1 atau tidak.
Shaggy
1
@ Shaggy Itu benar. Tetapi Anda tidak bisa mendapatkan nol kecuali aturan 1 dipicu.
Arnauld
Doh! Tentu saja! Sobat, saya sudah memiliki jumlah brainfarts yang konyol selama tantangan ini :(
Shaggy
1
@ Shaggy Sayangnya tidak. Namun, kita dapat menyimpan satu byte dengan n&1^1(tidak dikemas sama sekali, tetapi hanya satu byte lebih pendek dari !(n&1)). Saya memikirkan hal itu pada suatu saat dan lupa untuk memasukkannya.
Arnauld
1
@Shaggy Ahah! Pekerjaan yang baik!
Arnauld
2

Coba pertama kali di golf kode!

Sudah dikalahkan oleh javascript lainnya! Dangit! Saya akan memperbaiki!!! =)

Javascript -> 550 402 byte

Pasti bisa ditingkatkan. Terkompresi Sekarang:

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)

Asli:

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));
Blue Okiris
sumber
2

Java 7, 622 619 618 byte

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);}

-1 byte terima kasih kepada @Poke

Penjelasan:

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

Output sampel:
Komentar di balik output sampel tidak dicetak, tetapi saya menambahkannya sebagai klarifikasi.

Coba di sini.

[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
Kevin Cruijssen
sumber
1
Saya turun ke 594 byte sekarang :-D
cleblanc
@cleblanc Saya melihat Anda turun ke 444 sekarang .. Saya tidak bisa bersaing dengan itu dengan Java. :) (Lucu untuk mengatakan bahwa karena 444 ada di mana hampir menang dibandingkan dengan semua jawaban lainnya ..)
Kevin Cruijssen
Saya tahu itu, bahkan bahasa golf seperti 05AB1E hampir 100 byte. Tantangan ini menyebalkan.
cleblanc
Bisakah Anda meninggalkan daftar generik List a = new ArrayList()? Mungkin menghemat beberapa byte. Anda mungkin perlu menambahkan typecast saat melakukan aritmatika yang sebenarnya. Jika tidak, Longlebih pendek dariInteger
Poke
@ Poke Dengan generik Listsaya harus menggunakan (int)gips lima kali, serta mengubah setiap loop dari intmenjadi Objectdan menambahkan gips keenam. Adapun Long: terima kasih, itu menghemat 1 byte :) (masih harus mengubah masing-masing dari intke long, dan r.nextInt(20)+1ke r.nextInt(20)+1L).
Kevin Cruijssen
2

Ruby 2.4, 260 byte

Ruby 2.4 diperlukan untuk 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)

Cobalah online! (Belum ada repl.it atau tio.run yang mendukung Ruby 2.4, jadi versi online ini diganti sumdengan inject(:+), yang memiliki perilaku yang sama.)

Nilai Tinta
sumber
1

R (3.3.1), 325 byte

Implementasi yang cukup naif; Saya pikir saya mungkin bisa membuatnya sedikit lebih pendek.

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)
Giuseppe
sumber
1

PowerShell , 525 413 byte

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

Cobalah online!

Saya ingin mencoba yang ini walaupun saya pikir saya tidak akan mengalahkan jawaban yang sudah ada di sini: PI telah mencoba untuk menurunkan ini, saya yakin itu mungkin dengan byte lebih sedikit. Menemukan metode yang lebih baik untuk hex, tetapi mungkin masih bisa membaik.

Harus dilemparkan $a ke string berkali-kali lebih baik membuat filter untuk itu ...

Ada beberapa golf mudah yang saya lewatkan seperti tanda kurung dan spasi. Masih ada beberapa di luar sana?

Agak lebih mudah untuk membaca kode:

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
Sinusoid
sumber
0

MATLAB, 275 byte

Saya awalnya merencanakan mungkin satu jawaban Octave satu-liner, tetapi membutuhkan output dari semua aturan yang diterapkan menggagalkan rencana saya. Sebagai gantinya, jawaban MATLAB yang cukup mudah dengan beberapa optimisasi yang menarik, misalnya penggunaan cumsumalih - alih yang jelas whileuntuk aturan 6. Namun, banyak jumlah byte terbuang pada ifs untuk mencegah output jika aturan tidak diterapkan.

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

Cobalah online!

Sanchises
sumber
0

Scala 587 bytes satu liner

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 byte apa adanya

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(","))
  }
}
Saideep Sambaraju
sumber
Karena ini adalah pertanyaan kode-golf , kami meminta Anda membuat setidaknya golf mudah seperti menghapus spasi kosong yang tidak perlu.
Ad Hoc Garf Hunter
Saya menambahkan versi byte satu baris rendah
Saideep Sambaraju
Saya tidak tahu Scala, tetapi apakah a: Array[T]dibutuhkan ruang ? Anda tidak memiliki ruang args:Array[String], itulah yang menyebabkan pertanyaan saya.
Zacharý
tidak, saya rasa saya melewatkannya.
Saideep Sambaraju
0

MATLAB, 228 241bytes

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

Ini akan menerapkan semua aturan secara berurutan, mencetak nilai array setelah setiap langkah.

Program akan crash pada aturan 5 jika jumlah elemen yang dihasilkan kurang dari tiga. Saat ini tidak ada yang mengatakan apa yang harus terjadi jika tidak ada elemen ketiga, jadi saya berasumsi bahwa crash dapat diterima. Program sekarang akan mencetak 20 jika ada kurang dari 3 elemen dan satu atau lebih adalah 20.

Menariknya langkah 2 dapat diterapkan terlepas dari apakah langkah 1 itu. Ini karena array input tidak akan pernah memiliki 0 di dalamnya yang berarti bahwa jika ada 0 di dalam array, itu harus sebagai hasil dari langkah 1 yang terjadi.

Semua aturan diterapkan secara berurutan, hingga 5, bahkan jika tidak ada perubahan yang dibuat. Akibatnya array akan dicetak pada awal dan kemudian setelah setiap langkah hingga 5. Setelah langkah 5 Anda akan mendapatkan jumlah jika diterapkan, atau tidak ada output sampai setelah langkah 6. Baris tambahan yang mengandung adapat ditambahkan setelah pernyataan lain untuk memastikan bahwa nilai array dicetak setelah langkah 5 dengan biaya 2 byte.


Saya juga ingin menyebutkan bahwa saya tidak melihat jawaban yang lain sampai setelah saya menulis ini. Saya melihat sekarang bahwa ada jawaban MATLAB lain dengan beberapa kesamaan - yang semuanya kebetulan.

Tom Carpenter
sumber
0

Python 3, 297 293 289 , 278 byte

Saat Arnauld melihat, Anda tidak bisa mendapatkan 0 kecuali aturan 1 diterapkan, yang disimpan saat indentasi. Terima kasih untuk semua orang yang berkomentar dengan saran juga.

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))

Cobalah online

Notts90 mendukung Monica
sumber
Saya tidak berpikir Anda membutuhkan ruang antara anddan ~.
Zacharý
saya percaya from random import* a=b=sample(range(1,20),randint(5,10))menyimpan beberapa byte karena Anda dapat menghapus baris 2.
nocturama
0

Perl 6 , 246 byte

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 $/

Tidak Disatukan:

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
Sean
sumber
0

Gangguan Umum, 490 byte

Di sini array diwakili sebagai daftar 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))))))

Seperti biasa, penggunaan besar anddan orsebagai struktur kontrol.

(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
Renzo
sumber