Гра на відгадування


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 або Picture), яке показує, де користувач раніше здогадався на сітці заданих розмірів і лічильник повороту. (Якщо ви йдете на перший бонус, то цей бонус стосується лише режимів 2Dі 1D. Якщо ви додасте 3D-графічний вихід, ви отримаєте додаткові -50%.)
  • -60 байтів, якщо ви можете надати гамемоду (вибрану вхідним сигналом на початку; тобто, коли це дано 0, виконайте звичайний гамемод; коли дано 1, виконайте цей гамемод), в якому точка рухається 1 одиницею у довільному ортогональному напрямку за оборот

Детальніше про обгортання

Загортання відбувається лише тоді, коли в третьому бонусі точка переміщення переміщується через будь-яку з меж; у цьому випадку рухома точка викривляється до відповідної точки, наприклад:

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

Таке поводження не впливає на здогадки користувача, окрім того, що точка змінила напрямок.


Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон 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
Незначна нитка: ви, мабуть, маєте на увазі, що вона накручується як торус, а не сфера. Неможливо намотати 2D-сітку на сферу, не створюючи розривів.
Алістер Бакстон

2
Крім того, якщо дошка загортається, то, можливо, буде коротший шлях між здогадою та ціллю, перетинаючи край.
Алістер Бакстон

1
@NBZ Так, можна.
Conor O'Brien

1
@NBZ 1 одиниця в одному напрямку.
Conor O'Brien

2
1. Я досі не впевнений, що таке топологія. Щоб зрозуміти речі, якщо дошка є 10x10, випадкова точка є (9,4), і я думаю (2,2), відстань sqrt(13)або sqrt(53)? (Зверніть увагу на майбутнє: якщо ви робите щось дивне, не включайте випадковість, оскільки це майже неможливо надати тестові випадки). 2. У третьому бонусі слід обчислювати відстань і виводити до або після переміщення точки?
Пітер Тейлор

Відповіді:


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

Піта, 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

Святий молі, це якийсь довгий піт-код. Не дуже гольф хоч. Наприклад, я бачу два пробіли, які можна видалити. Також: Ви можете використовувати J=YmOvwvwзамість VvwaYOvw;JY, що на 2 байти коротше. Я не переглянув інший код, але, мабуть, ви також можете скоротити кілька речей там.
Якубе

@ Jakube, я припускав, що натяк повідомляє нам, де зараз йдеться
JNF

3

Пітон 2, 210 - 150 = 60

from random import*
q,r,o=map,raw_input,int
a=q(randrange,q(o,r().split(' ')))
m=q(o,r().split(' '))
t=1
while m!=a:print sum([(c-d)**2for c,d in zip(m,a)])**.5;m=q(o,r().split(' '));t+=1
print'You won in %d'%t

Перший виклик лише поки що. Спробуйте в Інтернеті


3

Піп, 43 42 байти - 150 = -108

Приймає параметри плати як аргументи командного рядка (D означає кількість аргументів). Приймає здогадки як пробіли, розділені пробілами на stdin.

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

Цей код сильно користується функціями програмування масиву Піпа. Масив аргументів cmdline зберігається в g. Ми створюємо точку, яка здогадалася шляхом зіставлення оператора randrange RRнад gі смикати отриманий список в yзмінної. Потім йде головний цикл while, де умова така:

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

Хаскелл, 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

Діалог АПЛ , 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) перед викликом, відповідно до ОП).
P←?Sмета отримує випадкову точку в діапазоні 1, хоча кожен з розмірних меж
{}⍣≢C←0повторюйте функцію, поки результат не буде відрізнятися від результату C, який спочатку отримує 0
?2випадкове число 0 або 1
¯1 1[]індекс зі списку двох чисел,
помножених на режим; робить, 0якщо режим 0
D↑pad з 0s, щоб відповідати кількості вимірів,
(?D)⌽повертати список випадковим чином (від 0 до кількості вимірів-1)
P+відрегулюйте поточний
S|модуль світового розміру
P←цілі, збережіть нову здогадку введення
C+←1лічильника приросту точки цілі
P≢G←⎕:, і якщо вона відрізняється від точки цілі, то ...
P-Gвідстані в кожному розмірному
2*⍨квадраті
+/підсумовують їх друк
.5*⍨квадратного кореня,
⎕←який
0⊣повертає 0 (тобто ідентичний початковому значенню, так повторити)
C... інше, поверніть кількість здогадок (що, не відрізняючись від 0, зупиняє циклічне завершення та повертає останнє значення)


@Dennis Власне, я порушив це, коли зробив це функцією, тож це знову програма. Я врятував стільки байтів, скільки «програмованість» коштував мені, перейшовши на початковий показник 0, що дозволяє OP.
Adám

1
ДОБРЕ. З цікавості: який це діалект? Я поняття не маю, що передбачається зробити перший рядок ...
Денніс

@Dennis Dyalog. Це традиційна функція, перший рядок - рядок [0], тобто заголовок функції, але це виглядає незвично, оскільки він має left-arg fn-name right-arg, але результату немає.
Adám
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.