Lebih Panas atau Dingin: Temukan Harta Karun

8

Gim anak-anak tertentu, sering disebut "Huckle Buckle Beanstalk", dimainkan dengan dua pemain. Berikut adalah deskripsi singkat tentang bagaimana permainan itu dimainkan:

  1. Satu pemain ditunjuk sebagai "penyembunyi", dan yang lainnya "pencari".
  2. Pencari keluar dari ruangan sementara penyembunyi menyembunyikan benda kecil yang dipilih sebelumnya, "harta".
  3. Penyembunyi kemudian mencoba mencari objek sementara pencari memberi mereka petunjuk bermanfaat:
    • Jika pencari mendekati harta, penyembunyi akan memanggil "lebih hangat!"
    • Jika pencari bergerak menjauh dari harta karun, penyembunyi akan memanggil "dingin!"
  4. Begitu pencari menemukan harta itu, mereka mengumumkan bahwa mereka telah menemukannya.

Anak-anak Anda ingin Anda bermain game ini dengan mereka, namun, Anda sangat sibuk menjawab pertanyaan pada codegolf.SE sebagai gantinya. Jadi, Anda memutuskan untuk menulis program untuk bermain game dengan mereka. Namun, Anda ingin menggunakan waktu sesedikit mungkin mengetik, jadi Anda mencoba membuat program sesedikit mungkin karakter.

Kita dapat mendefinisikan ruang di mana game dimainkan sebagai bidang persegi toroidal dua dimensi. Koordinat 0,0adalah sudut kiri bawah, dan koordinat 99,99adalah sudut kanan atas. Harta itu ditempatkan pada posisi tertentu di n,mmana ndan mkeduanya bilangan bulat positif antara 0 dan 99 inklusif.

Program Anda akan mendapatkan input dari pemain menggunakan fungsi input pengguna inbuilt-nya (mis prompt(). raw_input(), Dll.) Jika bahasa yang Anda pilih tidak memiliki fungsi input pengguna, ambil input dari STDIN sebagai gantinya. Gim akan bekerja sebagai berikut:

  1. Program "menyembunyikan" harta karun pada suatu posisi n,m.
  2. Program meminta pencari untuk memasukkan posisi pencarian awal. Input akan datang dalam bentuk di x ymana xdan ybilangan bulat positif.
  3. Program menghasilkan "benar" jika posisi pencarian awal x,ysama dengan posisi harta n,mdan berakhir. Jika tidak:
  4. Program akan meminta pencari untuk pindah. Input datang dalam bentuk a bdi mana adan badalah bilangan bulat yang mungkin negatif . Ini mewakili vektor arah yang dicari oleh pencari ( aadalah arah x dan badalah arah y).
  5. Jika posisi yang dihasilkan dari pencari berada di harta karun, program output "benar" dan berakhir. Jika tidak:
  6. Program menghasilkan "pendingin" jika pencari bergerak menjauh dari harta karun, atau "lebih panas" jika mereka bergerak menuju harta karun.
  7. Lanjutkan ke langkah 4.

Kata-kata "bergerak menjauh" dan "bergerak ke arah" mungkin bersifat ambisius. Untuk tantangan ini, jika posisi yang dihasilkan dari pencari setelah bergerak lebih dekat ke harta daripada posisi mereka sebelum mereka bergerak, mereka bergerak menuju harta. Kalau tidak, mereka akan pindah. (Ya, ini berarti bahwa jika posisi resultan dan sebelumnya berada pada jarak yang sama, program akan menampilkan "cooler").

Ini kode golf, jadi kode terpendek menang. Ajukan pertanyaan jika spesifikasinya tidak jelas.

Absinth
sumber
Apakah input yang diminta harus berisi teks / pertanyaan? Jika demikian, harap sebutkan.
Martin Ender
6
Saya telah melihat permainan ini diputar berkali-kali di TV dan telah melakukannya sendiri beberapa kali, tetapi saya belum pernah mendengar istilah " Huckle Buckle Beanstalk ".
Calvin Hobbies
@ Martin Tidak, tidak perlu ada teks apa pun.
absinthe
1
@Ipi Field adalah toroidal, yaitu mereka akan membungkus ke sisi lain dari field.
absinthe
1
Bergerak membungkus, tetapi bagaimana dengan perhitungan jarak? Apakah jarak antara (0,0) dan (99,99) sama dengan 1 atau 99 · √2?
Tobia

Jawaban:

2

Javascript, 275 279

Bukan pemenang dengan cara apa pun, tetapi ini harus memulai sesuatu. Menggunakan trik dengan eval()dan mendefinisikan 100sebagai "konstan" untuk memotong beberapa byte. Versi tidak dikumpulkan di bawah ini.

function D(){return Math.sqrt((x-n)*(x-n)+(y-m)*(y-m))}
H=100;
n=~~(Math.random()*H);m=~~(Math.random()*H);
P="s=prompt().split(' ')";
eval(P);
x=~~s[0];y=~~s[1];i=0;
while(x!=n||y!=m)
{
    if(i)alert(i>j?"hotter":"colder");
    i=D();
    eval(P);
    x=(x+~~s[0])%H;
    y=(y+~~s[1])%H;
    j=D()
}
alert("correct")

Sunting: Saya menjadi korban operasi string + angka Javascript, karenanya mengapa D()tidak bekerja dengan baik. Saya juga memperbaiki bug di mana "lebih panas" ditampilkan sebelum "benar". Ini menambahkan 4 byte.

Sean Latham
sumber
1
mengapa menggunakan titik koma?
haskeller bangga
Jika ndan mkeduanya diatur ke nol (untuk tujuan pengujian), dan 0 1dimasukkan sebagai posisi awal, keduanya 0 -1dan 0 1kembali lebih dingin.
es1024
Dalam for loop, mengapa Anda memiliki baris baru? Letakkan semua kode pada satu baris dan Anda dapat menyimpan 22 karakter (mungkin lebih).
Beta Decay
1
Ini adalah versi tanpa ungolfed. Versi aslinya semuanya dalam satu baris (panjang 275 karakter).
Sean Latham
javascript jokecolder == cooler
ajax333221
2

Python 3 - 238 byte


Kode:

from random import*
r=randint;a=100;X=r(0,a);Y=r(0,a);d=0;F=lambda:((X-x%a)**2+(Y-y%a)**2)**0.5;i=lambda:map(int,input().split());x,y=i()
while F():
 if d:print(["cooler","hotter"][d<D])
 D=F();Z,K=i();x+=Z+a;y+=K+a;d=F()
print("correct")

Tidak Disatukan:

from random import*

treasure_x = random.randint(0,100)
treasure_y = random.randint(0,100)
distance = lambda:((treasure_x - x % 100) ** 2 + (treasure_y - y % 100) ** 2) ** 0.5
x, y = map(int, input("Coordinates in the form x y: ").split())
new_distance = 0

while distance():
    if new_distance:
        if new_distance < prev_distance:
            print("hotter")
        else:
            print("cooler")
    prev_distance = distance()
    dx, dy = map(int, input("Move in the form dx dy: ").split())
    x = (dx + x) % 100
    y = (dy + y) % 100
    new_distance = distance()

print("correct")

Contoh dijalankan:

$ python hotter_colder.py 
50 50
10 0
cooler
-10 0
hotter
-10 0
hotter
-10 0
hotter
-10 0
hotter
-10 0
cooler
5 0
hotter
1 0
hotter
1 0
hotter
1 0
hotter
1 0
hotter
1 0
cooler
-1 0
hotter
0 10
cooler
0 -10
hotter
0 -10
hotter
0 -10
cooler
0 5
hotter
0 1
hotter
0 1
correct

Saya tidak akan mengatakan bahwa strategi saya dalam menemukan harta adalah partikularitas cepat ...

matsjoyce
sumber
2

Groovy - 278 266 262

Golf:

def x,y,n,m,d,D=999,S=100,r=newScanner(System.in);n=Math.floor(Math.random()*S);m=Math.floor(Math.random()*S);while(true){x=r.nextInt();y=r.nextInt();d=Math.sqrt((x-n)**2+(y-m)**2);if(d==0){print"Correct";break;}else if(d<D){print"Cooler"}else{print"Hotter"}D=d}

Tidak Disatukan:

def x,y,n,m,d
def dist = 99999
def r = new Scanner(System.in)
def S = 100
n = Math.floor(Math.random()*S)
m = Math.floor(Math.random()*S)
println "Treasure is at: $n $m"
while(true){
    x = r.nextInt()
    y = r.nextInt()
    d = Math.sqrt((x-n)**2+(y-m)**2)
    if(d == 0){print "Correct"; break;}
    else if(d > dist){print "Hotter" }
    else{print "Cooler"}
    dist = d
}

Percobaan:

-1 -1
Cooler 12 12
Cooler 14 14
Cooler 13 13
Hotter 15 15
Cooler 90 55
Cooler 95 -100
Hotter 95 83
Correct
Anak kecil
sumber
Bisakah Anda mendokumentasikan beberapa contoh proses dari solusi ini? Saya percaya Math.sqrt ((xn 2) + (ym 2)) mengembalikan NaN ketika x <n, y <m.
Michael Easter
Ya tentu. Segera setelah saya tiba di rumah :)
Little Child
Keren ... Catatan: seperti yang saya pahami OP, input awal adalah posisi absolut, dan input selanjutnya relatif. Juga, grid membungkus (toroidal). Saya tidak melihat bagaimana ini bekerja, apa adanya, dan saya terkejut menerima upvote.
Michael Easter
@MichaelEaster Silakan periksa hasil edit. Beritahu saya jika saya melakukan kesalahan :)
Little Child
Saya telah memposting solusi saya, karena saya mengerti masalahnya. Saya tidak dapat mengomentari Anda tetapi akan membiarkan pemilih memutuskan :)
Michael Easter
2

Groovy - 343 karakter

Berasal dari jawaban LittleChild .

Golf:

z=100
f={Math.floor(Math.random()*z)}
h={println it}
r=new Scanner(System.in)
i={r.nextInt()}
n=f();m=f();x=i();y=i();p=z;a=0;b=0
g={(Math.abs(it))**2};o={i,j->(j<0)?(((i+j)<0)?(((i+j)+z)%z):(i+j)):(i+j)%z};u={Math.sqrt g(n-x)+g(m-y)};d=u()
while(d>0.1){if(d<p){h "Hotter"}else{h "Cooler"};a=i();b=i();x=o(x,a);y=o(y,b);p=d;d=u()}
h "Correct"

Tidak Disatukan:

z=100
f={Math.floor(Math.random()*z)}
h={println it}
r=new Scanner(System.in)
i={r.nextInt()}

n=f();m=f()
x=i();y=i()
p=z;a=0;b=0

g = {(Math.abs(it))**2}
o = {i,j->(j<0)?(((i+j)<0)?(((i+j)+z)%z):(i+j)):(i+j)%z}
u = {Math.sqrt g(n-x)+g(m-y)};d=u()

while (d>0.1) {
    if (d<p) { h "Hotter" } else { h "Cooler" }
    a=i();b=i()
    x=o(x,a);y=o(y,b)
    p=d;d=u()
}
h "Correct"

Contoh dijalankan, di mana program memancarkan target untuk ilustrasi. Dari pemahaman saya tentang OP, input awal adalah absolut, dan input selanjutnya adalah relatif. Juga, grid membungkus.

jalankan A:

bash$ groovy X.groovy 
goal 98.0 19.0
1 19
Hotter
-1 0
Cooler
-1 0
Hotter
-1 0
Correct

jalankan B:

bash$ groovy X.groovy 
goal 93.0 20.0
90 16
Hotter
2 2
Hotter
1 0
Hotter
0 -18
Cooler
0 -1
Cooler
0 -1
Hotter
0 -79
Hotter
0 1
Correct
Michael Easter
sumber
Senang bahwa kode saya bermanfaat bagi Anda! acungan jempol :)
Little Child
2

APL, 86 karakter

h←?2⍴s←100⋄1{h≡n←s|s+⍵+⎕:⎕←"correct"⋄⍺:0∇n⋄⎕←(</+/⊃×⍨n⍵-¨⊂h)⌷"cooler" "hotter"⋄0∇n}0 0

Perhitungan jarak tidak membungkus, tetapi bergerak.

Tidak Disatukan:

h←?2⍴s←100                  ⍝ generate random starting point
1{                          ⍝ loop starting with ⍺←1 (1 if first loop) and ⍵←0 0 (position)
    n←s|s+⍵+⎕               ⍝ n←new position, ⍵ plus the move read from input, modulo 100
    n≡h: ⎕←"correct"        ⍝ check for end condition
    ⍺: 0∇n                  ⍝ if first loop, skip the rest and ask for a move again
    t←</+/⊃×⍨n⍵-¨⊂h         ⍝ t←1 if n is closer to h than ⍵ (squared distance)
    ⎕←t⌷"cooler" "hotter"   ⍝ output thermal gradient label
    0∇n                     ⍝ loop with new position
}0 0

Contoh:

⎕:
      22 33
⎕:
      2 6
hotter
⎕:
      0 1
cooler
⎕:
      0 ¯3
correct
Tobia
sumber
2

Python 2.7, 227

from random import*
r=randint
h=100
n=r(0,h)
m=r(0,h)
i=lambda:map(int,raw_input().split())
x,y=i()
d=lambda:(x%h-n)**2+(y%h-m)**2
e=d()
while e:
 p=e;a,b=i();x+=a;y+=b;e=d()
 if e:print e<p and'hotter'or'cooler'
print'correct'

Saya mendapat fungsi input dan ide untuk menerapkan modulo dalam perhitungan jarak daripada pembaruan lokasi dari jawaban matsjoyce.

Kami hanya perlu jarak untuk perbandingan: Apakah kami berada di lokasi yang tepat? Apakah kita lebih dekat dari sebelumnya? Untuk kedua hal ini, kami mendapatkan hasil yang sama dengan membandingkan kuadrat jarak seperti halnya membandingkan jarak. Perhitungan akar kuadrat yang diperlukan untuk mendapatkan jarak aktual tidak perlu.

Tidak Disatukan:

import random

h = 100 # height (and width) of the square grid

# location of item
n = random.randint(0, h)
m = random.randint(0, h)

def input_pair():
    return map(int, raw_input().split())

x,y = input_pair()

def distance_squared():
    return (x % h - n)**2 + (y % h - m)**2

er = distance_squared()
while er:
    previous_er = er
    a,b = input_pair()
    x += a
    y += b
    er = distance_squared()
    if er:
        print 'hotter' if er < previous_er else 'cooler'
print 'correct'

Contoh dijalankan:

50 50
20 0
hotter
20 0
cooler
-20 0
hotter
10 0
cooler
-10 0
hotter
-1 0
hotter
-1 0
hotter
-5 0
cooler
5 0
hotter
-1 0
cooler
1 0
hotter
1 0
cooler
-1 0
hotter
0 10
hotter
0 10
hotter
0 10
cooler
0 -5
hotter
0 -1
hotter
0 -1
hotter
0 -1
correct
Gary Culp
sumber
Trik dengan kuadrat, mengabaikan langkah akar kuadrat, sangat pintar. +1
absinthe
1

ECMAScript 6, 262

Z=100;A=Math.abs;P=(a,b)=>(q=Math.min(A(a-b),Z-A(a-b)),q*q);G=_=>prompt().split(' ');R=_=>new Date%Z;V=_=>P(X,I)+P(Y,J);I=R();L=G();X=+L[0];Y=+L[1];J=R();for(D=V();D;D=N)T=G(),X=(+T[0]+Z+X)%Z,Y=(+T[1]+Z+Y)%Z,N=V(),N&&alert(N<D?"hotter":"cooler");alert("correct")

Tidak Disatukan:

Z=100;
M=Math.min;
A=Math.abs;
S=a=>a*a;
P=(a,b)=>S(M(A(a-b),Z-A(a-b)));
G=_=>prompt().split(' ');
R=_=>new Date%Z;
V=_=>P(X,I)+P(Y,J);
I=R();
L=G();
X=+L[0],Y=+L[1];
J=R();
for(D=V();D;D=N)
    T=G(),
    X=(+T[0]+Z+X)%Z,Y=(+T[1]+Z+Y)%Z,
    N=V(),
    N&&alert(N<D?"hotter":"cooler");
alert("correct")
es1024
sumber
1

C 193 176 171

#define F x*x+y*y
x,y,a,b,d;main(){srand(time(0));x=rand();y=rand();while(scanf("%d %d",&a,&b),x-=a,x%=100,y-=b,y%=100,puts(F?F<d?"hotter":d?"cooler":"":"correct"),d=F);}

Saya yakin harus ada penghematan pada pembuatan nomor acak. Terlepas dari itu, kuncinya adalah membaca di x & y hanya diperlakukan sebagai offset dari 0, jadi saya hanya perlu satu pemindaian. Itu berarti bahwa saya harus menekan pencetakan lebih panas atau lebih dingin pada iterasi pertama.

Perubahan:

Masukkan lokasi ke x & y secara langsung dan kemudian geser kembali ke (0,0) daripada meletakkannya di m & n dan gunakan x & y untuk mencarinya.

Saya menyadari bahwa saya mencetak "lebih panas" dan "benar" sehingga saya harus menambahkan tiga karakter tambahan di sini.

Menulis ulang pencetakan untuk memasukkan semua kondisi di dalamnya, menyimpan panggilan ekstra untuk menempatkan ().

Ahli alkimia
sumber
1

JavaScript ES6, Firefox Terbaru, 177 173 164 karakter

Jelas, ini tidak bisa mengalahkan APL. Bahasa itu gila! Mungkin dikembangkan hanya untuk pertanyaan kode-golf: D: P

Tapi inilah solusi saya dalam JavaScript ES6. Jalankan di Firefox Nightly terbaru (atau mungkin juga versi rilis) di Web Console atau Scratchpad.

A=a=>a*a;a=alert;g=v=>[x,y]=prompt().split(" ");r=v=>Math.random()*100|0;n=r(m=r(d=0));D=v=>A(n-x)+A(m-y);while(d=D(g(l=d)))l&&a(l<d?"hotter":"cooler");a("correct")

Saya ingin melewati versi yang tidak diserang untuk saat ini. Komentari jika Anda ingin melihat versi yang tidak disembunyikan :)

EDIT : Banyak bermain golf! berkurang 9 karakter. Masih melihat apakah lingkup golf lebih jauh.

Pengoptimal
sumber
0

Python 226

from random import randint as r
x=r(0,100)
y=r(0,100)
l=9**9
while True:
    i,j=map(int,raw_input().split())
    if x==i and y==j:
        print 'correct'
        break
    c=(x-i)**2+(y-j)**2
    if c<l:print 'warmer'
    elif c>l:print 'colder'
    l=c

Itu importterlihat sangat panjang dan bodoh, tetapi sebenarnya menyelamatkan saya 8 karakter.:D

Contoh game:

50 50
warmer
50 75
colder
50 25
warmer
50 13
colder
50 37
colder
50 20
warmer
50 21
warmer
50 22
warmer
50 23
warmer
50 24
warmer
50 26
colder
50 25
warmer
25 25
colder
75 25
warmer
74 25
warmer
62 25
warmer
61 25
warmer
55 25
colder
56 25
warmer
57 25
warmer
58 25
warmer
59 25
warmer
60 25
warmer
61 25
warmer
62 25
colder
61 25
warmer
61 24
correct
Sammitch
sumber
0

Sinclair / ZX Spectrum BASIC - 305 byte

10 RANDOMIZE:LET o=99:LET a=INT(RND*99)+1:LET b=INT(RND*99)+1:PRINT a,b
20 INPUT "sx,sy:";c,d
30 LET g=SQR(ABS(a-c)^2+ABS(b-d)^2)
40 PRINT g'c,d
60 IF g=0 THEN PRINT "Found!":STOP
70 INPUT "mx,my:";x,y:LET c=c+x:let d=d+y
80 PRINT ("hotter" AND g<o)+("colder" AND g>o)
90 LET o=g:GOTO 30

Karena Spectrum menyimpan setiap kata kunci sebagai satu byte, ini membantu menjaga ukurannya tetap rendah. Setelah dimasukkan, cari tahu ukurannya dengan

print "bytes:";peek 23641+256*peek 23642-(peek 23635+256*peek 23636)+1
Brian
sumber