Ваша задача - написать небольшую программу, которая подсчитывает очки руки Skat. В колоде Скат есть карты от 7 до 10, Джек, Королева, Король и Туз (называемые Унтер, Обер, Кениг и Даус). Мы используем немецкие костюмы с желудями, листьями, сердцами и колокольчиками вместо треф, пиков, сердец и бриллиантов. Очки определяются по номеру на карточке:
- 7, 8 и 9 - 0 очков
- Унтер 2 балла
- Обер 3 очка
- Кениг 4 очка
- 10 - это 10 баллов
- Даус 11 очков.
Ввод, вывод
Формат ввода состоит из двух символов, первый представляет значение, а второй обозначает масть:
- 7, 8 и 9 обозначают их сами
- 0 (ноль) означает 10
- Unter, Ober, König и Daus названы в честь их первых букв (U, O и D)
- То же самое для желудей, листьев, сердец и живота (A, L, H и B)
Входные данные представляют собой одну строку карточек, разделенных одним пробелом. Вы можете взять ввод откуда угодно, аргументы командной строки тоже подойдут. Выходом является значение руки, либо распечатанное, либо возвращенное в качестве кода выхода. Вывод вашей программы должен показывать ошибку, если какая-либо карта появляется дважды в руке. (Так что 7A 0L 7A
должен вернуть ошибку вместо 10
). Также можно выйти с кодом завершения 255 вместо того, чтобы показывать ошибку, если это стандартный способ вашей программы для вывода результата.
Примеры
7A 8A 9A UA OA KA 0A DA 7L 8L 9L UL OL KL 0L DL 7H 8H 9H UH OH KH 0H DH 7B 8B 9B UB OB KB 0B DB
дает 1207A 8L 0K DB 8L
выдает ошибкуUA OB DL KH
дает 20
правила
- Код гольф: выигрывает самый короткий код
- Применяются обычные правила игры в гольф
- Программа должна работать на все руки, а не только на примерах
- GIGO: если ввод неверен, вывод может быть произвольным
источник
Ответы:
APL (
5448)Там должно быть коротким путем выбора значения карты, но я не вижу его.
Вы получаете,
DOMAIN ERROR
если есть дубликат карты.Объяснение:
A←⍞~' '
: store (←
) вA
строку пользовательского ввода (⍞
) без (~
) пробелов.2,⍨2÷⍨⍴A
: двухэлементный список, содержащий длину (⍴
),A
разделенную на (÷⍨
) 2, за которой следует (,⍨
) число 2. (Таким образом, если входной сигнал представляетUA OB DL KH
собой список (4, 2)).↓A⍴⍨
: определить matrix (⍴
) с измерениями этого списка, содержащими значения A. Затем соединить элементы его строк вместе (↓
), дав, например, список списков['UA','OB','DL','KH']
.A←
: Сохранить этот список в A.A≡∪A
:∪A
список уникальных элементов в A. Если он равен A, дубликатов нет, и это возвращает 1, иначе 0.÷
: разделить то, что слева (что делает фактический расчет) на результат теста на равенство. Таким образом, если дубликатов нет, результат остается неизменным, а при наличии дубликатов вы получаете оценкуDOMAIN ERROR
из-за деления на ноль.⊃¨A
: Список, в котором указан первый элемент (⊃
) каждого элемента (¨
) в A. Таким образом, это исключает букву масти, оставляя букву партитуры. (UODK
)'D0.....KOU.'⍳
: дает индекс каждой из букв счета в этой строке, возвращает 12 для значений не в строке. (10 9 1 8
)+/12-
: вычтите все это из 12, а затем сложите их вместе. (2 + 3 + 11 + 4 = 20
)источник
Ruby 1.9, 52 символа
Ввод через аргументы командной строки. Я предполагаю, что сообщение об ошибке, когда наличие дублирующих карт не имеет значения, поэтому просто жалуется на ошибку преобразования eval / type.
Пример использования:
источник
Scala,
8782 персонажаВыдает исключение на повторных картах.
источник
Haskell,
122108107 символовисточник
error""
короче чемundefined
. Сохраните один символ, используяinteract
.interact
этого не будет печатать новую строку , поэтому я не уверен, что это приемлемо. Тем не менее, я смог сэкономить гораздо больше, используя неполный шаблон вместоundefined
.GolfScript
545352Изменить 1:
Я только что обнаружил ошибку в коде. Он не обнаружил дубликаты карт, если дубликаты были первыми двумя на входе (потому что я использовал
*
оператор сгиба, а не/
оператор каждого для первого цикла).Теперь я исправил код, а также смог убрать 1 символ в процессе. Вот новая версия:
Входные данные должны быть в стеке в виде строки в указанном формате (пример:)
'7A UA DA'
.Если введенные данные верны, программа напечатает общую стоимость карточек.
Если есть хотя бы одна дублирующаяся карта, программа выдает следующее исключение:
Изменить 2:
Увидев этот пост на мета-сайте , я решил опубликовать описание кода. Это также помогло мне найти и исправить ошибку. Итак, здесь идет:
источник
Python, 114 символов
К сожалению,
index
метод списков в Python вызывает ошибку, если элемент не найден, а не возвращает отрицательное значение, и для импортаdefaultdict
потребуется больше символов, чем будет сохранено.источник
eTeX, 201 символ (не считая двух нерелевантных разрывов строк)
Используется как
etex filename.tex [UA OB DL KH]
. Необходимо поместить аргумент в квадратные скобки: в противном случае eTeX не может определить, что мы достигли конца списка аргументов.РЕДАКТИРОВАТЬ: как разрешено в постановке вопроса, неправильный ввод может вызвать () ошибку. Например,
etex filename.tex [OK]
ужасно падает (потому чтоK
это не правильный цвет).источник
etex -v
? Что за сообщение об ошибке (примерно)? Код должен быть помещен в файл (с именемfilename.tex
или чем-либо еще, оканчивающимся на.tex
) и использовать это имя в командной строкеetex filename.tex [<argument>]
. (извините за перепост того же комментария, я забыл "@FUZxxl
")K
не является допустимым цветом, и замена егоX
в ваших примерах удаляет ошибки (с ошибкой,K
потому что эта буква имеет другое значение, Кинг). Я мог бы сделать ошибку менее ужасной, добавив\string
перед каждым##1
, но это будет стоить еще 12 символов.PowerShell, 79
80Броски »Попытка делить на ноль.«, Если карты появляются дважды.
источник