Распечатать все 2 буквы слова Эрудит

40

Соревнование:

Выведите каждое двухбуквенное слово, допустимое в 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
qwr
источник
8
Должны ли слова быть выведены в том же порядке?
Sp3000
2
@ Sp3000 Я скажу нет, если что-нибудь интересное можно придумать
qwr
2
Пожалуйста, уточните, что именно считается как- то разделенным . Это должен быть пробел? Если так, будут ли разрешены неразрывные пробелы?
Деннис
5
Хорошо, нашел перевод
Мики Маус
3
Ви не слово? Новости для меня ...
Jmoreno

Ответы:

39

Python 3, 194 188 байт

s="BI ODEXIF BAAX ASOHER LOXUMOPAGOR KI US AMY BOITONOSI MMEMINANEHI UPI AYAHOYOWOMUNUHAID PEFARED QIS BEN JOFETAE KAT ABYESHMALI UTI ZADOELAWE "
while s:" "in s[:2]or print(s[:2]);s=s[1:]

Почти точно не самый короткий метод, но я подумал, что это будет хорошим началом. Попробуйте упаковать каждую пару в пути, перекрывая их как можно больше (например, "ODEX..."= ["OD", "DE", "EX", ...]). Пробелы используются для разделения путей, и любые пары с пробелом в нем удаляются (конечный пробел не должен Eпечататься в конце).

Я также попробовал это в регулярных играх в гольф, но это было дольше.

Sp3000
источник
1
+1 хороший подход! Я одолжил твою строку для ответа Ruby
Даниеро
Я также сделал ответ, основываясь на вашей идее, используя bash и regex
sergioFC
2
+1 за AYAHOYOWOMUNUHAID!
Уровень Река St
28

CJam, 96 94 байта

0000000: 31 30 31 2c 22 5a 0a d0 fd 64 f6 07 a3 81 30 f2  101,"Z...d....0.
0000010: c2 a5 60 0c 59 0f 14 3c 01 dd d1 69 7d 66 47 6e  ..`.Y..<...i}fGn
0000020: db 54 e5 8f 85 97 de b9 79 11 35 34 21 cb 26 c3  .T......y.54!.&.
0000030: f0 36 41 2b b4 51 fb 98 48 fc cb 52 75 1f 1d b1  .6A+.Q..H..Ru...
0000040: 6b c3 0c d9 0f 22 32 36 30 62 33 36 62 66 7b 3c  k...."260b36bf{<
0000050: 31 62 32 35 6d 64 2d 35 35 7d 27 41 66 2b        1b25md-55}'Af+

Выше это 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 и преобразуем это целое число в строку байтов.

Код

101,   e# Push [0 ... 100].
"…"    e# Push the string that encodes the differences/increments.
260b   e# Convert from base 260 to integer.
36b    e# Convert from integer to base 36 (array).
f{     e# For each I in [0 ... 100]:
       e#   Push the base 36 array.
  <    e#   Keep it's first I elements.
  1b   e#   Compute their sum.
  25md e#   Push quotient and residue of the sum's division by 25.
  -55  e#   Push -55 = '\n' - 'A'.
}      e#
'Af+   e# Add 'A' to all resulting integers. This casts to Character.

1 Поскольку вторая буква никогда не является буквой Z , достаточно использовать 25 вместо 26 .

Деннис
источник
14

PHP 224, 218, 210 206

foreach(explode(",","I19SR,9ZY8H,,CNK,5JRU0,H,CN4,G0H,H160,CN4,75,CU9,AMIHD,MTQP,HQOXK,7L,74,G,CXS,CU9,HTOG,,CNK,MHA8,CNL,1")as$a){$b++;for($c=0;$c<26;$c++)echo base_convert($a,36,10)&pow(2,$c)?chr(96+$b).chr(97+$c)." ":"";}
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 

Определенно не очень хороший результат, но мне понравился вызов.

Я создаю таблицу параметров, создаю побитовую систему, чтобы указать, какие параметры являются действительными.

введите описание изображения здесь

Затем я 36-й кодировал эти параметры, чтобы получить строку:

"I19SR,9ZY8H,,CNK,5JRU0,H,CN4,G0H,H160,CN4,75,CU9,AMIHD,MTQP,HQOXK,7L,74,G,CXS,CU9,HTOG,,CNK,MHA8,CNL,1"

Обратите внимание, что третья запись в этом строковом массиве не имеет значения, поскольку в Си нет опций.

Чтобы напечатать значения, я просто конвертирую действительные параметры в символы.

Я мог бы кое-что сделать, чтобы уменьшить, узнав, что нет слов, оканчивающихся на C, J, K, Q, V или Z, но я не могу придумать способ уменьшить его.


Транспонируя таблицу, вы получаете больше пустых элементов, и данные кодируются немного компактнее, что сбрасывает несколько байтов. Массив теперь печатается в другом порядке:

foreach(explode(",","UB1YB,1,,CUP,CLMEJ,CUO,1,SG0H,5J9MR,,,H,MX01,MTXT,CYO5M,MTQ8,,CNL,MTXT,MHAP,50268,,CN5,CNL,FSZ,,")as$a){$b++;for($c=0;$c<26;$c++)echo base_convert($a,36,10)&pow(2,$c)?chr(97+$c).chr(96+$b)." ":"";} 

aa ba fa ha ka la ma na pa ta ya za ab ad ed id od ae be de fe he me ne oe pe re we ye ef if of ag ah eh oh sh uh ai bi hi ki li mi oi pi qi si ti xi al el am em hm mm om um an en in on un bo do go ho jo lo mo no so to wo yo op up ar er or as es is os us at et it ut mu nu xu aw ow ax ex ox ay by my oy

Спасибо Измаилу за взрыв и зацикленные подсказки.

foreach(explode(3,UB1YB3133CUP3CLMEJ3CUO313SG0H35J9MR333H3MX013MTXT3CYO5M3MTQ833CNL3MTXT3MHAP35026833CN53CNL3FSZ)as$d)for($e++,$f=0;$f<26;$f++)echo base_convert($d,36,10)&pow(2,$f)?chr(97+$f).chr(96+$e)." ":"";

При обновлении до php5.6 pow(,)можно заменить, **сохранив еще 4 байта.

foreach(explode(3,UB1YB3133CUP3CLMEJ3CUO313SG0H35J9MR333H3MX013MTXT3CYO5M3MTQ833CNL3MTXT3MHAP35026833CN53CNL3FSZ)as$d)for($e++,$f=0;$f<26;$f++)echo base_convert($d,36,10)&2**$f?chr(97+$f).chr(96+$e)." ":"";
Джеймс Вебстер
источник
Вместо того, чтобы взорваться ",", вы можете использоватьexplode(0,UB1YB0100CUP[...])
Исмаэль Мигель
Разве это не сломается, поскольку в кодировке есть нули?
Джеймс Вебстер
Однако ... 3я не могу это использовать! Спасибо
Джеймс Вебстер
Кроме того , вы можете заменить $e++;for($f=0;$f<26;$f++)с for($e++,$f=0;$f<26;$f++), и теперь вы можете удалить эти досадные {}. И если вы хотите преобразовать символы в нижний регистр, используйте $e^' '.
Исмаэль Мигель
Хороший улов! Я бы не получил это.
Джеймс Вебстер
8

Perl, 167 164 157 байт

"AMAEDOXUHALAXISHENUNUPABEFAHIDEMYESOHOSITAAGOYAYAWOWETOINODOREX KIFEHMMER BYONELI BOEMUS PELOMI UMOFAD BATAR KANAS JOPI UTI ZAI BI QI"=~/$_/&&say for AA..ZZ

Написал отдельный скрипт, чтобы сгруппировать буквы настолько компактно, насколько это возможно, в строку, содержащую все действительные 2-буквенные слова. Затем он перебирает все двухбуквенные слова и печатает правильные слова, по одному на строку. Беги с perl -M5.10.1 script.pl.

AKHolland
источник
Я не могу заставить это работать в онлайн-компиляторе.
mbomb007
@ mbomb007 В зависимости от версии вам потребуется либо флаг командной строки, -M5.10.1чтобы использовать sayключевое слово, добавленное в эту версию, либо добавить use feature 'say';в тело сценария.
AKHolland
7

C 155 байт

Гольф версия

i,v;main(){for(;++i-408;" >b  Ùc :oÒ¹ i ;¹ w so@)ia ¥g¨¸ ´k¦ase    Ù{§k {"[i/8]>>i%8&1||printf("%c%c%c ",i/8%2*v,i/16+65,!(i/8%2)*v))v="YUOIEMHA"[i%8];}

Выход

YA HA AA BY BO BI BE BA AB DO DE OD ID ED AD YE OE HE AE FE FA OF IF EF GO AG UH OH EH AH OI HI AI JO KI KA LO LI LA EL AL MY MU MO MI ME MM MA UM OM EM HM AM NU NO NE NA UN ON IN EN AN YO HO PI PE PA UP OP QI RE OR ER AR SO SI SH US OS IS ES AS TO TI TA UT IT ET AT WO WE OW AW XU XI OX EX AX OY AY ZA

Неуправляемая версия

Волшебная строка длиной 51 байт в версии для гольфа содержит много символов, кроме ASCII 126, которые почти наверняка были искажены в эквивалентах Юникода. Версия без заглавных букв использует вместо этого hex и как константу, а не как литерал. Кроме того, версия без заглавных букв разделяет слова новой строкой, что упрощает копирование и вставку в Excel, упорядочивание списка и сравнение с требуемым.

char a[]=
{0xFF,0x3E ,0x62,0x7F ,0xFF,0xFF ,0xEB,0x63 ,0xFF,0x3A ,0x6F,0xE3 ,0xFB,0x7F ,0xFF,0x69 ,0xFF,0x3B
,0xFB,0xFF ,0x77,0xFF ,0x73,0x6F ,0x40,0x29 ,0x69,0x61 ,0xFF,0xBE ,0x67,0xF9 ,0xF7,0xFF ,0xEF,0x6B
,0xB3,0x61 ,0x73,0x65 ,0xFF,0xFF ,0xFF,0xFF ,0xEB,0x7B ,0xF5,0x6B ,0xFF,0x7B ,0x7F};

//iterate through i = 16*letter + 8*order + vowel
i,v;main(){for(;i++-408;a[i/8]>>i%8&1||printf("%c%c%c\n",i/8%2*v,i/16+65,!(i/8%2)*v))v="YUOIEMHA"[i%8];}

объяснение

Если мы расширим определение гласного, включив в него 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.

Шестнадцатеричное кодирование слов, начинающихся с гласной

3E 7F FF 63 3A E3 7F 69 3B FF FF 6F 29 61 BE F9 FF 6B 61 65 FF FF 7B 6B 7B

AA AB    AD AE    AG AH AI       AL AM AN          AR AS AT       AW AX AY 
HA          HE          HI          HM    HO 

         ED    EF    EH          EL EM EN          ER ES ET          EX 
         ID    IF                      IN             IS IT 
         OD OE OF    OH OI          OM ON     OP   OR OS          OW OX OY 
                     UH             UM UN     UP       US UT 
YA          YE                            YO 

Шестнадцатеричное кодирование слов, заканчивающихся гласным

 A  H  M  E  I  O  U  Y
                         FF
BA       BE BI BO    BY  62
                         FF 
         DE    DO        EB
                         FF
FA       FE              6F
               GO        FB
                         FF
                         FF
               JO        FB
KA          KI           77
LA          LI LO        73
MA    MM ME MI MO MU MY  40
NA       NE    NO NU     69
                         FF
PA       PE PI           67
            QI           F7
         RE              EF
    SH      SI  SO       B3
TA          TI  TO       73
                         FF
                         FF
         WE     WO       EB
            XI     XU    F5
                         FF
ZA                       7F
Уровень реки St
источник
Возможно, сделайте шестнадцатеричную версию для игры в гольф, чтобы можно было легко
исправить
7

Java, 484 448 407 391 389 байт

Моя первая попытка

public static void main(String[]a){int[]x={57569742,35784706,0,2099200,5534148,35651584,2048,35792896,5247168,2048,33685504,33687552,35794978,35653664,7746958,35782656,131072,2097152,395264,33687552,551296,0,2099200,131104,35653632,33554432};for(Integer i=0;i<26;i++){for(int z=0;z<26;z++){if("".format("%26s",i.toString(x[i],2)).charAt(z)=='1'){System.out.format("%c%c ",'A'+i,'A'+z);}}}}

отформатирован:

public static void main(String[] a) {
    int[] x = { 57569742, 35784706, 0, 2099200, 5534148, 35651584, 2048, 35792896, 5247168, 2048, 33685504, 33687552, 35794978, 35653664,
            7746958, 35782656, 131072, 2097152, 395264, 33687552, 551296, 0, 2099200, 131104, 35653632, 33554432 };
    for (Integer i = 0; i < 26; i++) {
        for (int z = 0; z < 26; z++) {
            if ("".format("%26s", i.toString(x[i], 2)).charAt(z) == '1') {
                System.out.format("%c%c ", 'A' + i, 'A' + z);
            }
        }
    }
}

Попробуйте онлайн

griFlo
источник
Хорошая работа! Некоторые предложения: java.lang.Exception можно назвать просто Exception. «args» может быть просто «a». String.format () может быть "" .format (). Также есть небольшое дополнительное расстояние в объявлении main (). Хороший подход в целом, хотя +1 от меня :)
Jrich
Я только что играл с заявлением о печати, но вы меня опередили! Вы можете сохранить другой байт, заменив \nего пробелом. Их не нужно разделять новыми строками.
Джеймс Вебстер
Вы также пропустили несколько пробелов, которые вы можете удалить.
Джеймс Вебстер
@JamesWebster спасибо за подсказки.
GriFlo
4
"".formatна это больно смотреть, но весело.
код
6

Рубин, 166 байт

Заимствование аккуратного метода sp3000 для кодирования слов в компактную строку. Кикером здесь является короткий метод для его декодирования обратно в двухбуквенные слова: использование заглядывания в регулярное выражение, переданное методу сканирования String, для извлечения совпадающих совпадений, а не пробелов:

puts "BI ODEXIF BAAX ASOHER LOXUMOPAGOR KI US AMY BOITONOSI MMEMINANEHI UPI AYAHOYOWOMUNUHAID PEFARED QIS BEN JOFETAE KAT ABYESHMALI UTI ZADOELAWE".scan /(?=(\w\w))/

Рубин, 179 байт

Мой собственный подход: сгенерировать все двухбуквенные слова между AAи ZAи выбрать правильные из них, используя битовую маску в кодировке 36:

i=-1
puts ("AA".."ZA").select{|w|"djmsjr5pfw2omzrfgydo01w2cykswsrjaiwj9f2moklc7okcn4u2uxyjenr7o3ub90fk7ipdq16dyttg8qdxajdthd6i0dk8zlmn5cmdkczrg0xxk6lzie1i45mod7".to_i(36)[i+=1]>0}
daniero
источник
6

Matlab, 177 байт

Создайте двоичную матрицу, определяющую все разрешенные пары букв, измените ее форму, а base-64 закодируйте ее. Строка в кодировке base-64 ( 'CR+ ... % ') используется в качестве данных в программе. Программа отменяет операции, чтобы распаковать матрицу, а затем считывает разрешенные пары:

x=de2bi('CR+"''        1$$ L*\"%$!! !   $!04P@<W(        0$   1"%$$100@RZP4  $$    0$ ! 1$$$$1 0  P (    $ 0 0$ ! # %  '-32)';[i,j]=find(reshape(x(1:650),26,[])');char([j i]+64)
Луис Мендо
источник
2
Хороший Луис! Игра в гольф на самом деле довольно забавная ... = P
Стьюи Гриффин
1
Ницца! Там нет алфавита!
Brain Guider
1
снимаю шляпу Это самый загадочный код Matlab, который я когда-либо видел ...
Hoki
Спасибо, парни! Это только загадочно из-за кодировки base-64. Эта строка фактически упаковывает двоичную матрицу разрешенных пар букв 26x25
Луис Мендо,
6

Мальболже , 2118 байт

D'``_#>nI||38h6/vdtO*)_^mI7)"XWfB#z@Q=`<)\xwvuWm32ponmfN+ibJfe^$\[`Y}@VUySXQPUNSLpJINMLEiC+G@EDCB;_?>=}|492765.R210p(-,+*#G'&feB"baw=u]sxq7Xnsrkjoh.fNdchgf_%]\a`Y^W{>=YXWPOsSRQ3OHMLKJIBfF('C<`#"8=<;:3W1w5.R2+q/('&J$)"'~D$#"baw=utsxq7Xnsrkjoh.fNdchgf_%c\D`_X|\>=YXWPOsSRQ3OHMLKJIBfFEDC%$@9]=6|:32V6/.3210)M-m+$)"'&%|Bcb~w|u;yxwvuWm3kpinmfe+ihgfH%cb[ZY}]?UZYRWVOs65KPIHGkKJIH*)?c&BA@?8\6|:32V6/.3210)M-,lk)"F&feBzbxw=uzyrwpon4Ukpi/mfkdc)g`ed]#DZ_^]VzZ<;QPt7MLQPOHlFEJIHAe(>C<;_?>765:981Uv.32+*)Mnm%$)(!Efe{zy?}|{zyxqpo5mrkpoh.fNdihg`ed]#DZ_^]Vz=YRQuUTMqQ32NMLEDhHG@(>C<;_?>76;:3W76v43,+O/.nm+*)"Fgf${z@a}v{zyr8vo5Vrqj0nmfN+Lhg`_%cbDCY}@VUySRWPt76Lp3ONMLEDhHG@(>C<;_"8\6|:32V0v.Rs10/.'&+$H('&feB"!x>|^]srwvun4Ukpi/gfe+Lbaf_%cE[`Y}@?[TxRWPUNMLKo2NGFjD,BAeED&<A:^>=6|:32V6v.R21*/(L,+*#"!E}|{z@xw|{t:[qpotsrk1Rhmlkd*Kgfe^$bDZ_^]VzZ<;QuUTMqKJOHGkEJCBA@dD=<;:^>=6|:32V654t,+O).',+*#G'&feBzbx>|^]yr8vXnsrkjoh.fkdcbg`&^Fba`Y^WVzZ<XWPUTMqQ3INMFjD,BAe?>=B;_9>7<54X8765u-Q10)o'&J$)"!~%${A!x}v<]\xwpun4rTpoh.leMchgf_d]#DZ_^]VzZYR:Pt7SLKPOHlFEJIHAeED&<`@"87<5Y98165.3,P*/(-&+$H(!~}C#c!x}|u;\[wvun4lTjih.fN+Lbgfe^c\"CY}@VUyYXWPOsSRKJIHlLE-IBAeE'&<`@"87<5Y98165.3,Pq/.-,+*#G'&fe#"!x>|{zyr8Yotml2ponPlkdcb(fH%]\[`Y^W{zZ<XWPUTMq4JIHMLEi,BA@d>=B;:9]7};:3W7wv.3,+O)o'&J*)('g%${Ay~}v{zyrq7otmrqpoh.fejiha'eG]\[ZY}@VUy<;WVOsSRQPImM/KJIBAe(>=aA:^>=6|:32V65u-Qr0/.'K+$j"'~De#zy~wv<]yrqpo5srkjohg-kdib(feG]b[Z~^]\UTYRvP8TSRKJIHlLKD,BAe?>=B;_?>7<;:981U54t,+O)o'&Jkj('&}C#"bx>_{tyr8vuWVl2pihgle+ihgfH%cEDZ~XWVUy<XWPUTMqQP2NGLEiCBGF?>b%A@?87[;:zy1U54t210/.'K+$j"'~De#zy~wv<zyxwp6Wmlqpohg-kdib(feG]ba`Y^W{>=YXWPOs65KJIHl/KJIBA@dDCB;:9]=<;:zy1Uvu3,P0)o'&J$#(!~D|#"y?}v{zyr8vXnml2ponPledc)gfH%c\D`_^]VzZ<;QVOTSLpPIHGkKJCBG@dD=<;:^>=6|:32Vw543,+*N.nm+*)"F&feB"y~}|{ts9qvonsl2ponmfN+Lha`e^$\[Z_X|\UTYRQVOsM5KJOHGFjD,BA@d>=B;:9]=};4X81w5.R210)o'&J$j"'~%|{"y?w_u;y[wpun4Ukponmfe+Lha'eGc\[!B^WV[TxXQ9ONrRQ32NMLEDh+AeE'&<`#"8=<;:3W7wv.3,+O/.'m+*)(!EfeBcbx>_{tsxwvun4Ukpi/POkdcha'_d]#DZ_^]VzZ<RQPUNMqQ3ONGkE-IBAeED=BA:9]=<|43870/St,+O/.-ml*)(!Ef|Bcb~w|u;y[Zvun4rTpoh.fN+cKgf_%cE[!BXWV[ZSwWP8TSLpJIHMLEJIBf)d'=aA@">=<5Y98165.3,Pq)('K%*#"!EfeBcyxwvu;yxwvuWm3~

Попробуйте онлайн!

Кшиштоф Шевчик
источник
5

Баш, 179 байт

echo U`sed -r 's/./& &/g'<<<HAABADEDOEFAEHELAGOFEMAHINAISHMENERESITALOHOMMONOPAMUMYAWETOSOWOYOXUNUPEXI`F `grep -o ..<<<ANARASATAXAYBEBIBOBYJOKAKILIMIOIDOIDORPIQITIUSUTYEZA`
  • Сохранено 7 байтов благодаря комментарию Адама Каца

Используется sedдля замены регулярных выражений. Ввод первого регулярного выражения основан на идее Sp3000, в то время как второй регулярное выражение использует общий ввод без пробелов.

Объяснение:

echo              print to standard output the following
U                 boundary U character
sed -r [etc]      the result of replacing regex
    .             select a character
    & &           replace it for: matched char, space, matched char
    g             do it globaly for every character
    <<<HAAB[etc]  string input based on Sp3000 idea => HA AA AB ...
F                 boundary F character
sed -r [etc]      the result of replacing regex
    ..            every two characters
    <space>&      for space+matched character
    g             do it globally
    <<<ANAR       normal input => AN AR ...
sergioFC
источник
1
Вы можете уменьшить это на семь байтов, используя пробел, а затем `grep -o ..вместо этого `sed -r 's/ / &/g'хитрость из моего ответа ниже.
Адам Кац
5

Внимание, этот ответ не является программно интересным.

Поскольку все слова состоят из двух символов, мы можем разбить их все вместе, а затем снова разорвать на части, используя простое регулярное выражение.

Любой дружественный к регулярным выражениям язык может сделать это, некоторые более эффективно, чем другие:

Grep (через Bash), 215 байт

grep -o ..<<<AAABADAEAGAHAIALAMANARASATAWAXAYBABEBIBOBYDEDOEDEFEHELEMENERESETEXFAFEGOHAHEHIHMHOIDIFINISITJOKAKILALILOMAMEMIMMMOMUMYNANENONUODOEOFOHOIOMONOPOROSOWOXOYPAPEPIQIRESHSISOTATIT

Javascript, 224 байта

alert("AAABADAEAGAHAIALAMANARASATAWAXAYBABEBIBOBYDEDOEDEFEHELEMENERESETEXFAFEGOHAHEHIHMHOIDIFINISITJOKAKILALILOMAMEMIMMMOMUMYNANENONUODOEOFOHOIOMONOPOROSOWOXOYPAPEPIQIRESHSISOTATITOUHUMUNUPUSUTWEWOXIXUYAYEYOZA".match(/../g))

Perl, 225 байт

 $_="AAABADAEAGAHAIALAMANARASATAWAXAYBABEBIBOBYDEDOEDEFEHELEMENERESETEXFAFEGOHAHEHIHMHOIDIFINISITJOKAKILALILOMAMEMIMMMOMUMYNANENONUODOEOFOHOIOMONOPOROSOWOXOYPAPEPIQIRESHSISOTATITOUHUMUNUPUSUTWEWOXIXUYAYEYOZA";s/../$&\n/g;print

Python, 245 байт

import re
print re.sub(r'..','\g<0>\n',"AAABADAEAGAHAIALAMANARASATAWAXAYBABEBIBOBYDEDOEDEFEHELEMENERESETEXFAFEGOHAHEHIHMHOIDIFINISITJOKAKILALILOMAMEMIMMMOMUMYNANENONUODOEOFOHOIOMONOPOROSOWOXOYPAPEPIQIRESHSISOTATITOUHUMUNUPUSUTWEWOXIXUYAYEYOZA")

 


Как примечание, некоторые ответы здесь длиннее, чем echo я бы назвал базовым:

Оболочка POSIX, 307 байт

echo 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
Адам Кац
источник
3
+1 за практичность. Действительно, обеспечение базового эха - это точка, с которой все должны начинать.
Металим
+1 на легкий ответ, но вы должны пометить это как не конкурирующие, не так ли?
Мэтью Ро
@ MatthewRoh - Если бы существовал анализатор таблицы лидеров, он, вероятно, не смог бы ничего найти, поскольку я намеренно не начинал с заголовка. Я не волнуюсь, тем более что для каждого языка, который я выложил, есть более короткие ответы.
Адам Кац
3

C - 228 217 байт - GCC

 _;main(){char *z,*i="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(z=i;_++^26;)for(;*++z^32;putchar(_+64),putchar(*z),puts(""));}

Обновлюсь, если я смогу уменьшить его, просто скомпилируем с выходами 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"
Уровень Река St
3

C #, 348 байт

Я попробовал:

using System;class A{static void Main(){var a=new System.Collections.BitArray(Convert.FromBase64String("tnOciwgCCAAAAAggAFBxHIkAAAAACICIKABQQBgAAAIgIACAgCAAIqIgigCCADfWuIgAAAACAIAAAAAwCICAIAAAYRkAAAAAAggAgAAIIoAACA=="));int c, d;for(var i=0;i<652;i++){if(a[i]){c=Math.DivRem(i,26,out d);Console.Write("{0}{1} ",(char)('A' + c),(char)('@' + d));}}}}

Ungolfed:

using System;

class A
{
    static void Main()
    {
        var a = new System.Collections.BitArray(Convert.FromBase64String(
            "tnOciwgCCAAAAAggAFBxHIkAAAAACICIKABQQBgAAAIgIACAgCAAIqIgigCCADfWuIgAAAACAI" + 
            "AAAAAwCICAIAAAYRkAAAAAAggAgAAIIoAACA=="));
        int c, d; 
        for(var i = 0; i < 652; i++)
        {
            if(a[i])
            {
                c = Math.DivRem(i, 26, out d);
                Console.Write("{0}{1} ", (char)('A' + c), (char)('@' + d));
            }
        }
    }
}
Джодрелл
источник
4
Это вызов Codegolf, поэтому вы должны опубликовать свой счетчик байтов (длина вашего кода). Также попробуйте немного его сократить, например, удалив пробелы.
Якуб
@ Якуб, это лучше?
Джодрелл
Да выглядит нормально
Якуб
3

Pyth , 140 байт

K"aeiou"=H+-G+K\zKL.[`Z25.Bib32jdSfTs.e.e?nZ`0+@Gk@HY""byMc"ljjns 1u  a 6jji0 o 2 100u 60hg0 2 k m 101v r 6hr7c s 4 8 g006 m hpg0  a 5 q g"d

Попробуйте онлайн!

Метод сжатия: поскольку Zво второй позиции ни одного слова нет, используйте переупорядоченный алфавит bcdfghjklmnpqrstvwxyaeiouдля кодирования действительности каждой из этих букв в качестве второй буквы для каждой первой буквы (первые буквы расположены в алфавитном порядке).
Это 25 бит на букву, или ровно 5 цифр Base-32. Поскольку большинство согласных принимают только гласные в качестве второй буквы, я ставлю гласные в конце, чтобы получить в основном однозначные числа для них. Я уверен, что в целом это может быть улучшено путем дальнейшего анализа и переупорядочения алфавита, хотя тогда определение переупорядоченного алфавита займет больше байтов.

объяснение

K"aeiou"=H+-G+K\zK # Define the reordered alphabet
K"aeiou"           # K := "aeiou"
        =H         # H :=
           -G      #      G.removeAll(
             +K\z  #                   K + "z" 
          +      K #                           ) + K

L.[`Z25.Bib32      # Define a lambda function for decompression
L                  # y = lambda b:
         ib32      # convert b to int using Base 32
       .B          # convert to binary string
 .[`Z25            # pad to the left with "0" to the nearest multiple of 25 in length

                           c"..."d # split the compressed string on " "
                         yM        # Apply y (above lambda) to each element
                                   #   Intermediate result: List of binary strings
                                   #   with 1s for allowed combinations
      .e                           # map over ^ lambda b (current element), k (current index):
        .e              b          # map over b: lambda Z (cur. elem.), Y (cur. ind.):
               +@Gk@HY             # G[k] + H[Y] (G is the regular alphabet)
          ?nZ`0       ""           #     if Z != "0" else ""
     s                             # combine into one large list
   fT                              # remove all falsy values (empty strings)
  S                                # sort (if any order is possible, remove this)
jd                                 # join on spaces (if a normal list with the words is
                                   #   allowed, remove this)
ar4093
источник
2

PHP: 211 209 204

Вы должны отключить предупреждения, в противном случае будет напечатано в отношении неявного создания $b

for($a=65;$b<strlen($c="ABDEGHILMNRSTWXY!AEIOY!EO!DFHLMNRSTX!AE!O!AEIMO!DFNST!O!AI!AIO!AEIMOUY!AEOU!DEFHIMNPRSWXY!AEI!I!E!HIO!AIO!HMNPST!EO!IU!AEO!A");$b++)if($c[$b]!='!')echo chr($a).$c[$b].' ';else$a++;

Очень весело. Ранние попытки были в диапазоне 250, но это мой самый тонкий пока.

NickW
источник
2
Попробуйте этот счетчик байтов . Обратите внимание, что отключение подсчета пробелов является неправильным, поскольку оно также освобождает любые пробелы в строках, поэтому ваш счет должен быть больше 186.
Sp3000
Хороший улов. Я обновил свое представление соответственно
Ник
Я не могу понять, почему .. но это теперь просто печатает "АААА А ..."
Джеймс Вебстер
Вы вынули !на ... если вам это нужно.
Джеймс Вебстер
Правильно. Я только что заметил это. Я использовал! разделитель ранее, и я сделал быструю замену, не думая, что произойдет первым.
Ник
2

CJam (99 байт)

Это включает в себя несколько специальных символов, поэтому безопаснее всего использовать hexdump. (В частности, персонаж со значением 0xa0, соответствующим неразрывному пробелу, доставил мне немало хлопот при настройке онлайн-демонстрации).

00000000  36 37 36 22 c4 b2 2d 51  3f 04 93 5c 64 6c 8d 6e  |676"..-Q?..\dl.n|
00000010  d7 f9 7d 97 29 aa 43 ef  04 41 12 e1 aa ce 12 4d  |..}.).C..A.....M|
00000020  05 f3 1c 2b 73 43 a0 f0  41 c0 a7 33 24 06 37 a3  |...+sC..A..3$.7.|
00000030  83 96 57 69 9b 91 c4 09  c3 93 e1 ed 05 3b 84 55  |..Wi.........;.U|
00000040  d9 26 fd 47 68 22 32 35  36 62 33 38 62 7b 31 24  |.&.Gh"256b38b{1$|
00000050  2b 7d 2f 5d 7b 32 36 62  28 3b 36 35 66 2b 3a 63  |+}/]{26b(;65f+:c|
00000060  4e 7d 2f                                          |N}/|
00000063

Демо онлайн .

Подход заключается в разностном кодировании в base-26.

Питер Тейлор
источник
Добавление символа к целому числу приводит к появлению символа, который можно заменить 65f+:cна 'Af+.
Деннис
Правда. И mdэто замечательное улучшение, но я не понял, насколько близок мой ответ к вашему.
Питер Тейлор
2

CJam, 100 98 байт

'A'@" ©Ô&ñ±ð¨9_AÚá¼thÁätÑû¨HÙH&J3p¼ÛèVçckùá%´}xà41"260bGb{_{+N2$2$}{;;)'@}?}%-3<

(Ссылка)

  • Сохранено два байта с помощью предварительно инициализированных переменных (спасибо Денису!)

Это моя первая запись в CJam, так что, вероятно, есть потенциал для игры в гольф. Тем не менее, я нашел способ сжать список символов до 63 байтов, который, надеюсь, кто-то найдет полезным.

Метод сжатия

До сих пор большинство методов, которые я видел, кодировали обе буквы каждого слова. Однако, когда мы помещаем слова в алфавитном порядке, первая буква меняется не очень часто, поэтому кажется явно расточительным ее кодировать.

Я кодирую только последний символ каждого слова и включаю специальный элемент всякий раз, когда первый символ должен увеличиваться. Символы кодируются как первый символ, затем список отличий. Поскольку нет повторяющихся слов, различия должны быть как минимум 1. Таким образом, я могу использовать 0в качестве разделителя элементов. (Обратите внимание, что тогда я должен сохранить первую букву каждой подпоследовательности как одноиндексную, в противном случае может возникнуть путаница между «опущенным первым символом 0» и «начинаться с A 0».)

Поскольку различия в этом случае никогда не превышают 15, мы можем использовать base-16 и упаковывать два (4-битных) элемента в каждый (8-битный) байт. (В реальном коде я преобразовал из base-260 вместо base-256, чтобы избежать проблем с непечатными символами.)

2012rcampion
источник
Вы можете сэкономить пару байтов, используя Gи N, которые нажимают 16 и перевод строки.
Деннис
@Dennis Спасибо, не знал, что переменные были предварительно инициализированы!
2012rcampion
1
Все 26 заглавных букв являются преинициализированными переменными. Вы можете увидеть полный список здесь .
Деннис
Вы можете сохранить больше байт, заменяя %-3<с /;;или даже /&. (Второй вариант выдаст сообщение об ошибке. Мета-консенсус в том, что это нормально.)
Деннис
2

брейкфак , 1371 байт

Вполне пригодный для игры в гольф, но я не приложил слишком много усилий для этого.

>+[+[<]>>+<+]>[-<<+<+>>>]-[-[-<]>>+<]>-[-<<<<+>>>>]<<<<<<..>>.<<.>+.>.<<.>++.>.<
<.>+.>.<<.>++.>.<<.>+.>.<<.>+.>.<<.>+++.>.<<.>+.>.<<.>+.>.<<.>++++.>.<<.>+.>.<<.
>+.>.<<.>+++.>.<<.>+.>.<<.>+.>.<------------------------<+.>.>.<<.>++++.>.<<.>++
++.>.<<.>++++++.>.<<.>++++++++++.>.<--------------------<++.>.>.<<.>++++++++++.>
.<-----------<+.>.>.<<.>++.>.<<.>++.>.<<.>++++.>.<<.>+.>.<<.>+.>.<<.>++++.>.<<.>
+.>.<<.>+.>.<<.>++++.>.<-----------------------<+.>.>.<<.>++++.>.<<+.>++++++++++
.>.<--------------<+.>.>.<<.>++++.>.<<.>++++.>.<<.>++++.>.<<.>++.>.<-----------<
+.>.>.<<.>++.>.<<.>++++++++.>.<<.>+++++.>.<<.>+.>.<-----<+.>.>.<--------------<+
.>.>.<<.>++++++++.>.<--------<+.>.>.<<.>++++++++.>.<<.>+.>.<---------<+.>.>.<<.>
++++.>.<<.>++++.>.<<.>++++.>.<<.>++.>.<<.>++++++.>.<<.>++++.>.<-----------------
-------<+.>.>.<<.>++++.>.<<.>++++++++++.>.<<.>++++++.>.<-----------------<+.>.>.
<<.>+.>.<<.>+.>.<<.>++.>.<<.>+.>.<<.>++++.>.<<.>+.>.<<.>++.>.<<.>++.>.<<.>+.>.<<
.>++++.>.<<.>+.>.<<.>+.>.<------------------------<+.>.>.<<.>++++.>.<<.>++++.>.<
<+.>.>.<----<+.>.>.<<+.>+++.>.<<.>+.>.<<.>++++++.>.<--------------<+.>.>.<<.>+++
+++++.>.<<.>++++++.>.<-------<+.>.>.<<.>+++++.>.<<.>+.>.<<.>++.>.<<.>+++.>.<<.>+
.>.<---------------<++.>.>.<<.>++++++++++.>.<------<+.>.>.<<.>++++++++++++.>.<--
------------------<+.>.>.<<.>++++.>.<<.>++++++++++.>.<--------------<+.>.>.

Попробуйте онлайн!

Кшиштоф Шевчик
источник
Ну, с одной стороны, вы можете избавиться от новых строк
Джо Кинг
@JoKing нет никакого реального способа, которым я мог бы перехитрить кого-то, я не думаю, что есть много смысла сбрасывать пару байтов в этом большом масштабе.
Кшиштоф Шевчик
2

Zsh, 175 байт

В этом решении используется строка из 125 символов, где строчные буквы служат разделителями, а первая буква следующей последовательности заглавных букв.

Перебираем буквы $L . Если текущая буква $Xв нижнем регистре при сравнении ASCII, установите $Wв $X. В противном случае, печать $Wсоединяется с, $Xчтобы сделать текущее слово.

Попробуйте онлайн!

L=aABDEGHILMNRSTWXYbAEIOYdEOeDFHLMNRSTXfAEgOhAEIMOiDFNSTjOkAIlAIOmAEIMOUYnAEOUoDEFHIMNPRSWXYpAEIqIrEsHIOtAIOuHMNPSTwEOxIUyAEOzA
for X in ${(s::)L};{((#X>90))&&W=$X||<<<$W$X:l}

Редактировать: добавлено :lдля последовательной установки строчных букв, согласно требованию
Редактировать 2: -4 байта, используя$X[[..]]
букв" переменную, и упрощен, если условие Edit3: -4 байта, удалив кавычки ( )
Edit5: -5 байтов, используя преобразование массива, вместо того, чтобы L выполнять итерации согласно ниже
Edit4: Альтернативный подход для 182 байта , используя обратимые строки в первых 33 буквах, $Lэто всего 107 букв

L=aBHLMNTYdEOeFHMNRhOiSTmOUnOUoSWYaADEGIRSWXbEIOYeLSTXfAgOhIMiDFNjOkAIlIOmIMYoEFIPRXpAEIqIsHtOuHPSTwExIUyEzA
for ((;i++<$#L;))X=$L[i]&&((#X>90))&&W=$X:u||<<<$W$X`((i<34))&&<<<\ $X$W`
roblogic
источник
2

Stax , 91 байт

âG→æ£ilæα¿:√▒▓uøD¶[│█æä║¢v┼T↨σªΩ■&*φòb¡CÆ?ì▀┬6ù═╦±qBF!╘π╓╙'♣*ù&↕!£ä3±r⌡W-╓D╬☺╝ï╜²á5Æ÷§═ôφF;

Запустите и отладьте его

Единственный изящный прием, который использует этот ответ, - это использование токена «,» для отображения изменения в первой букве, а не для сохранения его для каждого слова.

Спасибо рекурсивному за идею использования оператора m

user89655
источник
Красиво сделано. Я вижу несколько небольших оптимизаций. Используйте Mвместо 1/и используйте сокращенную карту mвместо явного foreach и print { ... PF. Этот упаковывает до 89.
рекурсивный
1

Python 3, 224 байта

s='';i=int("AQHU9HU1X0313T1J9OMYMZZSRFWLCYT3POSE06UGHXDZN6H5SQSZIFCE6VEB",36)
for c in range(26):
 b=i%6;i//=6;k=(1<<b)-1;j=i%(1<<k);i>>=k
 for d in 'AOIEHMUSTMNDFPYBCGJKLQRVWXZ':
  if j&1:s+=chr(c+65)+d+' '
  j>>=1
print s

Использует битовые маски переменной длины для кодирования, какие вторые буквы существуют для каждой возможной первой буквы. Битовые маски могут иметь длину 0,1,3,7,15 или 31 бит. Биты сопоставляются с буквами for d in 'AOIEHMUSTMNDFPYBCGJKLQRVWXZ':, более ранние биты используются для более распространенных букв, так что в большинстве случаев битовые маски могут быть короткими (обычно 3 или 7 бит, поскольку за большинством согласных следует только один из 5 гласных или YM или H). К сожалению, код для его декодирования сводит на нет экономию по сравнению с более простыми методами (первоначальный список составляет всего 303 байта).

samgak
источник
1
Я обнаружил, что лучше кодировать, какая первая буква существует для каждой возможной второй буквы в моем решении. Может быть стоит попробовать у себя.
Джеймс Вебстер
1

Haskell, 192 байта

putStr$(\(a:b)->((a:).(:" "))=<<b)=<<words"AABDEGHILMNRSTWXY BAEIOY DEO EDFHLMNRSTX FAE GO HAEIMO IDFNST JO KAI LAIO MAEIMOUY NAEOU ODEFHIMNPRSWXY PAEI QI RE SHIO TAIO UHMNPST WEO XIU YAEO ZA"

Для каждого слова, разделенного пробелом в строке, поместите первую букву перед всеми остальными буквами и добавьте пробел, например SHIO-> SH SI SO.

Ними
источник
1

Java, 334 байта

public class C{public static void main(String[]a){for(int i=0;i<26;i++){for(int j=0;j<26;j++){if(java.util.BitSet.valueOf(java.util.Base64.getDecoder().decode("2znORQQBBAAAAAQQAKg4jkQAAAAABEBEFAAoIAwAAAEQEABAQBAAEVEQRQBBgBtrXEQAAAABAEAAAAAYBEBAEACAsAwAAAAAAQQAQAAEEUAABA==")).get(i*26+j)){System.out.format("%c%c\n",'a'+i,'a'+j);}}}}}

отформатирован:

public class Code {
    public static void main(String[] a) {
        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < 26; j++) {
                if (java.util.BitSet.valueOf(
                        java.util.Base64.getDecoder()
                            .decode("2znORQQBBAAAAAQQAKg4jkQAAAAABEBEFAAoIAwAAAEQEABAQBAAEVEQRQBBgBtrXEQAAAABAEAAAAAYBEBAEACAsAwAAAAAAQQAQAAEEUAABA=="))
                        .get(i * 26 + j)) {
                    System.out.format("%c%c\n", 'a' + i, 'a' + j);
                }
            }
        }
    }
}

Отдельно я закодировал список слов длиной 26x26 = 676 BitSet, преобразовал его в байтовый массив и, наконец, в Base 64. Эта строка жестко запрограммирована в этой программе, и обратная процедура используется для воспроизведения BitSet, и в конечном итоге распечатать список слов

Кевин К
источник
1

Java, 356 байт

Использует генератор случайных чисел, чтобы получить слова:

import java.util.Random;class X{public static void main(String[]a){int j,n,m=9,x;for(String u:"rgzza 2u2hh r2rxs qs5f fwiag 26i33y 2xqmje 5h94v 16ld2a 17buv 4zvdi 1elb3y 2t108q 5wne9 1mrbfe 1ih89 fh9ts r0gh".split(" ")){x=Integer.parseInt(u,36);Random r=new Random(x/2);j=m-=x%2;while(j-->0){n=r.nextInt(676);System.out.format(" %c%c",65+n/26,65+n%26);}}}}

Ungolfed:

import java.util.Random;
class X{
    public static void main(String[]a){
        int j,n,m=9,x;
        for(String u:"rgzza 2u2hh r2rxs qs5f fwiag 26i33y 2xqmje 5h94v 16ld2a 17buv 4zvdi 1elb3y 2t108q 5wne9 1mrbfe 1ih89 fh9ts r0gh".split(" ")){
            x=Integer.parseInt(u,36);
            Random r=new Random(x/2);
            j=m-=x%2;
            while(j-->0){
                n=r.nextInt(676);
                System.out.format(" %c%c",65+n/26,65+n%26);
            }
        }
    }
}

Вы можете попробовать это здесь: http://ideone.com/Qni32q

Arnaud
источник
1

Perl, 248 байт

@v=split(//,"AEIOU");@s=split(' ',"ADEGIRSWX LSTX DFN EFIPRX HPST BHLMNTY DFHMNR ST DHMNSWY MN ZFKP WYPB KQXLHPMB LGJTB X");for(0..14){foreach $c(split(//,@s[$_])){$_<10?print @v[$_%5].$c." ":a;$_>4?print $c.@v[$_%5]." ":a;}}print "MM MY BY HM SH";

Впервые использую Perl (и впервые играю в гольф), так что определенно есть место для улучшения. Выделены гласные и сгруппированы оставшиеся буквы в зависимости от того, как было создано полученное слово - добавление первого, последнего или обоих гласных первого и последнего гласных создает слово в списке.

VoiceOfFolly
источник
Я не знаю Perl, но я предполагаю, что вы разделяете вывод пробелами. Кажется, "MM "."MY "."BY "."HM "."SH "можно сократить до "MM MY BY HM SH".
Уровень Река St
@steveverrill Спасибо! Я так увлекся остальной частью кода, что упустил из виду, насколько это избыточно.
VoiceOfFolly
1

Javascript (ES6), 214

Возможно, не самый короткий способ сделать это, но определенно интересно.

_=>(i=0,[...'ABDEFGHILMNOPRSTUWXY'].map(z=>[...`ABFHKLMNPTYZ
A
AEIO
ABDFHMNOPRWY
EIO
A
AEOSU
ABHKLMOPQSTX
AE
AEHMOU
AEIOU
BDGHJLMNSTWY
OU
AEO
AEIOU
AEIU
MNX
AO
AEO
ABMO`.split`
`[i++]].map(g=>g+z).join` `).join`
`)

Перебирает каждую букву в первой строке, добавляя ее к каждой букве в соответствующей строке второй. Это возвращает слова в порядке их последней буквы, например так:

AA BA FA HA KA LA MA NA PA TA YA ZA
AB
AD ED ID OD
AE BE DE FE HE ME NE OE PE RE WE YE
EF IF OF
AG
AH EH OH SH UH
AI BI HI KI LI MI OI PI QI SI TI XI
AL EL
AM EM HM MM OM UM
AN EN IN ON UN
BO DO GO HO JO LO MO NO SO TO WO YO
OP UP
AR ER OR
AS ES IS OS US
AT ET IT UT
MU NU XU
AW OW
AX EX OX
AY BY MY OY

Предложения приветствуются!

ETHproductions
источник
1

Java, 255 254 байта

Нашел способ выжать еще один байт из него.

class C{public static void main(String[]a){char c='A';for(char l:"ABDEGHILMNRSTWXY AEIOY  EO DFHLMNRSTX AE O AEIMO DFNST O AI AIO AEIMOUY AEOU DEFHIMNPRSWXY AEI I E HIO AIO HMNPST  EO IU AEO A".toCharArray())if(l<'A')c++;else System.out.print(" "+c+l);}}

Или (хотя и не намного понятнее):

class C {
    public static void main(String[] a) {
        char c = 'A';
        for (char l : "ABDEGHILMNRSTWXY AEIOY  EO DFHLMNRSTX AE O AEIMO DFNST O AI AIO AEIMOUY AEOU DEFHIMNPRSWXY AEI I E HIO AIO HMNPST  EO IU AEO A"
                .toCharArray())
            if (l < 'A')
                c++;
            else
                System.out.print(" " + c + l);
    }
}
Aofl
источник
Вы можете сохранить два байта, изменив оба вхождения 'A'на 65.
ProgramFOX
1

Haskell, 333 308 298 байт

Просто для удовольствия!

Оценка sнапечатает все слова в странном порядке - я использовал тот факт, что большинство комбинаций согласны с гласными или наоборот, возможно, можно оптимизировать еще больше с помощью пользовательских «классов» символов, сокращая кодированную матрицу (здесь wиk ).

Кто-нибудь знает более короткий способ печати строк без кавычек и скобок, чем мой монадический? Классы типа еще длиннее, насколько я могу судить.

Кроме того, может также быть более короткий способ сделать pработу ...

v="AEIOU"
c="BCDFGHJKLMNPQRSTVWXYZ"
w=[976693,321324,50188,945708,52768]
k=[15,0,10,3,8,15,8,5,13,31,27,7,4,2,12,13,0,10,20,11,1]
z a b x=[[c:[e]|(e,f)<-b#p d,f]|(c,d)<-a#x]
(#)=zip
p 0=[]
p n=((n`mod`2)>0):p(n`div`2)
s=mapM_ putStrLn$concat$z v c w++z c v k++[words"AA AE AI BY HM MM MY OE OI SH"]
Лейф Виллертс
источник
Разве не так sequence_же, как void$sequence? Тогда вы можете опустить также import.
Ними
Это странно упаковано, но да. Благодарность!
Лейф Виллертс
Нет, voidдолжен был быть импортирован. В любом случае, собираюсь помнить это.
Лейф Виллертс
1
Ах, и sequence_$map putStrLnесть mapM_ putStrLn. Замените (, )вокруг concat$...другим $.
Ними
1

05AB1E , 143 байта (не конкурирует)

•ZÐFý8ù6„=4ÅœÿWì±7Ë5Œ¾`ó/îAnµ%Ñ¥Ëø±/ÀéNzքѧIJ¶D—ÙVEStvÖò…¸¾6F³#EXŠm¯Cĵ±ÓoÊ°}^€Ftå߀ðŒ=«j;F-Â1;xX3i&QZÒ'Ü”>lwìlOs>íÙVÇI)~î‰Hç²?Öd0È^ÝQ°•36B2ô»

Попробуйте онлайн!

Урна волшебного осьминога
источник
95 байтов при переносе ответа @ Sp3000 на Python 3 .
Кевин Круйссен
1
@KevinCruijssen 91 (и я уверен, что этот метод может стать ниже, но я выбрал словарь слов для юмора).
Grimmy
1

PHP, 170 байт

кратчайший подход, который я мог найти до сих пор ...

for(;$c=ABFHKLMNPTYZ1A2AEIO1ABDFHMNOPRWY1EIO1A1AEOSU1ABHKJMOPQSTX3AE1AEHMOU1AEIOU1BDGHJLMNSTWY1OU11AEO1AEIOU1AEIU1MNX2AO1AEO1ABMO[$i++];)$c<1?print$c.chr($k+65)._:$k+=$c;

сломать

for(;$c=CHARACTERS[$i++];)  // loop $c through map
    $c<1                            // if $c is a letter (integer value < 1)
        ?print$c.chr($k+65)._           // print first letter, second letter, delimiter
        :$k+=$c                         // else increase second letter
    ;

Заметка Самая короткая версия с отображением битов с возможностью печати ascii стоит 190 байтов (113 байтов данных + 77 байтов декодирования) с использованием 6 битов = основание 64, 174 байта (97 данных, 77 декодирование) с использованием 7 битов (основание 128); возможно, еще немного для побега.

for(;$p<676;)                   // loop through combinations
    ord("MAPPING"[$p/6])-32>>$p%6&1     // test bit
        ?                                       // if set, do nothing
        :print chr($p/26+65).chr($p++%26+65)._; // if not, print combination+delimiter

База 224 (с использованием ascii 32..255) принимает 87 байтов данных (+ экранирование); но я думаю, что декодирование будет стоить больше, чем 10 байтов.
Исключение C и V из карты позволит сэкономить 16/14/13 байтов в данных, но при декодировании будет стоить дорого.

Titus
источник