อาร์เรย์ที่น่าเบื่อของ 7 กฎ


11

บทสรุป

สร้างโปรแกรมที่สร้างอาร์เรย์ที่มีความยาวสุ่มด้วยตัวเลขสุ่มจากนั้นใช้ชุดกฎที่เปลี่ยนแปลงอาร์เรย์ หลังจากนำกฎไปใช้แล้วให้พิมพ์ผลรวมของอาร์เรย์ยกเว้นระบุไว้เป็นอย่างอื่น

การตั้งค่าอาร์เรย์

อาร์เรย์จะต้องเป็นระยะเวลาสุ่มระหว่าง5 และ 10รวมกับจำนวนเต็มสุ่มระหว่าง1 และ 20รวม ความยาวของอาเรย์แต่ละอันควรมีความน่าจะเป็นเท่ากันที่จะเกิดขึ้นและแต่ละจำนวนเต็มควรมีความน่าจะเป็นเท่ากันที่จะถูกเลือกต่อองค์ประกอบ

กฎ 7 ข้อ

กฎควรทำหน้าที่เสมือนว่าถูกนำไปใช้ตามลำดับ (เช่น: กฎ 1 ทำหน้าที่ก่อนกฎ 2) และจะใช้เพียงครั้งเดียวเท่านั้น สำหรับการพิสูจน์แอปพลิเคชันกฎอาร์เรย์จะต้องพิมพ์ไปยังคอนโซลหลังจากแต่ละแอปพลิเคชันกฎและหนึ่งครั้งก่อนที่จะใช้กฎใด ๆ

  1. ถ้าอาร์เรย์มี 7 ให้ลบ 1 จากทุกองค์ประกอบ
  2. หากมีการใช้กฎ 1 และตอนนี้อาร์เรย์มี 0 ให้เพิ่ม 1 ในแต่ละองค์ประกอบ
  3. หากอาร์เรย์มี 13 ให้แยก 13 และองค์ประกอบทั้งหมดที่ตามมาออกจากอาร์เรย์
  4. หากอาร์เรย์มี 2 ให้แยกจำนวนคี่ทั้งหมด
  5. หากอาร์เรย์มี 20 และองค์ประกอบที่สามเป็นเลขคู่ให้คืน 20 เป็นผลรวมแล้วจะสิ้นสุดลง ถ้ามี 20 และองค์ประกอบที่สามเป็นเลขคี่ให้ส่งคืนความยาวของอาร์เรย์เป็น 20 เท่าของผลรวมนั้นจะสิ้นสุดลง
  6. หากผลรวมมากกว่า 50 ให้ลบองค์ประกอบสุดท้ายซ้ำ ๆ จนกระทั่งมันน้อยกว่าหรือเท่ากับ 50
  7. หากอาร์เรย์มี 16 ให้พิมพ์ผลรวมทั้งทศนิยมและเลขฐานสิบหก

ตัวอย่าง

นี่คืออาร์เรย์เริ่มต้น

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

สามารถใช้กฎ 1 ได้:

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

กฎ 3 ถูกนำไปใช้ถัดไป:

[19, 1, 4, 6]

ไม่มีกฎอื่นใดที่จำเป็นดังนั้นโปรแกรมจะคืนค่า30เป็นผลรวม

หมายเหตุ

  • ฉันไม่ได้เป็นนักกอล์ฟรหัสที่มีประสบการณ์ แต่ฉันสามารถพูดได้บันทึกส่วนตัวของฉันอยู่ในหลาม 3 369 ไบต์
  • กฎไม่จำเป็นต้องถูกนำไปใช้จริงตามลำดับ แต่ต้องทำราวกับว่าพวกเขาทำ

1
การสุ่ม "สุ่ม" ต้องเป็นอย่างไร
HyperNeutrino

1
@HyperNeutrino มันสามารถเป็น sudo-random ตามที่คุณต้องการ แต่ไม่ท้าทายการขว้าง อนุญาตให้ทำซ้ำได้
Graviton

คุณจะตรวจสอบว่าเราใช้กฎจริงหรือไม่ ฉันสามารถสร้างเลขสุ่มภายใต้ 50 และมันจะยังคงเทคนิคไม่ทำลายกฎใด ๆ และฉันก็สามารถพูดได้ว่า "ตาม" กฎ แก้ไข: ฉันรู้ว่าตอนนี้มันใช้งานไม่ได้ แต่ผู้คนกำลังหาทางหลีกเลี่ยงกฎแบบสุ่ม คุณจะป้องกันหรือไม่
clismique

1
ในขณะนี้การเลือกหนึ่งในสองอาร์เรย์[3 3 3 3 4 3]และ[4 4 3 4 4]แต่ละอันมีโอกาส 50% เป็นไปตามสิ่งที่เขียนภายใต้ "การตั้งค่าอาร์เรย์" ดังนั้นฉันสามารถส่งออก19ทุกครั้งหรือไม่ (แน่นอนสิ่งที่ฉันคิดว่าจริง ๆ คือคำจำกัดความของคำว่า "สุ่ม" ต้องได้รับการอธิบาย)
Greg Martin

2
If the array contains a 20, and the third element is even/oddแล้วถ้าอาร์เรย์มีองค์ประกอบน้อยกว่า 3 ในขั้นตอนนี้ล่ะ
Emigna

คำตอบ:


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 สำหรับการบันทึกสองสามไบต์ เพิ่มมากขึ้นเพื่อแก้ไขข้อผิดพลาดก่อนหน้า
-14 ไบต์ขอบคุณ @RootTwo และตัวฉันเองและยังแก้ไขข้อผิดพลาด
+83 ไบต์; สิ่งนี้กำลังดำเนินไปอย่างน่ากลัวเพราะ OP ยังคงเปลี่ยนแปลงกฎอยู่ - บางจำนวนไบต์ต้องขอบคุณ @ZacharyT


ตรวจสอบทั้งหมดให้ฉันขอบคุณที่เป็นคนซื่อสัตย์
Graviton

คุณสามารถบันทึก 4 ไบต์โดยนำเข้า 'randint as r' และเปลี่ยน 'ถ้า 7in k และ 1not ใน k: k = [i-1 ... ' ถึง 'ถ้า 7in k: k = [i + 1-int (1in k ) ... '
Graviton

เมื่อเริ่มต้น k, คุณไม่จำเป็นต้องค่าของฉันเพื่อให้คุณสามารถบันทึก 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 กฎมีการเปลี่ยนแปลงหลังจากที่ฉันเขียนความท้าทายนี้ ฉันจะแก้ไขเมื่อไปถึงคอมพิวเตอร์ ขอบคุณ
HyperNeutrino

ในบรรทัดที่ห้าและเจ็ดคุณมีช่องว่างที่ไม่จำเป็นหลัง1และคุณสามารถเปลี่ยนprintบรรทัดที่สองและสามเป็นบรรทัดสุดท้ายpได้ และคุณ ... ยังไม่ได้อัปเดต bytecount ของคุณ
Zacharý

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/…
Magic Octopus Urn

@carusocomputing: ฉันยังไม่ได้ตรวจสอบอย่างละเอียด แต่ก็ไม่ได้สร้างอาเรย์แบบสุ่มในตอนเริ่มต้นหรือพิมพ์ผลลัพธ์ระดับกลาง จะนานขึ้นเล็กน้อยเมื่อเพิ่มส่วนเหล่านั้น
Emigna

6

Javascript (ES6), 344 342 340 342 335 331 333 313 311 305 298 297 290 289 283 289 27 ไบต์

Huzzah! ในที่สุดก็ผูกกับเอาชนะArnauld !

ต่อไปนี้การแลกเปลี่ยนนี้ * ในความคิดเห็นของความท้าทายและหลังจากใคร่ครวญมากฉันได้ตัดสินใจที่จะใช้เป็นเมล็ดพันธุ์สำหรับเครื่องกำเนิดไฟฟ้าจำนวนสุ่มแทน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())

  • บันทึก 2 ไบต์โดยบันทึกเฉพาะองค์ประกอบที่ผุดในกฎ 6
  • ที่บันทึกไว้ 2 ไบต์โดยการแทนที่ด้วยArray(x).fill()[...Array(x)]
  • เพิ่ม 2 ไบต์เพราะฉันทำผิดกฎ 5 ข้อ!
  • บันทึกแล้ว 7 ไบต์เพื่อแก้ไขความยุ่งเหยิงที่ฉันพยายามแก้ไขก่อนหน้านี้
  • ที่บันทึกไว้ 3 ไบต์ขอบคุณที่Arnauldช่วยฉันรักษา brainfart ในกฎ 2 และบันทึกไบต์เพิ่มเติมโดยการแทนที่ด้วย+1~
  • เพิ่ม 2 ไบต์เพื่อให้แน่ใจว่า0จะได้รับคืนสำหรับอาเรย์ที่ว่างเปล่า
  • บันทึกแล้ว 20 ไบต์โดยในที่สุดหาวิธีทิ้งการwhileวนลูปนั้น
  • บันทึก 2 ไบต์ด้วยการแทนที่,คำแถลงระหว่าง 2 คำสั่งล่าสุดด้วย|และลบสิ่งที่แนบ()มา
  • ที่บันทึกไว้ 6 ไบต์โดยการแทนที่ด้วยconsole.logalert
  • ที่บันทึกไว้ 7 ไบต์โดยการปรับปรุง shortcutting a.includes()ของ
  • บันทึก 1 ไบต์โดยแก้ไขการใช้กฎ 3
  • บันทึก 7 ไบต์โดยการทิ้งincludes()และเพียงใช้indexOf()ตลอด
  • บันทึก 1 ไบต์ด้วยการย้ายการประกาศเริ่มต้นของsตัวแปรไปยังที่อื่นซึ่งไม่จำเป็นต้องใช้เครื่องหมายจุลภาค
  • ที่บันทึกไว้ 6 ไบต์โดยการแทนที่ด้วยMath.random()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 441 438 ไบต์

มีจำนวนมากของการเล่นกอล์ฟที่จำเป็นที่นี่ ... แก้ไขข้อผิดพลาดที่มันจะพิมพ์เลขฐานสิบหกครั้งเดียวสำหรับแต่ละ 16 ในรายการ ...

ขอขอบคุณเป็นพิเศษกับ 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
แม้ว่าคุณจะยังสามารถเล่นกอล์ฟได้มากคุณก็มี 1 ไบต์ใต้คำตอบ Java ของฉันอยู่แล้ว XD ลองดูว่าฉันจะตีมันได้ไหมเพื่อเอาชนะข้อเสนอปัจจุบันของคุณ ;)
Kevin Cruijssen

ตกลงพบบางอย่างสำหรับ -3 ไบต์; p
Kevin 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 packerนี้

แตกหัก:

  • สตริงที่บรรจุ: 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)

กำลังอ่านสิ่งนี้ทางโทรศัพท์ดังนั้นฉันอาจผิด แต่ในรหัสที่ไม่ได้แพ็คของคุณดูเหมือนว่ากฎ 2 จะถูกนำไปใช้โดยไม่คำนึงว่ากฎ 1 หรือไม่
Shaggy

1
@Shaggy ถูกต้องแล้ว แต่คุณไม่สามารถรับค่าเป็นศูนย์ได้เว้นแต่จะเรียกกฎ 1
Arnauld

D'โอ้! แน่นอน! ชายฉันเคยมีจำนวนสมองที่ไร้สาระระหว่างการท้าทายนี้ :(
Shaggy

1
@Shaggy แต่น่าเสียดายที่ไม่ได้ อย่างไรก็ตามเราสามารถบันทึกหนึ่งไบต์ด้วยn&1^1(มันไม่ได้บรรจุเลย แต่จะสั้นกว่าหนึ่งไบต์!(n&1)) ฉันคิดว่าในบางจุดและลืมที่จะรวมไว้
Arnauld

1
@Shaggy Ahah! งานที่ดี!
Arnauld

2

ก่อนอื่นลองโค้ดกอล์ฟ!

เอาชนะแล้วโดย javascripters อื่น ๆ ! Dangit! ฉันจะปรับปรุง !!! =)

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)

originial:

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

-1 ไบต์ขอบคุณ@Poke

คำอธิบาย:

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

@cleblanc ฉันเห็นว่าคุณลงไปที่ 444 ตอนนี้ .. ฉันไม่สามารถแข่งขันกับ Java ได้ :) (ตลกที่จะบอกว่าตั้งแต่ 444 ไม่มีที่ไหนใกล้ชนะเมื่อเทียบกับคำตอบอื่น ๆ ทั้งหมด .. )
เควิน Cruijssen

ฉันรู้ว่าแม้ภาษากอล์ฟเช่น 05AB1E นั้นยาวเกือบ 100 ไบต์ ความท้าทายนี้เป็นความเจ็บปวด
cleblanc

คุณสามารถออกจากรายการทั่วไปได้List a = new ArrayList()ไหม? อาจบันทึกบางไบต์ คุณอาจต้องเพิ่ม typecast เมื่อทำเลขคณิตจริง ถ้าไม่Longสั้นกว่าInteger
โผล่

@ Poke ด้วยยาสามัญListฉันต้องใช้(int)นักแสดงห้าครั้งรวมถึงการเปลี่ยนลูปสำหรับแต่ละวงจากintเป็นObjectและเพิ่มนักแสดงที่หก สำหรับLong: ขอบคุณที่บันทึก 1 ไบต์ :) (ยังคงต้องเปลี่ยนสำหรับแต่ละจากintเป็นlongและr.nextInt(20)+1เป็นr.nextInt(20)+1L)
Kevin Cruijssen

2

Ruby 2.4, 260 bytes

ทับทิม 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

PowerShell , 525 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

ลองออนไลน์!

ฉันต้องการลองสิ่งนี้แม้ว่าฉันจะคิดว่าฉันจะไม่เอาชนะคำตอบแล้วที่นี่: PI พยายามตีกอล์ฟลงไปฉันแน่ใจว่ามันเป็นไปได้ด้วยจำนวนไบต์ที่น้อยกว่า พบวิธีที่ดีกว่าสำหรับ hex แต่อาจจะยังดีขึ้น

ต้องส่ง$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 ไบต์

เดิมทีฉันวางแผนไว้ว่าอาจจะเป็นคำตอบอ็อกเทฟหนึ่งซับ แต่ต้องการเอาท์พุทของกฎที่ใช้ทั้งหมดขัดขวางแผนการของฉัน คำตอบ MATLAB ที่ตรงไปตรงมานั้นค่อนข้างตรงไปตรงมาพร้อมกับการเพิ่มประสิทธิภาพที่น่าสนใจเช่นการใช้cumsumแทนที่จะชัดเจนwhileสำหรับกฎ 6 ถึงกระนั้นจำนวนไบต์จำนวนมากจะสูญเปล่าifเพื่อป้องกันผลลัพธ์หากไม่ได้ใช้กฎ

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

สกาลา 587 ไบต์หนึ่งซับ

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

สกาลา, 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(","))
  }
}

เนื่องจากนี่เป็นคำถามเกี่ยวกับการตีกอล์ฟเราขอให้คุณสร้างสนามกอล์ฟที่ง่ายอย่างเช่นเอาพื้นที่ว่างที่ไม่จำเป็นออก
Ad Hoc Garf Hunter

ฉันเพิ่มเวอร์ชั่นต่ำหนึ่งบรรทัด
Saideep Sambaraju

ฉันไม่รู้จักสกาล่า แต่ต้องการพื้นที่ว่างa: Array[T]หรือไม่ คุณไม่มีที่ว่างในargs:Array[String]ซึ่งเป็นสิ่งที่เกิดขึ้นในคำถามของฉัน
Zacharý

ไม่ฉันคิดว่าฉันพลาด
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

สิ่งนี้จะใช้กฎทั้งหมดตามลำดับพิมพ์ค่าอาร์เรย์หลังจากแต่ละขั้นตอน

โปรแกรมจะผิดพลาดในกฎที่ 5 หากจำนวนองค์ประกอบที่ได้นั้นน้อยกว่าสาม ขณะนี้ไม่มีอะไรจะพูดว่าจะเกิดอะไรขึ้นหากไม่มีองค์ประกอบที่สามดังนั้นฉันจึงสันนิษฐานว่าการชนเป็นที่ยอมรับได้ โปรแกรมจะพิมพ์ 20 ถ้ามีน้อยกว่า 3 องค์ประกอบและหนึ่งหรือมากกว่านั้นคือ 20

ขั้นตอนที่ 2 ที่น่าสนใจสามารถนำไปใช้ได้ไม่ว่าจะเป็นขั้นตอนที่ 1 หรือไม่ก็ตาม นี่เป็นเพราะอาร์เรย์อินพุตจะไม่มี 0 ในหมายความว่าถ้ามี 0 ใด ๆ ในอาร์เรย์มันจะต้องเป็นผลมาจากขั้นตอนที่ 1 เกิดขึ้น

กฎทั้งหมดจะถูกนำไปใช้ในทางกลับกันจนถึง 5 แม้ว่าจะไม่มีการเปลี่ยนแปลง เป็นผลให้อาร์เรย์จะถูกพิมพ์ในช่วงเริ่มต้นและแล้วหลังจากที่แต่ละขั้นตอนจนถึง 5. หลังจากขั้นตอนที่ 5 คุณอาจจะได้รับผลรวมถ้ามันถูกนำไปใช้หรือเอาท์พุทไม่มีจนกระทั่งหลังจากขั้นตอนที่ 6 บรรทัดพิเศษที่มีaอาจจะเพิ่มเข้ามาหลังจาก คำสั่ง else เพื่อให้แน่ใจว่าค่าอาร์เรย์ถูกพิมพ์หลังขั้นตอนที่ 5 ที่ราคา 2 ไบต์


ฉันอยากจะพูดถึงว่าฉันไม่ได้ดูคำตอบอื่น ๆ จนกว่าฉันจะเขียนสิ่งนี้ ตอนนี้ฉันเห็นแล้วว่ามีคำตอบแบบ MATLAB อีกคำที่มีความคล้ายคลึงกันซึ่งทั้งหมดนี้เกิดขึ้นโดยบังเอิญ


0

Python 3 297 293 289 , 278 ไบต์

เมื่อ Arnauld เห็นคุณจะไม่สามารถรับ 0 เว้นแต่ว่าจะใช้กฎ 1 ซึ่งบันทึกไว้ในการเยื้อง ขอบคุณทุกคนที่แสดงความคิดเห็นพร้อมข้อเสนอแนะด้วย

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 ~
Zacharý

ฉันเชื่อว่า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 $/

Ungolfed:

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 ทั่วไป, 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))))))

ตามปกติใช้andและorโครงสร้างการควบคุมเป็นจำนวนมาก

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