Mảng tẻ nhạt của 7 quy tắc


11

Sự xuống cấp

Tạo một chương trình tạo ra một mảng có độ dài ngẫu nhiên với các số ngẫu nhiên, sau đó áp dụng một loạt các quy tắc làm thay đổi mảng. Sau khi các quy tắc đã được áp dụng, in tổng của mảng trừ khi có quy định khác

Thiết lập mảng

Mảng phải có độ dài ngẫu nhiên trong khoảng từ 5 đến 10 , bao gồm các số nguyên ngẫu nhiên trong khoảng từ 1 đến 20 . Mỗi độ dài mảng phải có xác suất xảy ra bằng nhau và mỗi số nguyên phải có xác suất được chọn bằng nhau cho mỗi phần tử.

7 quy tắc

Các quy tắc sẽ hoạt động như thể chúng được áp dụng theo trình tự (ví dụ: quy tắc 1 hành động trước quy tắc 2) và chỉ được áp dụng một lần. Để chứng minh ứng dụng quy tắc, mảng phải được in ra bàn điều khiển sau mỗi ứng dụng quy tắc và một lần trước khi áp dụng bất kỳ quy tắc nào.

  1. Nếu mảng chứa 7, trừ 1 từ mọi phần tử
  2. Nếu quy tắc 1 được áp dụng và mảng hiện chứa 0, hãy thêm 1 vào mỗi phần tử
  3. Nếu mảng chứa 13, loại trừ 13 và tất cả các phần tử theo sau, khỏi mảng
  4. Nếu mảng chứa 2, loại trừ tất cả các số lẻ
  5. Nếu mảng chứa 20 và phần tử thứ ba là chẵn, trả về 20 là tổng sau đó chấm dứt. Nếu có 20 và phần tử thứ ba là số lẻ, trả về 20 lần chiều dài của mảng là tổng sau đó chấm dứt.
  6. Nếu tổng lớn hơn 50, hãy loại bỏ phần tử cuối cùng nhiều lần cho đến khi nó nhỏ hơn hoặc bằng 50
  7. Nếu mảng chứa 16, hãy in tổng theo cả thập phân và thập lục phân.

Thí dụ

Đây là một mảng ban đầu,

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

Quy tắc 1 có thể được áp dụng:

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

Quy tắc 3 được áp dụng tiếp theo:

[19, 1, 4, 6]

Không có quy tắc nào khác là cần thiết, vì vậy chương trình trả về 30 dưới dạng tổng.

Ghi chú

  • Tôi không phải là người chơi mã có kinh nghiệm, mặc dù tôi có thể nói rằng hồ sơ cá nhân của tôi là trong Python 3 với 369 byte .
  • Các quy tắc không thực sự phải được áp dụng theo thứ tự, nhưng phải hành động như thể chúng đã làm.

1
Làm thế nào ngẫu nhiên "ngẫu nhiên" phải được?
HyperNeutrino

1
@HyperNeutrino nó có thể là sudo-ngẫu nhiên như bạn muốn, nhưng không phải là thử thách ném. Lặp lại được cho phép.
Graviton

Làm thế nào bạn sẽ kiểm tra nếu chúng ta thực sự áp dụng các quy tắc? Tôi chỉ có thể tạo một số ngẫu nhiên dưới 50 và về mặt kỹ thuật nó vẫn không vi phạm bất kỳ quy tắc nào và tôi chỉ có thể nói nó "tuân theo" các quy tắc. EDIT: Bây giờ tôi nhận ra rằng điều này sẽ không hiệu quả, nhưng mọi người sẽ tìm cách phá vỡ các quy tắc ngẫu nhiên. Bạn sẽ ngăn chặn điều đó?
clismique

1
Hiện tại, việc chọn một trong hai mảng [3 3 3 3 4 3][4 4 3 4 4], mỗi mảng có xác suất 50%, phù hợp với những gì được viết trong "thiết lập mảng". Vì vậy, tôi chỉ có thể đầu ra 19mỗi lần? (Tất nhiên, điều tôi thực sự nghĩ là định nghĩa về "ngẫu nhiên" cần phải được làm rõ.)
Greg Martin

2
If the array contains a 20, and the third element is even/odd, nếu mảng có ít hơn 3 phần tử ở bước này thì sao?
Emigna

Câu trả lời:


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)

Tôi không biết làm thế nào bạn sẽ ngăn mọi người phá vỡ các quy tắc, nhưng quy tắc này sử dụng quy trình được chỉ định.

+7 byte; cảm ơn @YamB vì đã lưu một vài byte; đã thêm rất nhiều để sửa lỗi trước đó.
-14 byte nhờ @RootTwo và bản thân tôi và cũng đã sửa lỗi.
+83 byte; điều này đang trở nên dài khủng khiếp vì OP liên tục thay đổi các quy tắc. -một số byte nhờ @ZacharyT


Tất cả kiểm tra cho tôi, cảm ơn vì đã trung thực.
Graviton

Bạn có thể lưu 4 byte bằng cách nhập 'randint as r' và thay đổi 'if 7in k và 1not in k: k = [i-1 ...' thành 'if 7in k: k = [i + 1-int (1in k ) ... '
Graviton

Khi khởi tạo k, bạn không cần giá trị của i, vì vậy bạn có thể lưu 6 byte với k=[r(1,20)for _ in'-'*r(5,11)]. Bạn có thể lưu một byte khác bằng cách sử dụng k=[i+~-(1in k)*(7in k)for i in k]cho quy tắc 1 và 2.
RootTwo

1
@ Notts90 Các quy tắc đã được thay đổi sau khi tôi viết thử thách này. Tôi sẽ sửa nó khi tôi đến một máy tính. Cảm ơn.
HyperNeutrino

Trên dòng năm và bảy, bạn có một không gian không cần thiết sau 1và bạn có thể thay đổi printdòng thứ hai và thứ ba thành dòng cuối cùng p. Và bạn ... chưa cập nhật bytecount của bạn.
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,

Hãy thử trực tuyến! hoặc với đầu vào


84 byte, và có khả năng đúng? Khác nhau? Không ý kiến. tio.run/nexus/ Kẻ
Bạch tuộc ma thuật Urn

@carusocomputing: Tôi chưa xem xét kỹ về nó, nhưng nó không tạo ra mảng ngẫu nhiên ngay từ đầu và cũng không in kết quả trung gian. Sẽ lâu hơn một chút khi thêm những phần đó.
Emigna

6

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

Huzzah! Cuối cùng gắn liền với nhịp Arnauld !

Sau khi trao đổi này * trong các nhận xét của thách thức và sau nhiều lần cân nhắc, tôi đã quyết định sử dụng new Datelàm hạt giống cho trình tạo số ngẫu nhiên thay vì Math.random(). Làm như vậy có nghĩa là tất cả các số nguyên trong mảng sẽ có cùng giá trị.

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

Thử nó

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

  • Đã lưu 2 byte bằng cách chỉ ghi nhật ký các phần tử xuất hiện trong quy tắc 6.
  • Đã lưu 2 byte bằng cách thay thế Array(x).fill()bằng [...Array(x)].
  • Đã thêm 2 byte vì tôi đã nhầm với quy tắc 5!
  • Đã lưu 7 byte sửa lỗi lộn xộn Tôi đã cố gắng sửa chữa mớ hỗn độn trước đó!
  • Đã lưu 3 byte nhờ Arnauld giúp tôi chữa bệnh não bộ theo quy tắc 2 và lưu một byte bổ sung bằng cách thay thế a +1bằng a ~.
  • Đã thêm 2 byte đảm bảo 0được trả về cho một mảng trống.
  • Đã lưu 20 byte bằng cách cuối cùng tìm ra cách bỏ whilevòng lặp đó.
  • Đã lưu 2 byte bằng cách thay thế ,giữa 2 câu lệnh cuối cùng bằng a |và loại bỏ phần đính kèm ().
  • Đã lưu 6 byte bằng cách thay thế console.logbằng alert.
  • Đã lưu 7 byte bằng cách cải thiện việc rút gọn a.includes().
  • Đã lưu 1 byte bằng cách chỉnh sửa việc thực hiện quy tắc 3.
  • Đã lưu 7 byte bằng cách bỏ qua includes()và chỉ sử dụng indexOf()trong suốt.
  • Đã lưu 1 byte bằng cách di chuyển khai báo ban đầu của sbiến sang một nơi không cần dấu phẩy.
  • Đã lưu 6 byte bằng cách thay thế Math.random()bằng new Date.
  • Đã lưu 4 byte bằng cách loại bỏ làm tròn (bây giờ là dự phòng) các số ngẫu nhiên.

Phiên bản có thể đọc và kiểm tra

  • Đã thêm ngắt dòng & nhận xét vào mã
  • Được sử dụng console.logthay vì alertcho sự tỉnh táo của bạn! (Xem tốt nhất trong bảng điều khiển trình duyệt của bạn)
  • Đã thêm số quy tắc hiện tại vào đầu ra.
  • Nhận xét việc tạo mảng ngẫu nhiên để cho phép kiểm tra bằng cách nhập danh sách số được phân tách bằng dấu phẩy.


* Ảnh chụp màn hình, trong trường hợp nó bị xóa:


4

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

Có rất nhiều môn đánh gôn cần thiết ở đây ... Đã sửa một lỗi trong đó nó sẽ in số thập lục phân một lần cho mỗi 16 trong danh sách ...

Đặc biệt cảm ơn ZacharyT với sự giúp đỡ của golf

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

Hãy thử trực tuyến!


1
Mặc dù bạn vẫn có thể chơi gôn rất nhiều, nhưng bạn đã thấp hơn 1 byte so với câu trả lời Java của tôi .. XD Hãy xem liệu tôi có thể đánh golf bằng cách nào đó để đánh bại bài nộp hiện tại của bạn không. ;)
Kevin Cruijssen

Ok, tìm thấy thứ gì đó cho -3 byte; p
Kevin Cruijssen

Nếu bạn có thể đánh gôn này xuống, bạn có thể có được một "gạch chéo vẫn là 444" trong đó! : D
HyperNeutrino

@HyperNeutrino Đánh gôn thêm 2 byte
cleblanc

Yay! Công việc tuyệt vời: D
HyperNeutrino

3

JavaScript (ES6), 296 295 290 289 byte

Một chương trình đầy đủ ghi nhật ký mảng ban đầu, kết quả trung gian và tổng cuối cùng vào bàn điều khiển.

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)

Làm thế nào nó hoạt động

Điều này đã được nén bằng cách sử dụng trình đóng gói JS này .

Phá vỡ:

  • Chuỗi được đóng gói: 226 225 byte
  • Giải nén mã: 69 64 byte

Dưới đây là mã nguồn ban đầu với một số nguồn cấp dữ liệu khoảng trắng và dòng bổ sung để dễ đọc. Thay vì áp dụng các thủ thuật đánh golf tiêu chuẩn, nó được viết theo cách tạo ra càng nhiều chuỗi lặp lại càng tốt để làm hài lòng người đóng gói. Chẳng hạn, cú pháp if(k=~a.indexOf(N))được nhân đôi ở mọi nơi mặc dù kchỉ được sử dụng trong quy tắc thứ 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))
}

Phương pháp giải nén

Mã giải nén ban đầu là:

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

Tất cả các biến thể ES6 sau đây có cùng kích thước:

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

Cách duy nhất tôi tìm thấy cho đến nay để loại bỏ một vài byte là sử dụng for ... of:

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

Đọc điều này trên điện thoại để tôi có thể sai nhưng, trong mã được giải nén của bạn, có vẻ như quy tắc 2 đang được áp dụng bất kể quy tắc 1 có hay không.
Xù xì

1
@Shaggy Đúng rồi. Nhưng bạn không thể có được số 0 trừ khi quy tắc 1 được kích hoạt.
Arnauld

Ôi! Tất nhiên! Man, tôi đã có một số lượng lớn các trò chơi trí tuệ trong thử thách này :(
Shaggy

1
@Shaggy Thật không may. Tuy nhiên, chúng ta có thể lưu một byte với n&1^1(nó hoàn toàn không bị đóng gói, nhưng chỉ ngắn hơn một byte !(n&1)). Tôi đã nghĩ về điều đó tại một số điểm và quên bao gồm nó.
Arnauld

1
@Shaggy Ahah! Công việc tốt!
Arnauld

2

Đầu tiên hãy thử chơi golf mã!

Đã bị đánh bại bởi các javascript khác! Nguy hiểm! Tôi sẽ cải thiện!!! =)

Javascript -> 550 402 byte

Chắc chắn có thể được cải thiện. Nén ngay:

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)

Nguồn gốc:

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 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 nhờ @Poke

Giải trình:

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

Đầu ra mẫu:
Nhận xét đằng sau đầu ra mẫu không được in, nhưng tôi đã thêm chúng dưới dạng làm rõ.

Hãy thử nó ở đây.

[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
Hiện tôi đang xuống tới 594 byte :-D
cleblanc

@cleblanc Bây giờ tôi thấy bạn đã xuống tới mức 444 .. Tôi không thể cạnh tranh với điều đó với Java. :) (Thật buồn cười khi nói rằng vì 444 không có nơi nào gần chiến thắng so với tất cả các câu trả lời khác ..)
Kevin Cruijssen

Tôi biết điều đó, ngay cả các ngôn ngữ chơi gôn như 05AB1E cũng dài gần 100 byte. Thử thách này là một nỗi đau.
cleblanc

Bạn có thể để lại danh sách của bạn chung chung List a = new ArrayList()? Có thể lưu một số byte. Tuy nhiên, bạn có thể cần thêm một kiểu chữ khi thực hiện số học thực tế. Nếu không, Longngắn hơnInteger
Chọc

@Poke Với chung Listtôi phải sử dụng một (int)dàn diễn viên gấp năm lần, cũng như thay đổi cho-mỗi vòng lặp từ intđể Objectvà thêm một dàn diễn viên thứ sáu. Đối với Long: cảm ơn, điều đó tiết kiệm 1 byte :) (vẫn phải thay đổi for-every từ intthành longr.nextInt(20)+1sang r.nextInt(20)+1L).
Kevin Cruijssen

2

Ruby 2.4, 260 byte

Ruby 2.4 là bắt buộc cho 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)

Hãy thử trực tuyến! (Cả repl.it cũng không tio.run hỗ trợ của Ruby 2,4, vì vậy này thay thế phiên bản trực tuyến sumvới inject(:+), trong đó có hành vi tương tự.)


1

R (3.3.1), 325 byte

Thực hiện khá ngây thơ; Tôi nghĩ rằng tôi có thể có thể làm cho nó ngắn hơn một chút.

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

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

Hãy thử trực tuyến!

Tôi muốn thử cái này mặc dù tôi nghĩ rằng tôi sẽ không đánh bại các câu trả lời ở đây: PI đã cố gắng đánh golf này xuống, tôi chắc chắn rằng nó có thể với ít byte hơn. Tìm thấy một phương pháp tốt hơn cho hex, nhưng có lẽ vẫn có thể cải thiện.

Phải phân vai $a tới một chuỗi nhiều lần thì tốt hơn là tạo một bộ lọc cho nó ...

Có khá nhiều sân golf dễ bị tôi bỏ lỡ như dấu ngoặc đơn và dấu cách. Vẫn có thể là một số ngoài đó?

Một số mã dễ đọc hơn:

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 byte

Ban đầu tôi dự định có thể là câu trả lời Octave một lớp, nhưng yêu cầu đầu ra của tất cả các quy tắc được áp dụng đã cản trở kế hoạch của tôi. Thay vào đó, một câu trả lời MATLAB khá đơn giản với một vài tối ưu thú vị, ví dụ như việc sử dụng cumsumthay vì rõ ràng whilecho quy tắc 6. Tuy nhiên, rất nhiều số byte bị lãng phí trên ifs để ngăn chặn đầu ra nếu không áp dụng quy tắc.

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

Hãy thử trực tuyến!


0

Scala 587 byte một lớp lót

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 là

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(","))
  }
}

Vì đây là một câu hỏi về golf-code, chúng tôi yêu cầu bạn tạo ra ít nhất những golf dễ dàng như loại bỏ khoảng trắng không cần thiết.
Đăng Rock Garf Hunter

Tôi đã thêm phiên bản byte thấp một dòng
Saideep Sambaraju

Tôi không biết Scala, nhưng không gian a: Array[T]cần thiết phải không? Bạn không có không gian trong args:Array[String]đó, đó là những gì dẫn đến yêu cầu của tôi.
Zacharý

không tôi nghĩ rằng tôi đã bỏ lỡ nó
Saideep Sambaraju

0

MATLAB, 228 241byte

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

Điều này sẽ áp dụng tất cả các quy tắc theo thứ tự, in giá trị mảng sau mỗi bước.

Chương trình sẽ sụp đổ theo quy tắc 5 nếu số phần tử kết quả nhỏ hơn ba. Hiện tại không có gì để nói điều gì sẽ xảy ra nếu không có yếu tố thứ ba, vì vậy tôi cho rằng một sự cố có thể chấp nhận được.Chương trình sẽ in 20 nếu có ít hơn 3 phần tử và một hoặc nhiều hơn là 20.

Điều thú vị là bước 2 có thể được áp dụng bất kể bước 1 là gì. Điều này là do mảng đầu vào sẽ không bao giờ có 0 trong đó có nghĩa là nếu có bất kỳ 0 nào trong mảng thì nó phải là kết quả của bước 1 đã xảy ra.

Tất cả các quy tắc được áp dụng lần lượt, cho đến 5, ngay cả khi không có thay đổi nào được thực hiện. Kết quả là mảng sẽ được in khi bắt đầu và sau mỗi bước tăng lên đến 5. Sau bước 5, bạn sẽ nhận được tổng nếu nó được áp dụng, hoặc không có đầu ra cho đến sau bước 6. Một dòng bổ sung có athể được thêm vào sau câu lệnh khác để đảm bảo rằng giá trị mảng được in sau bước 5 với chi phí là 2 byte.


Tôi cũng muốn đề cập rằng tôi đã không nhìn vào các câu trả lời khác cho đến khi tôi đã viết nó. Bây giờ tôi thấy rằng có một câu trả lời MATLAB khác với một số điểm tương đồng - tất cả đều là trùng hợp ngẫu nhiên.


0

Python 3, 297 293 289 , 278 byte

Như Arnauld đã phát hiện ra, bạn không thể nhận được 0 trừ khi quy tắc 1 được áp dụng, được lưu khi thụt lề. Cảm ơn tất cả những người khác đã bình luận với đề xuất quá.

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

Dùng thử trực tuyến


Tôi không nghĩ bạn cần khoảng trống giữa and~.
Zacharý

tôi tin rằng sẽ from random import* a=b=sample(range(1,20),randint(5,10))lưu một số byte vì bạn có thể xóa dòng 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 $/

Ung dung:

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

Lisp thông thường, 490 byte

Ở đây, mảng được biểu diễn dưới dạng danh sách Lisp chung.

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

Như thường lệ, sử dụng lớn andornhư các cấu trúc điều khiển.

(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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.