Реализуем классические каменные ножницы для бумаги.
условия:
- пользователь будет вводить 'r', 'p' или 's'
- Программа выведет «R», «P» или «S» и результат
- Выбор программы ('r', 'p' или 's') должен быть псевдослучайным ( я смотрю на тебя, Говард )
- результат может быть представлен любым печатным символом, всегда должно быть три возможных результата для того, что пользователь вводит (пользователь выигрывает, проигрывает или является ничьей).
- что происходит, если пользователь ничего не вводит, или что-то другое, что 'r', 'p' или 's', не должно иметь значения.
Вам нужно:
- Укажите код для игры в гольф.
- Негольфированный код
- Как вы вызываете программу
- Пробный прогон
Я выберу ответ с меньшим количеством символов, если будет выбран галстук, будет выбран наиболее проголосовавший ответ.
Хорошая игра в гольф и, возможно, удача будет в твою пользу.
Я буду публиковать ответ сам на Java.
Для тех, кто живет в горе под скалой:
г = рок
р = бумага
s = ножницы
камень: побеждает ножницы, проигрывает с бумагой, галстук с камнем.
бумага: выигрывает, качается, проигрывает ножницами, галстук с бумагой.
ножницы: выигрывает на бумаге, проигрывает с камнем, галстук с ножницами.
Текущие позиции:
- UN: имя пользователя
- PL: язык программирования
- CC: Количество символов
- UV: до голосов
╔══════════════════╦════════════╦══════╦════╗ ║ UN ║ PL ║ CC ║ UV ║ ╠══════════════════╬════════════╬══════╬════╣ ║ Howard ║ GolfScript ║ 6 ║ 15 ║ ║ primo ║ Perl ║ 27 ║ 7 ║ ║ TwiNight ║ APL ║ 31 ║ 4 ║ ║ primo ║ Perl ║ 33 ║ 7 ║ ║ marinus ║ APL ║ 36 ║ 5 ║ ║ primo ║ Perl ║ 38 ║ 7 ║ ║ primo ║ Perl ║ 48 ║ 7 ║ ║ manatwork ║ Ruby ║ 54 ║ 13 ║ ║ w0lf ║ GolfScript ║ 62 ║ 4 ║ ║ tmartin ║ K ║ 67 ║ 2 ║ ║ Abhijit ║ Python 3 ║ 74 ║ 5 ║ ║ beary605 ║ Python 3 ║ 76 ║ 4 ║ ║ rlemon ║ javascript ║ 85 ║ 4 ║ ║ ugoren ║ C ║ 86 ║ 3 ║ ║ Egor Skriptunoff ║ LUA ║ 87 ║ 4 ║ ║ Shmiddty ║ javascript ║ 87 ║ 3 ║ ║ Fors ║ Befunge ║ 107 ║ 3 ║ ║ Briguy37 ║ javascript ║ 117 ║ 2 ║ ║ Vi. ║ Clojure ║ 129 ║ 1 ║ ║ Henrik ║ C# ║ 167 ║ 4 ║ ║ dystroy ║ Go ║ 169 ║ 1 ║ ║ Praveen ║ javascript ║ 250 ║ 0 ║ ║ ryan ║ javascript ║ 256 ║ 1 ║ ║ primo ║ ferNANDo ║ 259 ║ 5 ║ ║ anakata ║ Java ║ 259 ║ 1 ║ ║ epoch ║ Java ║ 387 ║ 1 ║ ║ jdstankosky ║ LOLCODE ║ 1397 ║ 15 ║ ╚══════════════════╩════════════╩══════╩════╝
Я не могу выбрать ответ Говарда, так как это была (успешная) попытка изменить правила, но я изменяю их, чтобы сделать их более явными.
27-символьный ответ primo не может быть выбран, потому что он не является псевдослучайным
primo -p ответ, я пойду с «-p будет считаться как 3 байта: один для -, один для p и еще один необходимый пробел».
Спасибо всем, кто ответил, надеюсь, вы хорошо провели время!
ПРИМЕЧАНИЕ. Я буду пытаться редактировать это раз в две недели, корректировать таблицу и менять выбранный ответ, если кто-то превосходит текущий, поэтому, если вы только что пришли сюда, опубликуйте свой ответ, если хотите!
-p
, будут учитываться 3 байта: один для-
, один дляp
другого и еще один необходимый пробел. Тем не менее, многие другие соревнования на CG.SE считают каждый вариант одним байтом. Обычно автору вопроса решать, какую систему соблюдать.Ответы:
APL, 31
x←'rps'
Назначить строку'rps'
вx
(?3)⌷
Выберите случайное целое число 1 ~ 3, выберите этот индексx
⍞,
Добавить пользовательский ввод к выбору машины⎕←
Вывод полученной строкиx⍳
Преобразовать в числовой массив по indexOf вx
-/
Разница двух чисел1+|3
Модуль 3 и плюс 1'TWL'[...]
индексация от'TWL'
Образец
Пользователь выбирает рок, программа выбирает бумагу: Lose
источник
ЛОЛКОД, 1397
Примечание: я подал заявку до того, как заметил, что требование выигрыша было изменено с популярности с гольф-тай-брейком на гольф с популярным тай-брейком.
Там нет строгого синтаксиса, но я уверен, что это приемлемо.
Если бы это было успешно выполнено как
RockPaperScissors.LOL
, вот то, что могли бы быть некоторые возможные случайные результаты:Rock
- Выход:I GUESSED SCIZZORS U WONNED
Paper
- Выход:I GUESSED PAPER NOWAI TIED
Scissors
- Выход:I GUESSED ROCK LOL U LOZED
Tuna
- Выход:WHAT U SAYZ? YOU BURNTED MAH TREAT!
источник
GolfScript
Выше код реализует необходимую функциональность. Кроме того, это гарантирует, что игрок никогда не будет рассержен из-за (кажущейся) несправедливости компьютерной стратегии.
Неуправляемая версия
Как вызвать программу
Ввод (один символ 'r', 'p', 's') должен быть предоставлен в STDIN, возможно, завершается символом новой строки.
Пробный прогон
Пояснение к коду
Для всех, кто не знаком с GolfScript, я добавлю подробное объяснение того, как работает этот код. Код по существу состоит из трех частей.
Заметки
Поскольку это не код-гольф, а конкурс популярности, я не выбрал самую короткую версию. Возможно, в случае ничьей более короткий код выбьет мое решение. Тем не менее, для тех, кто интересуется игрой в гольф, предоставляются следующие возможности:
0
как вывод для ничьей. Таким образом, самой короткой действительной программой является односимвольный код0
.источник
n"d"
, так как в вопросе сказано, что вывод должен быть любым печатным символом, он ничего не говорит об использовании полных слов.Рубин:
6154 символаКак-то объяснил:
Вся задача сводится к вычислению следующих результатов:
Где цифры означают:
Для этого я использовал формулу: machine_choice - human_choice. Это иногда приводит к отрицательному значению, но поскольку он используется только как индекс, а отрицательный индекс считается обратным, будет выбран правильный элемент массива.
Используемые методы (другие, то
Fixnum
очевидные):inspect
сопровождаемый новой строкой к стандартному выводу программы. ”max.to_i.abs == 0
, rand возвращает псевдослучайное число с плавающей запятой в диапазоне от 0,0 до 1,0, включая 0,0 и исключая 1,0».Ungolfed:
Образец прогона:
источник
[(c-o.index($_)+3)%3]
может быть заменено[c.-o.index$_]
на 7 байтов. Кроме того, вы должны добавить два к вашему счету по-nl
крайней мере.c.
совет..-
. Пунктирные операторы имеют гораздо более низкий приоритет, чем их непунктирные аналоги. Например,a/(b+c)
можно заменить наa./b+c
.C # (167 символов)
Моя самая первая попытка игры в гольф.
Golfed
using System;class P{static void Main(string[] i){var m="rspr";var a=m[Environment.TickCount%3];Console.WriteLine(a+" "+(i[0][0]==a?"T":m.Contains(i[0]+a)?"W":"L"));}}
Un-golfed
Образец запуска Приложению требуется один ввод символов в качестве аргумента 1 для приложения, либо
r
,s
либоp
.Все возможные результаты
cmd > app.exe r
дает выводr T
(рок, галстук)cmd > app.exe r
дает выводp L
(бумага, потерянная)cmd > app.exe r
дает выводs W
(ножницы, победа)cmd > app.exe p
дает выводr W
(рок, победа)cmd > app.exe p
дает выводp T
(бумага, галстук)cmd > app.exe p
дает выводs L
(ножницы, потерянные)cmd > app.exe s
дает выводr L
(рок, потерянный)cmd > app.exe s
дает выводp W
(бумага, победа)cmd > app.exe s
дает выходнойs T
(ножницы, галстук)источник
Perl 48 байт
Сценарий печатает результат с точки зрения компьютера, например, если игрок выбирает,
r
а компьютер выбираетs
, результат -Lose
.$%
(номер страницы формата) используется для хранения перемещения компьютера, поскольку он может содержать только целочисленное значение, которое сохраняет преобразование типа int.Ungolfed:
Пример использования:
Сценарий также можно запустить в интерактивном режиме, набрав свой ход, а затем Enter:
Правило растяжения
Perl 35 +3 байта
Требуется
-p
ключ командной строки (считается 3 байта). Каждый из результатовWin
,Lose
иDraw
были отображены наW
,L
,D
. Новая строка между выбором компьютера и результатом была исключена.Пример использования:
Perl 30 +3 байта
Еще раз требует
-p
. ЗдесьWin
,Lose
иDraw
были отображены на2
,1
и0
соответственно. Это все еще технически совместимо, поскольку они являются печатными символами.Пример использования:
Perl 24 +3 байта
Требуется
-p
, WLD сопоставляется с2
,1
,0
как и раньше. Каждый из них^T
должен быть заменен буквальным символом ascii 20. Этот, по общему признанию, немного растянут;$^T
возвращает количество секунд с начала эпохи, когда скрипт был запущен. Все результаты возможны, но это не совсем квалифицируется как псевдослучайный.Пример использования:
источник
APL (
3836)Вывод 'T', 'W' и 'L' для ничьей, победы и поражения.
Образец прогона:
(Пользователь печатает «p» для бумаги. Компьютер выбирает «r» (рок), пользователь выигрывает)
Объяснение:
⌽↑⌽∘'TWL'¨⍳3
: генерирует следующую матрицу:⍞⍳⍨c←'rps'
: установитеc
в строку'rps'
, прочитайте ввод пользователя и получите индекс ввода пользователя в строке (это будет значение от 1 до 3). Этот индекс используется в качестве координаты Y в матрице.i←?3
: получить случайное число от 1 до 3 и сохранить егоi
, это выбор компьютера. Это используется как координата X в матрице.c[i]
: использоватьi
в качестве индексаc
, отображая выбор компьютера как «r», «p» или «s».источник
ferNANDo 1184 байта (259 в гольфе)
Переводчик, написанный на Python, можно найти внизу связанной страницы.
ferNANDo - это эзотерический язык, который поддерживает только один тип переменной - логическое значение и только одну операцию - NAND. Как вы можете себе представить, это может привести к довольно длинной логике для выполнения, казалось бы, простых задач. Он поддерживает чтение из stdin (по одному байту за раз), запись в stdout (также по одному байту за раз), условные циклы, а также случайный логический генератор.
Там нет ключевых слов вообще; все переменное. Функция оператора определяется исключительно количеством переменных, которые в нем содержатся. Там также нет комментариев, поэтому я сделал все возможное, чтобы код сам комментировал. Последние четыре строки могут быть немного запутанным, но это, вероятно , достаточно сказать , что он печатает
Win!
,Lose
или вDraw
зависимости от результата.Сценарий может быть запущен в интерактивном режиме, набрав ваш ход, а затем Enter.
Пример использования (при условии, что вы назвали переводчика
nand.py
):Редактировать: просто чтобы доказать, что ferNANDo может конкурировать с Java, вот «версия для гольфа» с 259 байтами . Логика заметно отличается; он проверяет
not win
иnot tie
, что сохраняет несколько ворот NAND (потому что тогда мне нужны толькоnot
версии ходов игрока, и потому что ониnot lose
не требуются для вывода). Не так интересно читать, хотя.источник
o_shi- o_shi- o_shi-
Это было веселое комментирование.q
, но он делает разумную вещь и перебрасывает.Python 3.x: 74 символа
Как это устроено
Исходя из судьбы, он определяет, какой выбор должен быть основан на формуле
Версия без гольфа
Пробный прогон
источник
Луа, 87
Использование:
Ungolfed:
источник
GolfScript 62
Альтернативное решение GolfScript, гораздо более скучное, чем у Говарда :).
Программа выбирает случайный ход и отображает результат с точки зрения пользователя.
Код
Пробный прогон
Онлайн тест
Вы можете запустить программу и поэкспериментировать с различными входными данными здесь: http://golfscript.apphb.com/?c=OydzJwoKJ3Jzc3BwcicuWzZyYW5kPV0nJys6wqdAKy4uJiwoez8pwqdcJ0xvc2UnJ1dpbidpZn3PxP3P3PF
Обратите внимание, однако, что параметр (перемещение пользователя), который обычно передается в командной строке, теперь добавляется в стек в самом коде (нет способа предоставить «реальные» параметры командной строки в этом онлайн-инструменте).
Версия "Ungolfed"
Я не имею ни малейшего представления о том, что означает ungolfed, когда дело доходит до GolfScript, поэтому я попытался добавить комментарии. Надеюсь, это прояснит работу кода и сделает его более читабельным:
источник
C
9286 символовПечатает выбор компьютера и результат с точки зрения пользователя - W = вы выиграли, L = вы проиграли, T = ничья.
Простая формула
x-y
, учитывая значения ASCII выбора, дает 0 при ничьей (очевидно) и уникальное значение в каждом другом случае.источник
Питон 2 (
86848078), Python 3 - 76 символов0 - ничья, 1 - поражение, 2 - победа
Ungolfed
Как запустить:
python file_name_here.py
Задачи:
компьютер AI: 35 символов
источник
A
хотя, и вы можете сохранить еще один символ сfrom random import*
.from random
, потому что думал, что это не изменится ...Сначала попробуйте без рассмотрения других.
гольф:
10785 байтвывод [выбор NPC] [1: победа, 2: проигрыш, 3: ничья]
ungolfed:
источник
PowerShell:
1441331171119273Гольф-код:
Можно запустить прямо с консоли.
Ungolfed, с комментариями:
Некоторые примеры запускаются на консоли:
источник
JAVA 259 :(
Весьма негольфированный код:
Образцы прогонов:
источник
Befunge: 107 символов
Немного неуклюжий Это сокращается, вопрос в том, насколько.
источник
JavaScript (87)
Golfed:
Ungolfed:
Вы можете просто вставить код в консоль JavaScript вашего браузера, чтобы запустить его.
Если мне разрешено распечатать результат перед печатью компьютера (83) :
источник
К, 67
Печатает W, L, D для победы / поражения / ничьей.
Ungolfed:
Или в Q, который более читабелен:
Пробный прогон:
источник
Javascript, 117 знаков
Вот управляемый данными подход к проблеме. Вероятно, это можно оптимизировать, генерируя данные выигрыша / проигрыша / розыгрыша, а не отображая их вручную, но это только начало :)
Golfed:
Ungolfed:
Наконец, вот скрипка с обоими.
источник
Javascript: 256
golfed:
ungolfed:
источник
Clojure:
Мини-версия (129 кодовых символов):
источник
Ява (387) первый код гольф!
Ungolfed
Гольф (расстояние / отступ)
Не самый короткий код, но моя первая попытка
источник
import java.util.*
2)HashMap l
->Map l
3) приведение к(int)
вместо(Integer)
4)new Random().nextInt(3)
5) пропуститьnew int[][]
6) удалить приведение к(Character)
7) использовать целые числа вместо символов.Go (169)
Гольф:
Ungolfed (в формате
go fmt
):Бег :
источник
Пиф , 23
Вывод в виде:
Tie: 0 Win: 1 Loss: 2
Объяснение:
Запустите следующим образом:
Только для еще 4 символов мы можем использовать T для ничьей, W для победы и L для проигрыша:
Все одинаково до разницы индексов, и в этот момент мы используем разность в качестве индекса в строке
"TWL"
.Примечание. Несмотря на то, что я разработал этот язык после публикации заявки, я не видел ее до сегодняшнего дня. Задача не повлияла ни на один аспект языка.
источник
Groovy, 89
Принимает выбор пользователя в качестве аргумента. Пример:
источник
C # & LinqPad 133
golfed:
ungolfed:
Пример вывода (входные данные были s): r> L // Компьютер выбирает рок (r) -> поэтому мы проиграли
источник
JavaScript (79)
Натыкаясь на старый, но здесь мы идем ...
С дополнительным бонусом вы можете использовать любую понравившуюся вам скалу - пегнатит, пироксенит, скорию, совит, кимберлит, тронджемит, туф или любую другую. Единственным ограничением является то, что вы не можете использовать
p
илиs
;-)Гольф-код:
Основные используемые приемы:
1. u = ~~{}[prompt()]
Использование объекта
{}
и получение значения с помощью пользовательского ввода изprompt()
. Все идет нормально. Тогда вместо того, чтобы иметь его,r : 0
мы можем принудительно преобразовать его0
с помощью~~
оператора NOT. Он часто используется для номеров этажей, но также имеет (преимущество) в том, что не возвращает,NaN
когда другие операторы хотели бы, например:+{a:1, b:2}['c']
.2. c = new Date%3
С датой часто обманывают, например, используя
+new Date
для непосредственного преобразования ее в метку времени, иначе можно получить строковое представление. Здесь, используя мод, можно достичь того же эффекта.3. 'rps'[c]
Индексированный доступ к строке, предоставляющий компьютерам выбор
0 = r
,1 = p
или2 = s
.4. (u==c ? 2 : !u&c>1 | u&!c | u>1&c )
Код ungolfed может быть примерно таким:
источник
Гольфскрипт - 29
Это актуальный ответ на этот раз (глядя на вас
n"Draw"
: P).Ungolfed:
Вы можете запустить его
ruby golfscript.rb MyCode.txt
, гдеMyCode.txt
находится код программы.Пробные прогоны (все с вводом «r», но все работает) (ничья 0, победа 2, проигрыш 1):
Если вам нужно объяснение какой-либо версии и / или вы видите потенциальное улучшение, скажите мне.
источник
Javascript,
657170Без выбора компьютера: 65
Просто чтобы проверить это решение правильно:
С выходом выбора компьютера: 71
70
и тест:
источник