Есть игра, в которую я люблю играть. Это происходит на сетке конечного размера (но она обернута, как сфера). На этой сетке выбирается случайная (только целочисленная) точка. Затем мне, пользователю, предлагается ввести координаты. Если мои данные точно совпадают со случайной точкой, мне говорят, что я выиграл. В противном случае мне сообщают точечное расстояние между моим входом и случайной точкой. Например, если бы я угадал, (2,2)
и случайная точка была в (4,3)
, то расстояние было бы sqrt[(3-2)^2 + (4-2)^2] = sqrt[5]
.
Игра продолжается до тех пор, пока игрок не окажется в правильном месте точки.
Задача Создать функциональную версию игры, описанную выше. Вы должны создать полную программу для этого. Вот что должна делать ваша программа:
- Запросите два ввода: высоту и ширину доски. Источник находится в верхнем левом углу доски. Эти входы не будут превышать
1024
. - Выберите случайную точку на этой доске; это будет точка, которую нужно угадать.
- Принять ввод, имитирующий поворот. Входными данными будут либо пара целых чисел, разделенных пробелами, либо два отдельных целочисленных входа. В ответ на этот ввод программа выполнит одно из двух действий:
- Если вход соответствует выбранной случайной точке, выведите сообщение, сигнализирующее о победе пользователя. Я бы предложил «Вы выиграли!».
- В противном случае выведите расстояние между точкой ввода пользователя и случайной точкой.
- Как только пользователь добился победы, отобразите количество поворотов, которые сделал пользователь. Программа затем выходит.
Бонусы
Бонусы применяются в порядке их появления в этом списке
- -150 байт, если ваша программа принимает входное целое число,
D
которое описывает размер, в котором происходит игра. Например, еслиD = 3
, тогда вы создаете случайную точку3
целых чисел, берете3
целочисленные входные данные и выводите расстояние между этими точками. - -50% (или + 50%, если
score < 0
), если вы предоставляете графическое представление доски (ASCII или рисунок), которая показывает, где пользователь ранее угадал на сетке заданных размеров и счетчика поворотов. (Если вы идете в первый бонус, то этот бонус применяется только к2D
и1D
режимам. При добавлении графического вывода 3D, вы получаете дополнительные -50%) . - -60 байт, если вы можете предоставить игровой режим (выбранный входом в начале; то есть, если дано
0
, выполнить обычный игровой режим; когда дано1
, выполнить этот игровой режим), в котором точка перемещается на 1 единицу в случайном ортогональном направлении за ход
Подробнее об упаковке
Свертывание происходит только тогда, когда в третьем бонусе движущаяся точка перемещается через любую из границ; в этом случае точка перемещения деформируется в соответствующую точку, например так:
... ...
..R (move right) R..
... ...
Такое поведение обтекания не влияет на догадки пользователя, за исключением того факта, что точка изменила направление.
Leaderboard
Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# 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
10x10
случайная точка(9,4)
, я думаю(2,2)
, это расстояниеsqrt(13)
илиsqrt(53)
? (Примечание на будущее: если вы делаете что-то странное, не включайте случайность, потому что практически невозможно предоставить контрольные примеры). 2. В третьем бонусе следует вычислять и выводить расстояние до или после перемещения точки?Ответы:
CJam,
-113-139-152-157-159 байтовПрограмма имеет длину 51 байт и имеет право на бонусы -150 байт и -60 байт .
Режим игры и количество измерений читаются как аргумент командной строки, размер в каждом измерении из STDIN. Поскольку сообщение о победе является произвольным , программа напечатает
0.0
(расстояние до цели), чтобы указать, что игра окончена.Тестовые прогоны
Как это устроено
источник
Пиф, 91 (-150 -60) = -119
Старое решение: (54-150 = -96)
Весь ввод происходит в новой строке.
1
либо0
)ПервоеВторое целое числоD
представляет размеры игры.D
входы представляют размер поляD
вход с этого момента является догадкойПример воспроизведения (подсказки не появляются в реальной программе):
источник
J=YmOvwvw
вместоVvwaYOvw;JY
, что на 2 байта короче. Я не просматривал другой код, но я думаю, что вы также можете сократить несколько вещей там.Python 2, 210 - 150 = 60
Первый вызов только пока. Попробуйте онлайн
источник
Пип,
4342 байта - 150 = -108Принимает размеры платы в качестве аргументов командной строки (с D подразумевается из числа аргументов). Принимает догадки как разделенные пробелами числа на стандартном вводе.
Этот код в значительной степени использует возможности программирования массивов в Pip. Массив аргументов cmdline хранится в
g
. Мы создаем точку, которая догадалась путем сопоставления оператора randrangeRR
надg
и дергать полученный список вy
переменной. Затем следует основной цикл while, где условие выглядит следующим образом:Если расстояние было ненулевым, внутренняя часть цикла печатает его. Если это было ноль, мы достигли целевой точки; цикл останавливается, и программа выводит сообщение о победе и количество ходов.
Пример выполнения:
источник
R 134 - 150 = -16 байт
источник
Haskell, 240 - 150 = 90
источник
Дьялог АПЛ ,
7771 - 210 = -139Ok:
Обратите внимание, что это выполняется в источнике индекса 0 (
⎕IO←0
), который используется по умолчанию во многих APL.Принимает логический режим в качестве правого аргумента (
M
), а размеры в качестве левого аргумента (S
).Количество измерений
D
, которое должно быть установлено (например,D←3
перед вызовом, согласно OP).P←?S
цель получает случайную точку в диапазоне 1, хотя каждая из границ измерения{
...}⍣≢C←0
повторяет функцию до тех пор, пока результат не отличается от результатаC
, который изначально получает0
?2
случайное число 0 или 1¯1 1[
...]
индекс из списка двух чисел,M×
умноженных на режим; делает,0
если режим равен0
D↑
pad с0
s, чтобы соответствовать количеству измерений, корректирует текущую цель, модуль размера мира(?D)⌽
вращать список случайным образом (от 0 до количества измерений-1)P+
S|
P←
сохранить новое предположениеC+←1
счетчика приращения точки целиP≢G←⎕:
, и если оно отличается от точки цели, то ...P-G
расстояния в2*⍨
квадрате каждого измерения+/
суммируют их.5*⍨
квадратно-корневую⎕←
печать, которая0⊣
возвращает 0 (т. е. идентично исходному значению, поэтому repeat)C
... else, возвращает количество догадок (которое, в отличие от 0, останавливает цикл и возвращает последнее значение)источник