Генерация случайной доски Boggle

16

Создайте сетку букв / пробелов 4x12:

Каждый кубик должен появляться ровно один раз, местоположение выбирается случайным образом. Места должны быть приближены к равномерной случайной перестановке кости. Отображение случайного (опять же, приблизительно одинакового) лица каждого кубика. Выровнять по левому краю лицо в окне из 3 символов. Например,

A  E  A  A
E  C  D  E
D  A  Qu E
E  A  H  D

Это нерандомизированная доска в нужном мне формате. Промежуточное место разрешено.

Кости:

A  A  E  E  G  N
E  L  R  T  T  Y
A  O  O  T  T  W
A  B  B  J  O  O
E  H  R  T  V  W
C  I  M  O  T  U
D  I  S  T  T  Y
E  I  O  S  S  T
D  E  L  R  V  Y
A  C  H  O  P  S
H  I  M  N  Qu U
E  E  I  N  S  U
E  E  G  H  N  W
A  F  F  K  P  S
H  L  N  N  R  Z
D  E  I  L  R  X

Забавный факт: в наборе всего 1 К Какие еще письма исключительно делятся тем, что умирают?

Это поэтому выигрывает программа с самым коротким байтом!

Бутби
источник
3
не может быть F, если есть K. это означает, что вы не можете произнести f ... iretruck! : P
Блейзер
@Blazer: Да, и ты тоже не можешь произнести f ... olk. : P
Ry-

Ответы:

5

GolfScript, 116 байт

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

'57 BYTES OF BINARY DATA HERE'256base 26base 6/{;9.?rand}${6rand=65+.81='  u '2/=}%8/n*

Это очень похоже на решение Питера Тейлора, и я признаю, что бесстыдно позаимствовал его (например, .81=' u '2/=уловку), хотя я думаю, что мне удалось немного сократить его перетасовку, даже потратив дополнительный символ байт для лучшей случайности.

Двоичная строка в начале скрипта содержит непечатаемые символы, поэтому ее нельзя вставить напрямую. Вместо этого я предоставлю скрипт в виде шестнадцатеричного дампа:

0000000: 2701 8302 7c56 97d5 ec9c 52e3 462e 44d7  '...|V....R.F.D.
0000010: a8d2 81c9 6115 fc80 4da4 6cd3 b06f a6d8  ....a...M.l..o..
0000020: 4e7e 2029 12a9 f331 0b83 3481 de36 81e2  N~ )...1..4..6..
0000030: 41b4 534d dee8 13f7 ccfd 2732 3536 6261  A.SM......'256ba
0000040: 7365 2032 3662 6173 6520 362f 7b3b 392e  se 26base 6/{;9.
0000050: 3f72 616e 647d 247b 3672 616e 643d 3635  ?rand}${6rand=65
0000060: 2b2e 3831 3d27 2020 7520 2732 2f3d 7d25  +.81='  u '2/=}%
0000070: 382f 6e2a                                8/n*

В Linux или любой системе с xxdустановленной утилитой этот шестнадцатеричный дамп можно превратить в работающую 116-байтовую программу GolfScript, пропустив ее xxd -r.

Edit: Заменены 999randс 9.?randдля гораздо лучшей случайности. Перестановка должна быть примерно настолько близкой к идеальной, насколько позволяет исходный ГСЧ.

Илмари Каронен
источник
Ах, я забыл, что вы можете сортировать по карте.
Питер Тейлор
4

Python 2,7, 253 229 215 символов

from random import*
j=0
for x in map(choice,sample("AAEEGN ELRTTY AOOTTW ABBJOO EHRTVW CIMOTU DISTTY EIOSST DELRVY ACHOPS HIMNQU EEINSU EEGHNW AFFKPS HLNNRZ DEILRX".split(),16)):j+=1;print x+' u'[x=='Q']+'\n'[j%4:],

Большинство персонажей - это просто кости. Я не хотел тратить слишком много времени, пытаясь уменьшить его слишком много

незначительное редактирование: удалены 2 ненужных байта (лишние пробелы)

edit2: до 229

edit3: до 215

блейзер
источник
1
Вы можете сделать свой код более плотным с помощью индексации, print a+' u'[a=='Q']иprint'\n'[j%4:]
Кит Рэндалл
@ спасибо, спасибо! Я сделал это еще крепче, объединив эти два трюка :)
Blazer
1
Мне удалось снизить его до 218, не убивая его (я думаю?): 1) Измените оператор импорта на from random import*и удалите все r.. 2) Замените разделители в строке на `` (пробел) и str.splitиспользуйте аргумент по умолчанию '. 3) Избавиться от всего, что связано с jи использовать '\n'[len(d)%4:]. 4) Используйте list.popаргумент по умолчанию. 5) ... 6) Прибыль!
Диллон Кауэр
@ DC ахх, спасибо! Я удивлен, что не заметил их. но я думаю, что это то, что я получаю за то, что написал это через несколько минут: P
Blazer
1
И я уменьшил его еще на 3 символа, используя небольшой трюк с картой, но мне пришлось оставить j=0...+'\n'[j%4:]его для работы
Blazer
3

GolfScript ( 141 139 137 символов байтов)

Из них 94 расширяются до строки, содержащей кости. Рисунок не содержит ненужной новой строки, вставленной для переноса, чтобы код можно было просматривать без прокрутки:

'Y
ISY
XIAOOW
VYAAEEGNABBJOOEHRTVWCIMOTUEIOSSTACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZ'n/'TTELRD'*
6/{[6rand=99rand\]}%${1=.81='  u '2/=}%8/n*
Питер Тейлор
источник
Если мой (ручной) анализ верен, то нет никаких других строк, которые были бы достаточно длинными и достаточно частыми, чтобы сжимать данные простой заменой, независимо от порядка игры в кости и в игре в кости.
Питер Тейлор
Я смог уменьшить таблицу с 96 до 84 символов, чередуя кости и используя кодирование длины серии. Декодирование, которое может иметь значение ... это точно для Python.
Boothby
Вы можете кодировать 6 букв в 30 бит, а затем в 5 печатных символов, сохраняя 16 байтов. Но вам понадобится сдвиг / маска, чтобы извлечь их.
Угорен
@ugoren, Илмари уже сделал это.
Питер Тейлор
@PeterTaylor, если вы скажете, что он сделал, я верю вам (я никогда не удосужился выучить Golfscript). Но он, кажется, использует 57 непечатных символов, а я предложил 80 печатных.
Угорен
2

Рубин, 201 197 символов

%W(AAEEGN ELRTTY AOOTTW ABBJOO EHRTVW CIMOTU DISTTY EIOSST DELRVY ACHOPS HIMNQU EEINSU EEGHNW AFFKPS HLNNRZ DEILRX).sample(16).map{|c|c[rand 6]}.each_slice(4){|x|puts x.join("  ").gsub(/Q ?/,"Qu")}

(и это однострочник)

Редактировать 1: Использовать% W (), чтобы избежать .split и пару кавычек.

Редактировать 2: Сделано в спецификации (два пробела между каждым выходным столбцом)

Марк Томас
источник
Я только что одобрил изменение «анонимным пользователем» к этому ответу; Я предполагаю, что это был ты, Марк, и ты просто забыл войти в систему. (PS. Твои результаты не совсем соответствуют спецификации; использование исправило x.join(" ").gsub(/Q ?/,"Qu")бы это за счет трех дополнительных символов.)
Илмари Каронен,
(Это один лишний пробел в joinстроке и лишний пробел и знак вопроса в регулярном выражении на случай, если программное обеспечение SE искажает пробелы ...)
Ilmari Karonen
@IlmariKaronen Спасибо, я не заметил два пробела между столбцами. Это должно быть к спецификации сейчас.
Марк Томас
2

Powershell, 234 символа

$d=(0..15|%{@{'AAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTYEIOSSTDELRVYACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZDEILRX'[6*$_+(random)%6]=random}.GetEnumerator()}|sort Value|%{$_.Key})
0..3|%{($d[($_*4)..($_*4+3)])-join"   "-replace'Q ','Qu'}

Вот тот же код с дополнительными пробелами в попытке улучшить читаемость :-)

#########################################
# roll the 16 dice and shuffle them     #
#########################################

$d=(
        0..15 | % {
                    @{
                       'AAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTYEIOSSTDELRVYACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZDEILRX'[6*$_+(random)%6]=random
                     }.GetEnumerator() 
                  } | sort Value | % {
                                        $_.Key
                                     }
    )

############################################
# add the 16 results to the 4 by 4 grid    #
############################################

0..3 | % {
            ($d[($_*4)..($_*4+3)]) -join "   " -replace 'Q ','Qu'
         }

Я не знаю о встроенной shuffleфункции в powershell, поэтому я превратил каждый результат в пару ключ-значение - ключ, равный результат игры в кости, и значение, равное случайному числу. Тогда это был просто случай сортировки этих пар по значению с последующим выводом ключей.

Андрей Шепард
источник
Может быть, вы могли бы использовать последние цифры в текущем времени в мс в качестве значения сортировки?
Блейзер
@Blazer - возможно, но «random» занимает всего шесть символов :-)
Andrew Shepherd
0

Perl, 179 символов

@d=(Qu,map"$_ ",HIMNUAAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTYEIOSSTDELRVYACHOPSEEINSUEEGHNWAFFKPSHLNNRZDEILRX
=~/./g);print+(splice@d,6*int rand@d/6,6)[rand 6],@d%24?$":$/while@d

Вот подробная версия программы:

my $fullset = "HIMNUAAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTY"
           . "EIOSSTDELRVYACHOPSEEINSUEEGHNWAFFKPSHLNNRZDEILRX";
my @dice = ("Qu");
push @dice, "$_ " for split //, $fullset;
while (@dice) {
    my @die = splice @dice, 6 * (int rand @dice / 6), 6;
    print $die[rand 6];
    print @dice % 24 ? " " : "\n";
}
Хлебница
источник