เกมทายผลแบน


13

มีเกมที่ฉันชอบเล่น มันเกิดขึ้นบนกริดที่มีขนาด จำกัด (แต่มันถูกห่อเหมือนทรงกลม) บนกริดนั้นจะมีการเลือกจุดแบบสุ่ม (เลขจำนวนเต็มเท่านั้น) จากนั้นฉันผู้ใช้จะได้รับแจ้งให้ป้อนค่าพิกัด หากอินพุตของฉันตรงกับจุดสุ่มฉันจะบอกว่าฉันชนะ ไม่เช่นนั้นฉันจะบอกระยะห่างระหว่างจุดเข้ากับจุดสุ่มของฉัน ตัวอย่างเช่นถ้าผมเดา(2,2)และจุดที่สุ่มที่แล้วระยะทางที่จะเป็น(4,3)sqrt[(3-2)^2 + (4-2)^2] = sqrt[5]

เกมจะดำเนินต่อไปจนกว่าผู้เล่นจะมาถึงตำแหน่งที่ถูกต้องของจุด


วัตถุประสงค์สร้างเกมเวอร์ชั่นที่ใช้งานได้ตามที่อธิบายไว้ข้างต้น คุณต้องสร้างโปรแกรมเต็มรูปแบบเพื่อทำเช่นนั้น นี่คือสิ่งที่โปรแกรมของคุณควรทำ:

  1. ขอสองอินพุต: ความสูงและความกว้างของบอร์ด ต้นกำเนิดอยู่ที่ด้านซ้ายบนของกระดาน 1024ปัจจัยเหล่านี้จะไม่เกิน
  2. เลือกจุดสุ่มบนกระดานนั้น นี่จะเป็นจุดที่จะเดาได้
  3. ยอมรับอินพุตจำลองการเลี้ยว อินพุตจะเป็นทั้งคู่จำนวนเต็มคั่นด้วยช่องว่างหรือสองจำนวนเต็มแยกจากกัน ในการตอบกลับอินพุตนี้โปรแกรมจะทำหนึ่งในสองสิ่งต่อไปนี้:
    1. หากอินพุตตรงกับจุดสุ่มที่เลือกเอาท์พุทข้อความส่งสัญญาณชัยชนะของผู้ใช้ ฉันจะแนะนำ "คุณได้รับรางวัล!"
    2. มิฉะนั้นให้ส่งออกระยะห่างระหว่างจุดอินพุตของผู้ใช้กับจุดสุ่ม
    ไม่ว่าในกรณีใดคุณจะต้องเพิ่มตัวนับรอบ
  4. เมื่อผู้ใช้ได้รับชัยชนะแสดงจำนวนรอบที่ผู้ใช้ทำ จากนั้นโปรแกรมจะออก

โบนัส

โบนัสจะถูกนำไปใช้ตามลำดับที่ปรากฏในรายการนี้

  • -150 ไบต์หากโปรแกรมของคุณใช้จำนวนเต็มอินพุทDที่อธิบายถึงมิติของเกม เช่นถ้าD = 3คุณสร้างจุดสุ่มของ3จำนวนเต็มรับ3อินพุตจำนวนเต็มและส่งออกระยะทางระหว่างจุดเหล่านั้น
  • -50% (หรือ + 50% ถ้าscore < 0) หากคุณแสดงภาพกราฟิกของบอร์ด (ASCII หรือรูปภาพ) ที่แสดงตำแหน่งที่ผู้ใช้คาดเดามาก่อนหน้านี้ในตารางขนาดที่กำหนดและตัวนับเทิร์น (หากคุณไปรับโบนัสแรกโบนัสนี้จะใช้กับโหมด2Dและ1Dเท่านั้นหากคุณเพิ่มเอาต์พุตกราฟิก 3D คุณจะได้รับ -50% เพิ่มเติม)
  • -60 ไบต์หากคุณสามารถระบุโหมดเกม (เลือกโดยอินพุตในตอนเริ่มต้นนั่นคือเมื่อได้รับ0แล้วให้ดำเนินการเกมโหมดปกติเมื่อได้รับ1แล้วให้เล่นเกมนี้) ซึ่งมีจุดเคลื่อนที่ 1 หน่วยในทิศทางแบบสุ่มมุมฉากต่อเทิร์น

เพิ่มเติมเกี่ยวกับการห่อ

การห่อเกิดขึ้นเฉพาะเมื่อในโบนัสที่สามจุดเคลื่อนที่จะเคลื่อนที่ข้ามขอบเขตใด ๆ ในกรณีนี้จุดต่อจะบิดงอตามจุดเช่น:

...              ...
..R (move right) R..
...              ...

พฤติกรรมการห่อนี้ไม่มีผลต่อการคาดเดาของผู้ใช้นอกเหนือจากข้อเท็จจริงที่ว่าจุดนั้นเปลี่ยนทิศทาง


ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในบรรทัดแรกโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของสองไฟล์หรือคุณต้องการแสดงรายการการลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

# Perl, 43 + 2 (-p flag) = 45 bytes

คุณยังสามารถทำให้ชื่อภาษาเป็นลิงก์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


7
ไมเนอร์ nitpick: คุณอาจหมายถึงมันหุ้มด้วยพรูไม่ใช่ทรงกลม เป็นไปไม่ได้ที่จะห่อกริด 2D ลงบนทรงกลมโดยไม่สร้างความไม่ต่อเนื่อง
Alistair Buxton

2
นอกจากนี้หากบอร์ดล้อมแล้วอาจมีเส้นทางที่สั้นกว่าระหว่างการเดาและเป้าหมายโดยการข้ามขอบ
Alistair Buxton

1
@NBZ ใช่คุณทำได้
Conor O'Brien

1
@NBZ 1 หน่วยเป็นทิศทางเดียว
Conor O'Brien

2
1. ฉันยังไม่แน่ใจว่าโทโพโลยีคืออะไร เพื่อช่วยล้างสิ่งต่าง ๆ ถ้ากระดานเป็น10x10จุดสุ่มคือ(9,4)และฉันเดาว่า(2,2)ระยะทางsqrt(13)หรือsqrt(53)? (หมายเหตุสำหรับอนาคต: ถ้าคุณทำอะไรแปลก ๆ อย่ารวมการสุ่มเพราะมันทำให้แทบจะเป็นไปไม่ได้ที่จะจัดทำกรณีทดสอบ) 2. ในโบนัสที่สามควรคำนวณระยะทางและเอาท์พุทก่อนหรือหลังจุดเคลื่อนที่?
Peter Taylor

คำตอบ:


8

CJam, -113 -139 -152 -157 -159 ไบต์

l~]:B:mr{_ea:i~mr0a*W2mr#+*.+B:,.=_[l~].-:mh_p}g],(

โปรแกรมมีความยาว51 ไบต์และมีคุณสมบัติสำหรับโบนัส-150 ไบต์และ-60 ไบต์

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

ทดสอบการทำงาน

$ cjam game.cjam 0 3; echo
2 2 2
1 1 1
1.4142135623730951
1 1 0
1.7320508075688774
1 0 1
1.0
0 0 1
0.0
4
$ cjam game.cjam 1 3; echo
2 2 2
0 0 0
1.0
0 0 0
0.0
2

มันทำงานอย่างไร

l~]       e# Read a line from STDIN, evaluate it and collect the result.
:B        e# Save the resulting array in B. The result is [B1 ... Bd],
          e# where Bk is the board size in dimension k.
:mr       e# Pseudo-randomly select a non-negative integer below Bk,
          e# for each k between 1 and d.
{         e# Do:
  _       e#   Copy the item on the stack. The original becomes a dummy value
          e#   that will be used to count the number of turns.
  ea      e#   Push the array of command-line arguments.
  :i~     e#   Cast each to integer and dump them on the stack.
          e#   This pushes m (game mode) and d (number of dimensions).
  mr      e#   Pseudo-randomly select a non-negative integer below d.
  0a*     e#   Push an array of that many zeroes.
  W2mr#   e#   Elevate -1 to 0 or 1 (selected pseudo-randomly).
  +       e#   Append the result (1 or -1) to the array of zeroes.
  *       e#   Repeat the array m times.
  .+      e#   Perform vectorized addition to move the point.
  B:,.=   e#   Take the k-th coordinate modulo Bk.
  _[l~]   e#   Push a copy and an evaluated line from STDIN.
  .-:mh   e#   Compute their Euclidean distance.
  _p      e#   Print a copy.
}g        e# While the distance is non-zero, repeat the loop.
],(       e# Get the size of the stack and subtract 1.
          e# This pushes the number of turns.

2
และเดนนิสก็เอาชนะทุกคน อีกครั้ง
Seadrus

1
คุณอัพเดทคะแนนไปเป็น 152 โดยไม่ตั้งใจ -152 ทำให้คุณอยู่อันดับสุดท้ายในกระดานผู้นำ
Moose

7

Pyth, 91 (-150 -60) = -119

VvwaYOvw;JY#IqQ1=dOlY XYd@S[0 @Jd +@Yd?O2_1 1)1)=T[)VYaT^-Nvw2)=ZhZ=b@sT2Iqb0Bb;p"Won in "Z

โซลูชันเก่า: (54-150 = -96)

JYVQaYOvw;#=J[)VYaJ^-Nvw2)=ZhZ=b@sJ2Iqb0Bb;p"Won in "Z

อินพุตทั้งหมดเกิดขึ้นในบรรทัดใหม่

  • เลขจำนวนเต็มแรกแสดงถึงโหมดเกม ( อย่างใดอย่างหนึ่ง1หรือ0 )
  • แรกจำนวนเต็มสองDแสดงให้เห็นถึงมิติของการเล่น
  • Dอินพุตถัดไปแสดงขนาดฟิลด์
  • ทุกDอินพุตจากจุดนี้จะถูกเดา

ตัวอย่างการเล่น (คำใบ้ไม่ปรากฏในโปรแกรมจริง):

  #Hint: Gamemode (1 or 0)
1
  #Hint: Dimensions
3
  #Hint: X-size
4
  #Hint: Y-size
4
  #Hint: Z-size
4
  #Hint: Guesses
  #Hint:[3, 2, 1]
3
2
2
1.0
  #Hint:[3, 2, 1]
3
2
1
1.0
  #Hint:[2, 2, 1]
2
2
1
1.0
  #Hint:[3, 2, 1]
3
2
1
Won in 4

การย้ายครั้งที่สองไม่ควรชนะหรือ?
JNF

@JNF จุดสามารถย้ายใน Gamemode 1 (-60 ไบต์โบนัส)
Jakube

Holy moly นั่นคือรหัส pyth ที่ยาว แม้ว่าจะไม่ใช่กอล์ฟจริงๆ เช่นฉันเห็นสองช่องว่างที่สามารถลบได้ นอกจากนี้: คุณสามารถใช้J=YmOvwvwแทนVvwaYOvw;JYซึ่งสั้นกว่า 2 ไบต์ ฉันไม่ได้ดูรหัสอื่น แต่ฉันคิดว่าคุณสามารถย่อบางสิ่งที่นั่นได้
Jakube

@ Jakube ฉันคิดว่าคำใบ้บอกเราว่าจุดนี้อยู่ที่ไหน
JNF


3

Pip, 43 42 ไบต์ - 150 = -108

ใช้ขนาดบอร์ดเป็นอาร์กิวเมนต์บรรทัดคำสั่ง (โดยมี D บอกเป็นนัยจากจำนวนของ args) ใช้การเดาเป็นตัวเลขคั่นด้วยช่องว่างบน stdin

YRR_MgWd:++i&RT$+(y-(q^s))**2Pd"Won in ".i

รหัสนี้ใช้ประโยชน์อย่างมากจากคุณสมบัติการเขียนโปรแกรมอาร์เรย์ของ Pip อาร์เรย์ของ args cmdline gถูกเก็บไว้ใน เราสร้างจุดที่จะเดาได้โดยการจับคู่ตัวดำเนินการRRช่วงgและดึงรายการผลลัพธ์ลงในyตัวแปร จากนั้นจะเป็น main ในขณะที่ loop ซึ่งเงื่อนไขเป็นดังนี้:

d:++i&RT$+(y-(q^s))**2

  ++i&                  Increment i, the guess counter; the result is always > 0, so the
                          short-circuiting & operator evaluates the next expression:
              q         Read a line from stdin
               ^s       Split on spaces
           y-(   )      Subtract from our chosen point itemwise
          (       )**2  Square, itemwise
        $+              Fold on +, summing the list of squares
      RT                Square root
d:                      Assign this distance to d

หากระยะทางไม่ใช่ศูนย์ภายในวงจะพิมพ์ออกมา ถ้ามันเป็นศูนย์เราจะไปถึงจุดเป้าหมาย; ลูปหยุดการทำงานและโปรแกรมส่งออกข้อความการชนะและจำนวนรอบ

ตัวอย่างการเรียกใช้:

C:\Users\dlosc> pip.py -f guessing.pip 10 5 6 4
5 2 3 2
3.1622776601683795
6 2 3 2
4.123105625617661
3 2 3 2
1.4142135623730951
3 1 3 2
2.23606797749979
3 2 2 2
1.7320508075688772
2 2 3 2
1
2 2 3 1
1.4142135623730951
2 3 3 2
Won in 8

2

R, 134 - 150 = -16 ไบต์

function(...){G=sapply(list(...),sample,1)
C=0
repeat{g=scan()
C=C+1
if(any(G!=g))cat(sqrt(sum((G-g)^2)))else{cat("Won in",C);break}}}

2

Haskell, 240 - 150 = 90

import System.Random
r x=randomRIO(0,x-1)
m=map read.words
g=getLine
main=do g;(fmap m g::IO[Int])>>=mapM r>>=b 1
b c v=do i<-fmap(sqrt.fromIntegral.sum.map(^2).zipWith(-)v.m)g;if i==0 then putStrLn$"Won in "++show c else do print i;b(c+1)v

1

Dyalog APL , 77 71 - 210 = -139

S F M
P←?S
{P←S|P+(?D)⌽D↑Mׯ1 1[?2]
C+←1
P≢G←⎕:0⊣⎕←.5*⍨+/2*⍨P-G
C}⍣≢C←0

ตกลง:

โปรดทราบว่าสิ่งนี้ทำงานในดัชนีกำเนิด 0 ( ⎕IO←0) ซึ่งเป็นค่าเริ่มต้นใน APL จำนวนมาก
ใช้โหมดบูลีนเป็นอาร์กิวเมนต์ขวา ( M) และขนาดมิติเป็นอาร์กิวเมนต์ซ้าย ( S)
จำนวนมิติคือDซึ่งจะต้องตั้งค่า (เช่นD←3) ก่อนการโทรตาม OP)
P←?Sเป้าหมายรับจุดสุ่มในช่วง 1 แม้ว่าแต่ละขอบเขตมิติ
{... }⍣≢C←0ซ้ำฟังก์ชั่นจนผลที่ได้จะแตกต่างจากCที่ตอนแรกได้รับ0
?2การสุ่มหมายเลข 0 หรือ 1
¯1 1[... ]ดัชนีจากรายการของตัวเลขสอง
คูณด้วยโหมด ทำให้0ถ้าโหมดเป็น0
D↑แผ่นที่มี0s เพื่อให้ตรงกับจำนวนมิติของ
(?D)⌽รายการหมุนแบบสุ่ม (0 ถึงจำนวนมิติ -1)
P+ปรับ
S|โมดูลัสขนาดเป้าหมายของโลกในปัจจุบัน
P←บันทึกจุดเป้าหมายที่
C+←1เพิ่มขึ้นเพิ่มตัวนับตอบโต้การ
P≢G←⎕:คาดเดาและถ้ามันแตกต่างจากจุดเป้าหมายแล้ว ...
P-Gระยะทางในแต่ละมิติ
2*⍨กำลังสอง
+/รวมพวกเขา
.5*⍨การ
⎕←พิมพ์สแควร์รูทที่
0⊣ส่งคืน 0 ทำซ้ำ)
C... มิฉะนั้นส่งคืนจำนวนการเดา (ซึ่งต่างจาก 0 หยุดการวนซ้ำและส่งคืนค่าสุดท้าย)


@Dennis จริงแล้วฉันทำผิดเมื่อฉันทำฟังก์ชั่นดังนั้นตอนนี้มันเป็นโปรแกรมอีกครั้ง ฉันบันทึกเป็นจำนวนมากเป็น "programmity" ทำให้ฉันเสียค่าใช้จ่ายโดยการสลับไปที่ดัชนีกำเนิด 0 ซึ่ง OP อนุญาต
Adám

1
ตกลง. จากความอยากรู้: ภาษาถิ่นนี้คืออะไร? ผมมีความคิดว่าบรรทัดแรกคิดว่าจะทำ ... ไม่มี
เดนนิส

@Dennis Dyalog นี่คือฟังก์ชั่นดั้งเดิมบรรทัดแรกคือบรรทัด [0] คือส่วนหัวของฟังก์ชั่น แต่มันดูผิดปกติเพราะมันมี left-arg fn-name right-arg แต่ไม่มีผลลัพธ์
58
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.