Соревнование:
Выведите каждое двухбуквенное слово, допустимое в Scrabble, используя как можно меньше байтов. Я создал список текстовых файлов здесь . Смотрите также ниже. Есть 101 слово. Ни одно слово не начинается с C или V. Творческие, даже если неоптимальные, решения приветствуются.
AA
AB
AD
...
ZA
Правила:
- Выводимые слова должны быть как-то разделены.
- Дело не имеет значения, но должно быть последовательным.
- Пробелы и переводы строки разрешены. Другие символы не должны выводиться.
- Программа не должна принимать никаких данных. Внешние ресурсы (словари) не могут быть использованы.
- Нет стандартных лазеек.
Список слов:
AA AB AD AE AG AH AI AL AM AN AR AS AT AW AX AY
BA BE BI BO BY
DE DO
ED EF EH EL EM EN ER ES ET EX
FA FE
GO
HA HE HI HM HO
ID IF IN IS IT
JO
KA KI
LA LI LO
MA ME MI MM MO MU MY
NA NE NO NU
OD OE OF OH OI OM ON OP OR OS OW OX OY
PA PE PI
QI
RE
SH SI SO
TA TI TO
UH UM UN UP US UT
WE WO
XI XU
YA YE YO
ZA
Ответы:
Python 3,
194188 байтПочти точно не самый короткий метод, но я подумал, что это будет хорошим началом. Попробуйте упаковать каждую пару в пути, перекрывая их как можно больше (например,
"ODEX..."
=["OD", "DE", "EX", ...]
). Пробелы используются для разделения путей, и любые пары с пробелом в нем удаляются (конечный пробел не долженE
печататься в конце).Я также попробовал это в регулярных играх в гольф, но это было дольше.
источник
AYAHOYOWOMUNUHAID
!CJam,
9694 байтаВыше это hexdump, который можно изменить с помощью
xxd -r -c 16 -g 1
.Попробуйте онлайн в интерпретаторе CJam .
В зависимости от того, что именно считается разделенным , количество байтов может быть уменьшено до 93 или даже 92 :
Если мы заменим
-55
на59
, слова будут разделены неразрывными пробелами (0xA0).Если мы заменим
-55
наW
, слова будут разделены знаками (0x40).идея
Мы можем закодировать каждую пару букв xy как (ord (x) - 65) × 25 + (ord (y) - 65) . 1
Вместо того, чтобы хранить полученные целые числа, мы будем хранить различия всех пар, которые соответствуют двум смежным словам (отсортированы в алфавитном порядке).
Наибольшая разница составляет 35 , поэтому мы считаем их цифрами от целого целого числа 36 и преобразуем это целое число в строку байтов.
Код
1 Поскольку вторая буква никогда не является буквой Z , достаточно использовать 25 вместо 26 .
источник
PHP
224, 218, 210206Определенно не очень хороший результат, но мне понравился вызов.
Я создаю таблицу параметров, создаю побитовую систему, чтобы указать, какие параметры являются действительными.
Затем я 36-й кодировал эти параметры, чтобы получить строку:
Обратите внимание, что третья запись в этом строковом массиве не имеет значения, поскольку в Си нет опций.
Чтобы напечатать значения, я просто конвертирую действительные параметры в символы.
Я мог бы кое-что сделать, чтобы уменьшить, узнав, что нет слов, оканчивающихся на C, J, K, Q, V или Z, но я не могу придумать способ уменьшить его.
Транспонируя таблицу, вы получаете больше пустых элементов, и данные кодируются немного компактнее, что сбрасывает несколько байтов. Массив теперь печатается в другом порядке:
Спасибо Измаилу за взрыв и зацикленные подсказки.
При обновлении до php5.6
pow(,)
можно заменить,**
сохранив еще 4 байта.источник
","
, вы можете использоватьexplode(0,UB1YB0100CUP[...])
3
я не могу это использовать! Спасибо$e++;for($f=0;$f<26;$f++)
сfor($e++,$f=0;$f<26;$f++)
, и теперь вы можете удалить эти досадные{}
. И если вы хотите преобразовать символы в нижний регистр, используйте$e^' '
.Perl,
167164157 байтНаписал отдельный скрипт, чтобы сгруппировать буквы настолько компактно, насколько это возможно, в строку, содержащую все действительные 2-буквенные слова. Затем он перебирает все двухбуквенные слова и печатает правильные слова, по одному на строку. Беги с
perl -M5.10.1 script.pl
.источник
-M5.10.1
чтобы использоватьsay
ключевое слово, добавленное в эту версию, либо добавитьuse feature 'say';
в тело сценария.C 155 байт
Гольф версия
Выход
Неуправляемая версия
Волшебная строка длиной 51 байт в версии для гольфа содержит много символов, кроме ASCII 126, которые почти наверняка были искажены в эквивалентах Юникода. Версия без заглавных букв использует вместо этого hex и как константу, а не как литерал. Кроме того, версия без заглавных букв разделяет слова новой строкой, что упрощает копирование и вставку в Excel, упорядочивание списка и сравнение с требуемым.
объяснение
Если мы расширим определение гласного, включив в него 8 букв AHMEIOUY, мы заметим, что все слова состоят из одного гласного и еще одной буквы (которая может быть или не быть гласной). Поэтому для всех слов, заканчивающихся на гласный, мы нужна таблица из 26 байтов, по одному на каждую первую букву, с отдельными битами, соответствующими гласной. Нам нужна похожая таблица для слов, начинающихся с гласной, за исключением того, что на этот раз нам нужно только 25 байтов, поскольку в Z нет слова, заканчивающегося на Z. Две таблицы смешиваются вместе, чтобы создать финальную таблицу.
Чтобы избежать любых кодов ASCII в области 0..31, два наименее общих «гласных» M и H назначаются 6-му и 7-му битам, и кодирование учитывает 1 для недопустимого слова и 0 для действительного слова. Поскольку не существует согласного, который сочетается как с M, так и с H, можно гарантировать, что по меньшей мере один из этих битов равен 1.
8-й бит назначен A, который является наиболее распространенным гласным, чтобы попытаться ограничить символы не-ASCII (все же их довольно много).
Используемые таблицы приведены ниже. Для слов, содержащих 2 гласных, я отдавал приоритет первой букве, считающейся «гласной», а второй букве - «буквой». Исключением являются слова, начинающиеся с M, поскольку это позволяет избежать столкновения между MM и HM.
Шестнадцатеричное кодирование слов, начинающихся с гласной
Шестнадцатеричное кодирование слов, заканчивающихся гласным
источник
Java,
484448407391389 байтМоя первая попытка
отформатирован:
Попробуйте онлайн
источник
\n
его пробелом. Их не нужно разделять новыми строками."".format
на это больно смотреть, но весело.Рубин, 166 байт
Заимствование аккуратного метода sp3000 для кодирования слов в компактную строку. Кикером здесь является короткий метод для его декодирования обратно в двухбуквенные слова: использование заглядывания в регулярное выражение, переданное методу сканирования String, для извлечения совпадающих совпадений, а не пробелов:
Рубин, 179 байт
Мой собственный подход: сгенерировать все двухбуквенные слова между
AA
иZA
и выбрать правильные из них, используя битовую маску в кодировке 36:источник
Matlab, 177 байт
Создайте двоичную матрицу, определяющую все разрешенные пары букв, измените ее форму, а base-64 закодируйте ее. Строка в кодировке base-64 (
'CR+ ... % '
) используется в качестве данных в программе. Программа отменяет операции, чтобы распаковать матрицу, а затем считывает разрешенные пары:источник
Мальболже , 2118 байт
Попробуйте онлайн!
источник
Баш, 179 байт
Используется
sed
для замены регулярных выражений. Ввод первого регулярного выражения основан на идее Sp3000, в то время как второй регулярное выражение использует общий ввод без пробелов.Объяснение:
источник
`grep -o ..
вместо этого`sed -r 's/ / &/g'
хитрость из моего ответа ниже.Поскольку все слова состоят из двух символов, мы можем разбить их все вместе, а затем снова разорвать на части, используя простое регулярное выражение.
Любой дружественный к регулярным выражениям язык может сделать это, некоторые более эффективно, чем другие:
Grep (через Bash), 215 байт
Javascript, 224 байта
Perl, 225 байт
Python, 245 байт
Как примечание, некоторые ответы здесь длиннее, чем
echo
я бы назвал базовым:Оболочка POSIX, 307 байт
источник
C -
228217 байт - GCCОбновлюсь, если я смогу уменьшить его, просто скомпилируем с выходами gcc -w, ./a.out отлично. Если есть какой-то интерес к безликой, дайте мне знать.
Я не могу придумать, как сократить его до предела, (технически вы можете удалить кавычки в путах, и вы все равно получите правильный ответ, результат просто выглядит как мусор), поэтому, пожалуйста, дайте мне знать в любом случае, чтобы сократить его
источник
_;main(){char*z="AABDEGHILMNRSTWXY AEIOY EO DFHLMNRSTX AE O AEIMO DFNST O AI AIO AEIMOUY AEOU DEFHIMNPRSWXY AEI I E HIO AIO HMNPST EOU IEO A A ";for(;_++^26;)for(;*++z^32;printf("%c%c ",_+64,*z));}
Я изменил выходной разделитель с новой строки на пробел, но если вы предпочитаете новую строку (один дополнительный байт) измените строку формата printf на"%c%c\n"
C #, 348 байт
Я попробовал:
Ungolfed:
источник
Pyth , 140 байт
Попробуйте онлайн!
Метод сжатия: поскольку
Z
во второй позиции ни одного слова нет, используйте переупорядоченный алфавитbcdfghjklmnpqrstvwxyaeiou
для кодирования действительности каждой из этих букв в качестве второй буквы для каждой первой буквы (первые буквы расположены в алфавитном порядке).Это 25 бит на букву, или ровно 5 цифр Base-32. Поскольку большинство согласных принимают только гласные в качестве второй буквы, я ставлю гласные в конце, чтобы получить в основном однозначные числа для них. Я уверен, что в целом это может быть улучшено путем дальнейшего анализа и переупорядочения алфавита, хотя тогда определение переупорядоченного алфавита займет больше байтов.
объяснение
источник
PHP:
211209204Вы должны отключить предупреждения, в противном случае будет напечатано в отношении неявного создания
$b
Очень весело. Ранние попытки были в диапазоне 250, но это мой самый тонкий пока.
источник
!
на ... если вам это нужно.CJam (99 байт)
Это включает в себя несколько специальных символов, поэтому безопаснее всего использовать hexdump. (В частности, персонаж со значением
0xa0
, соответствующим неразрывному пробелу, доставил мне немало хлопот при настройке онлайн-демонстрации).Демо онлайн .
Подход заключается в разностном кодировании в base-26.
источник
65f+:c
на'Af+
.md
это замечательное улучшение, но я не понял, насколько близок мой ответ к вашему.CJam,
10098 байт(Ссылка)
Это моя первая запись в CJam, так что, вероятно, есть потенциал для игры в гольф. Тем не менее, я нашел способ сжать список символов до 63 байтов, который, надеюсь, кто-то найдет полезным.
Метод сжатия
До сих пор большинство методов, которые я видел, кодировали обе буквы каждого слова. Однако, когда мы помещаем слова в алфавитном порядке, первая буква меняется не очень часто, поэтому кажется явно расточительным ее кодировать.
Я кодирую только последний символ каждого слова и включаю специальный элемент всякий раз, когда первый символ должен увеличиваться. Символы кодируются как первый символ, затем список отличий. Поскольку нет повторяющихся слов, различия должны быть как минимум
1
. Таким образом, я могу использовать0
в качестве разделителя элементов. (Обратите внимание, что тогда я должен сохранить первую букву каждой подпоследовательности как одноиндексную, в противном случае может возникнуть путаница между «опущенным первым символом0
» и «начинаться с A0
».)Поскольку различия в этом случае никогда не превышают 15, мы можем использовать base-16 и упаковывать два (4-битных) элемента в каждый (8-битный) байт. (В реальном коде я преобразовал из base-260 вместо base-256, чтобы избежать проблем с непечатными символами.)
источник
G
иN
, которые нажимают 16 и перевод строки.%-3<
с/;;
или даже/&
. (Второй вариант выдаст сообщение об ошибке. Мета-консенсус в том, что это нормально.)брейкфак , 1371 байт
Вполне пригодный для игры в гольф, но я не приложил слишком много усилий для этого.
Попробуйте онлайн!
источник
Zsh, 175 байт
В этом решении используется строка из 125 символов, где строчные буквы служат разделителями, а первая буква следующей последовательности заглавных букв.
Перебираем буквы
$L
. Если текущая буква$X
в нижнем регистре при сравнении ASCII, установите$W
в$X
. В противном случае, печать$W
соединяется с,$X
чтобы сделать текущее слово.Попробуйте онлайн!
Редактировать: добавлено
:l
для последовательной установки строчных букв, согласно требованиюРедактировать 2: -4 байта, используя
$X
[[..]]
букв
"
переменную, и упрощен, если условие Edit3: -4 байта, удалив кавычки ( )Edit5: -5 байтов, используя преобразование массива, вместо того, чтобы
L
выполнять итерации согласно нижеEdit4: Альтернативный подход для 182 байта , используя обратимые строки в первых 33 буквах,
$L
это всего 107 буквисточник
Stax , 91 байт
Запустите и отладьте его
Единственный изящный прием, который использует этот ответ, - это использование токена «,» для отображения изменения в первой букве, а не для сохранения его для каждого слова.
Спасибо рекурсивному за идею использования оператора m
источник
M
вместо1/
и используйте сокращенную картуm
вместо явного foreach и print{ ... PF
. Этот упаковывает до 89.Python 3, 224 байта
Использует битовые маски переменной длины для кодирования, какие вторые буквы существуют для каждой возможной первой буквы. Битовые маски могут иметь длину 0,1,3,7,15 или 31 бит. Биты сопоставляются с буквами
for d in 'AOIEHMUSTMNDFPYBCGJKLQRVWXZ':
, более ранние биты используются для более распространенных букв, так что в большинстве случаев битовые маски могут быть короткими (обычно 3 или 7 бит, поскольку за большинством согласных следует только один из 5 гласных или YM или H). К сожалению, код для его декодирования сводит на нет экономию по сравнению с более простыми методами (первоначальный список составляет всего 303 байта).источник
Haskell, 192 байта
Для каждого слова, разделенного пробелом в строке, поместите первую букву перед всеми остальными буквами и добавьте пробел, например
SHIO
->SH SI SO
.источник
Java, 334 байта
отформатирован:
Отдельно я закодировал список слов длиной 26x26 = 676 BitSet, преобразовал его в байтовый массив и, наконец, в Base 64. Эта строка жестко запрограммирована в этой программе, и обратная процедура используется для воспроизведения BitSet, и в конечном итоге распечатать список слов
источник
Java, 356 байт
Использует генератор случайных чисел, чтобы получить слова:
Ungolfed:
Вы можете попробовать это здесь: http://ideone.com/Qni32q
источник
Perl, 248 байт
Впервые использую Perl (и впервые играю в гольф), так что определенно есть место для улучшения. Выделены гласные и сгруппированы оставшиеся буквы в зависимости от того, как было создано полученное слово - добавление первого, последнего или обоих гласных первого и последнего гласных создает слово в списке.
источник
"MM "."MY "."BY "."HM "."SH "
можно сократить до"MM MY BY HM SH"
.Javascript (ES6), 214
Возможно, не самый короткий способ сделать это, но определенно интересно.
Перебирает каждую букву в первой строке, добавляя ее к каждой букве в соответствующей строке второй. Это возвращает слова в порядке их последней буквы, например так:
Предложения приветствуются!
источник
Java,
255254 байтаНашел способ выжать еще один байт из него.
Или (хотя и не намного понятнее):
источник
'A'
на65
.Haskell,
333308298 байтПросто для удовольствия!
Оценка
s
напечатает все слова в странном порядке - я использовал тот факт, что большинство комбинаций согласны с гласными или наоборот, возможно, можно оптимизировать еще больше с помощью пользовательских «классов» символов, сокращая кодированную матрицу (здесьw
иk
).Кто-нибудь знает более короткий способ печати строк без кавычек и скобок, чем мой монадический? Классы типа еще длиннее, насколько я могу судить.
Кроме того, может также быть более короткий способ сделать
p
работу ...источник
sequence_
же, какvoid$sequence
? Тогда вы можете опустить такжеimport
.void
должен был быть импортирован. В любом случае, собираюсь помнить это.sequence_$map putStrLn
естьmapM_ putStrLn
. Замените(
,)
вокругconcat$...
другим$
.05AB1E , 143 байта (не конкурирует)
Попробуйте онлайн!
источник
PHP, 170 байт
кратчайший подход, который я мог найти до сих пор ...
сломать
Заметка Самая короткая версия с отображением битов с возможностью печати ascii стоит 190 байтов (113 байтов данных + 77 байтов декодирования) с использованием 6 битов = основание 64, 174 байта (97 данных, 77 декодирование) с использованием 7 битов (основание 128); возможно, еще немного для побега.
База 224 (с использованием ascii 32..255) принимает 87 байтов данных (+ экранирование); но я думаю, что декодирование будет стоить больше, чем 10 байтов.
Исключение C и V из карты позволит сэкономить 16/14/13 байтов в данных, но при декодировании будет стоить дорого.
источник