Ваша задача состоит в том, чтобы определить, имеет ли данная строка надлежащую длину и может ли она быть представлена плитками скрэббла, и, если это так, вывести сумму баллов каждой буквы.
Если вы не знаете, как играть в Scrabble:, у вас есть 100 плиток с напечатанными на них различными буквами A – Z, а также два символа подстановки, которые могут представлять любую букву. Каждая буква имеет определенное количество точек, и каждый тайл (но не обязательно слово) можно использовать только один раз. При воспроизведении слова добавляется сумма очков для каждой используемой плитки, которая становится результатом. Поскольку доступно ограниченное количество букв, слово может иметь только определенную букву столько раз, сколько эта буква имеет плитки + любые неиспользуемые символы подстановки. Доска Scrabble имеет размер 15 × 15 ячеек, поэтому длина слова должна быть от 2 до 15 символов.
Список количества и оценки каждой буквы в английской версии см. Ниже или http://boardgames.about.com/od/scrabble/a/tile_distribute.htm ( архив ).
Буква Кол-во очков Буква Кол-во очков ------------------- ------------------- A 9 1 O 8 1 B 2 3 P 2 3 C 2 3 Q 1 10 D 4 2 R 6 1 E 12 1 S 4 1 F 2 4 T 6 1 G 3 2 U 4 1 H 2 4 V 2 4 Я 9 1 W 2 4 J 1 8 X 1 8 K 1 5 Y 2 4 L 4 1 Z 1 10 M 2 3 [дикий] 2 0 N 6 1
Дальнейшие правила
- Программа должна принимать одну строку ввода из STDIN или тому подобного.
- Ввод всегда будет содержать только заглавные буквы.
- Если строка содержит больше копий буквы, чем неиспользуемых подстановочных знаков или фрагментов для этой буквы ИЛИ длина строки не должна быть между 2 и 15 включительно, программа должна вывести
Invalid
. - В противном случае, оценка должна быть добавлена с использованием данных из диаграммы выше и вывода.
- Не используйте подстановочные знаки без необходимости.
- Не беспокойтесь о бонусах, таких как оценка двойного слова или о том, является ли строка реальным словом.
- Программа должна выводить результат через STDOUT или тому подобное.
- Лазейки, которые по умолчанию запрещены , не допускаются.
- Использование внешнего источника, такого как веб-сайт, а также любых библиотек, API-интерфейсов, функций и т. П., Которые рассчитывают баллы Scrabble или правильные количества, недопустимы.
- Это код-гольф , поэтому побеждает меньше байтов.
Прохождение
Input: CODEGOLF
C -> 3, O -> 1, D -> 2, E -> 1, G -> 2, O -> 1, L -> 1, F -> 4
3 + 1 + 2 + 1 + 2 + 1 + 1 + 4 = 15
Output: 15
Testcases
Ввод, вывод ------------------------ СКРАБЛ 14 JAZZ 19 STACKEXCHANGE 32 XYWFHQYVZVJKHFW 81 PIZZAZZ Invalid KIXOKEJAJAX Неверно Неверное недопустимое
источник
-1
,?Invalid
.Ответы:
Perl 5
228 205 186 184 178 177 153 150 149 142 137135Запустите с Perl -E.
Golfed:
В этом решении используются некоторые непечатаемые символы, поэтому ниже предоставлен hexdump:
В качестве альтернативы, используя Ctrl + Key:
Ungolfed + прокомментировал:
источник
-M5.010
(штраф 0, потому что он указывает версию языка для использования), а не-e
(штраф 1)? Вы можете сохранить байт в аргументах.С, Rev 2,
151 145138Вдохновленный 159-байтовым кодом в комментарии @ bebe, я выдавил еще
8 1421 символов:4 байта сохраняются путем перестановки счетчика длины
i
. Инициализируется значением 1 (при условии, что программа не принимает аргументов), а затем умножается на 4 каждый раз, когда читается письмо. Он сбрасывается в ноль, когда длина слова больше 15, поэтому, чтобы проверить, является ли длина слова плохой, мы просто проверяем, еслиi<5
(я поставилi<9
так, что он будет по-прежнему давать недействительные для однобуквенных слов, если пользователь случайно установитi
значение 2, поставив один аргумент в командной строке.)4 байта сохраняются путем изменения теста условия цикла на простой
&31
. Для этого необходимо, чтобы слово заканчивалось пробелом (ASCII 32) или нулевым символом (ASCII 0.) Обычно ввод с клавиатуры завершается новой строкой (ASCII 10), поэтому использование программы немного неудобно, потому что вы должны набрать затем нажмите клавишу возврата, чтобы компьютер прочитал буфер. Для строк, заканчивающихся символом новой строки, я мог бы соответствовать, но не бить так, как это делает bebe.613 байтов, сохраненных путем изменения кодировки на - (количество плиток каждой буквы) - (оценка для этой буквы-1) * 13 . Теперь для этого требуется диапазон от -4 для L, S, U до -118 для Q, Z. Причина использования отрицательных чисел состоит в том, чтобы избежать непечатаемого диапазона ASCII от 0 до 31. Вместо этого используемый диапазон является дополнением двух отрицательных чисел от 256-4 = 252 до 256-118 = 138. Это печатные, расширенные символы ASCII. Есть проблемы с копированием и вставкой их в Unicode (способ упрощения обратно в ASCII зависит от установленной кодовой страницы, что может привести к непредсказуемым результатам), поэтому я включил правильные коды ASCII в комментарий к программе.Преимущество этого кодирования заключается в исключении переменной, так
r
как количество плиток всегда уменьшается на 1 (мы сохраняем это как отрицательное числоt[x]++
. Кроме того, оператор postfix означает, что мы можем выполнить это приращение одновременно с добавив счет кs
.C,
184Rev 1 173 (или 172 с опцией компилятора)Я использую GCC, и с опцией компилятора
-std=c99
это позволит мне перейтиchar t[]="...."
к инициализацииfor
цикла для сохранения одной дополнительной точки с запятой. Для удобства чтения я показал программу без этих изменений и с оставленными пробелами.Хитрость в данных. Для каждой буквы в таблице хранится ASCII-код формы (общая оценка плиток для этой буквы) * 10 + (оценка одной плитки-1)
t[]
. Во время выполнения эти общие баллы уменьшаются по мере использования плиток.Общая оценка всех плиток для каждой буквы варьируется от 12 для E до 4 для L, S, U. Эта форма кодирования позволяет использовать только печатные символы ASCII (от ASCII 120,
x
для E до ASCII 40,(
для L, S, U). Для использования числа плиток потребуется диапазон от 120 до 10, поэтому я избежать этого.Благодаря
#define
макро, один символT
используется в основной программе , чтобы получить индекс письмаi
от первого аргумента командной строки, вычтите ASCIIA
= 65 от него , чтобы дать индекс, и искать его в таблице T:t[x[1][i]-65]
.for
Цикл используется больше какwhile
петли: концы петли , когда нулевой байт (строка терминатор) встречается во входной строке.Если плитки этой буквы не исчерпаны (
T/10
отличны от нуля)s
, увеличивается на счет плитки,T%10+1
чтобы сохранить общий счет. В то же самое время счет тайла сохраняется вr
, так что значение в состоянии, представленном как,T
может быть уменьшено на,r*10
чтобы указать, что один тайл был использован. Если плитки исчерпаны, счетчик подстановочных знаков / пробеловb
увеличивается.printf
Утверждение справедливо требует пояснений. если длина слова выходит за границы или число пробелов слишком велико, выведите на печать, вInvalid
противном случае напечатайте счетs
.источник
?
и:
. Ваш другой пункт заменен, так как я полностью изменил кодировку, поэтому нет необходимости в какой-либо специальной обработке Q и Z. Теперь до 173/172 с вашей помощью.getchar()
159:l,w,f;main(t,i){for(char b[]="Z>>QxS=SZW6(><P>m<(<(SSWSm";(i=getchar()-65)>=0;l++)b[i]/10?f+=t=b[i]%10+1,b[i]-=t*10:w++;printf(l<2|l>15|w>2?"Invalid":"%d",f);}
хотя я до сих пор не понимаю, почемуchar*foo=<string>
падает. это может сэкономить 2 символа.char*foo="string"
является строковым литералом, и его содержимое не может быть изменено. С другой стороны,char foo[]="string"
создает массив символов, инициализированный дляstring\0
, который затем может быть изменен.getchar().
я использовал ваши улучшения в коде (с именами моих переменных для согласованности с остальной частью моего ответа), плюс улучшение проверки правильности длины слова, и нахальное улучшение условия цикла тест (я пытался сократить ваши , но не мог сделать это с той же функциональностью.) Я также попыталсяgetche()
и ,getch()
но мой компилятор (GCC на Cygwin) не будет связывать их автоматически.JavaScript (ES6) -
241230199182Изменить - изменил способ, которым я кодировал количества / баллы, чтобы уменьшить размер и удалить не-переменные переменные
Редактировать 2 - изменил количество / счет кодировки на целые числа вместо строк
Редактировать 3 - переключено на
%13
(спасибо @ edc65), инвертировало кодировку, изменило значения напрямую и несколько других незначительных улучшенийПротестировано в консоли Firefox.
источник
f[c]=1+f[c]||1
->f[c]=-~f[c]
, 2. Почему не использовать% 13%13
это гениальный ход Я застрял, думая, что должен хранить вещи в цифрах, но математика не заботится о разнице между base10 и base13.SyntaxError: Unexpected token >
)f=s=>{...}
обозначений).Python 3,
217201Ungolfed:
Редактировать: Спасибо @BeetDemGuise за подсказку, которая в конечном итоге привела меня к гораздо большему, чем сокращение на 1 символ! Оригинальный код ниже:
источник
int('1332142418513113a11114484a'[o],16)
:)BEFUNGE 93 - 210 байт.
Но он не проверяет 15-буквенное ограничение.
источник
С, 197
Предполагается, что строка указана в качестве аргумента командной строки, например
./scrabble STACKEXCHANGE
источник
JavaScript -
232201z
хранит слово. Выходы как оповещение.Изменить: улучшено в соответствии с рекомендациями ниже.
источник
s
используется только один раз, поэтому вам вообще не нужно делать его переменной; Вы можете удалить эту декларацию и заменитьr+=s[x]
наr+=-~"02210313074020029000033739"[x]
. Кроме того, вам не нужны круглые скобки(w>2|y<2|y>15)
в предупреждении.Хаскелл - 538
Сохраните его как scrabble.hs, а затем скомпилируйте его, используя
Затем введите слово в качестве ввода и нажмите Enter
источник
"ABCDEFG"
можно записать как['A'..'G']
,[1,2,3]
можно записать как[1..3]
Python 2.7 - 263
Я не мог приблизиться к ответу DLosc , но это рассматривает каждую букву как «мешок», из которого вы тянете, пока он не опустеет, затем вы потянете пробелы, а когда он опустеет, произойдет ошибка.
источник
raw_input
если это Python2 (одна вещь, которая мне нравится в Python3). Ввод гарантируется в верхнем регистре, поэтому удалите.lower()
и измените97+i
на65+i
. Ввод менее 2 символов также должен быть недействительным. Вы можете поднять ошибку деления на ноль безif
заявления: разделите ваш общий счет на(1<len(S)<16)
. Пара других твиков, таких как размещениеprint
s в той же строке, что и заголовки блоков, и удаление пробела до"Invalid"
этого, по моим подсчетам, до 250. :)Хаскелл,
290283Насколько я мог сделать это сейчас:
Этот код очень строго соблюдает правила, поэтому убедитесь, что вы не передаете ему лишние символы (например, конец строки). Используйте как это:
echo -n "JAZZ" | runghc scrabble.hs
.объяснение
Шаблон
(_:_:_)
гарантирует, что рассматриваются только строки, состоящие как минимум из двух символов, а все остальное приводит к"Invalid"
(шаблон отката_
). Таблица фрагментов закодирована как11*nTiles+value
преобразованная в ASCII со смещением, которое позволяет искать по модулю 11, где буквыAEIO
дублируются, потому что они встречаются более 6 раз каждая. Затем создается пул плитокreplicate
, из которого удаляются символы в слове по мере их появления (разница в списке,\\
). Пул содержит 98 фрагментов, поэтому, если общая длина слова и оставшаяся часть пула больше 100, мы использовали слишком много подстановочных знаков. Кроме того, слово минус первые 15 букв добавляется три раза к вычислению длины, поэтому любое слово длиной более 15 букв автоматически использует три символа подстановки и, следовательно, является недействительным. Подсчет очков производится по оставшемуся пулу, который изначально имел 187 баллов, из которых мы просто вычитаем. Обратите внимание , чтоf 61
вместо тогоf 65
, 65 является ASCII числа'A'
, из - дубликата"AEIO"
в начале бассейна. Остальное просто шаблон.источник
Python3 - 197
Давайте используем bignums: D (в настоящее время он не обрабатывает символы подстановки, я пропустил чтение этого правила полностью, черт возьми)
источник
Рубин - 195
Я предполагаю, что вывод в
"Invalid"
порядке, в противном случае мне нужно было бы сделать$><<(-b<1&&w.size<16?s:'Invalid')
что бы увеличить его до 198Clojure - 325
Я давно не делал clojure, так что я уверен, что есть несколько способов улучшить мое решение .ie списки qty и pts
Кое-что раскошелилось
источник
ES6: 184 (не строгое)
w
Предполагается, что уже содержит слово.r
является выходной строкой.Вот это объяснил и немного меньше в гольф:
источник
Дротик - 201
Это требует bignums, поэтому он не будет компилироваться в JavaScript.
С большим количеством пробелов:
источник
PHP,
180170168 байтУра! бить JS!
сломать
Я так рад, что нет буквы больше 10 баллов.
источник