Створення випадкової дошки шахраїв


16

Створіть сітку 4х12 літер / пробілів:

Кожна матриця повинна з’являтися точно раз, місце вибране випадковим чином. Місце розташування повинно бути приблизно рівномірною випадковою перестановкою кісток. Відображайте випадкове (знову-таки приблизно однакове) обличчя кожного штампу. Вліво-обґрунтуйте обличчя у вікні 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, якщо є К. це означає, що ви не можете написати f ... iretruck! : P
Blazer

@Blazer: Так, і ти не можеш написати і ... : П
Ри-

Відповіді:


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для набагато кращої випадковості. Перемішання тепер має бути приблизно таким же близьким до ідеального, як дозволяє базовий RNG.


Ага - я забув, що можна сортувати за картою.
Пітер Тейлор

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

редагувати3: до 215


1
ви можете посилити свій код за допомогою індексації, print a+' u'[a=='Q']іprint'\n'[j%4:]
Кіт Рендалл

@keith дякую! Я зробив це ще жорсткіше, поєднуючи ці два трюки :)
Blazer

1
Мені вдалося зменшити його до 218, не вбиваючи його (я думаю?): 1) Змініть імпорт імпорту на from random import*та видаліть усі r.. 2) Змініть роздільники в рядку на `` (пробіл) і скористайтеся str.splitаргументом за замовчуванням. 3) Позбавтеся від будь-чого спільного jта користуйтеся '\n'[len(d)%4:]. 4) Використовуйте list.popаргумент за замовчуванням. 5) ... 6) Прибуток!
Dillon Cower

@DC ах, дякую! Я здивований, що я їх не помітив. але я думаю, що це я отримую, коли написав це за кілька хвилин: P
Blazer

1
І я зменшив його ще на 3 символи, використовуючи невеликий трюк з картою, але мені довелося тримати роботу, j=0...+'\n'[j%4:]щоб вона працювала
Блейзер,

3

GolfScript ( 141 139 137 сі байт)

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

'Y
ISY
XIAOOW
VYAAEEGNABBJOOEHRTVWCIMOTUEIOSSTACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZ'n/'TTELRD'*
6/{[6rand=99rand\]}%${1=.81='  u '2/=}%8/n*

Якщо мій (від руки) аналіз правильний, немає інших рядків, які є і досить довгими, і досить частими, щоб стискати дані простою заміною, незалежно від замовлення кісток і всередині кісток.
Пітер Тейлор

Мені вдалося зменшити таблицю з 96 до 84 символів, переплутавши кістки та використовуючи кодування довжиною пробігу. Розшифровка, яка може скласти різницю ... це впевнено для python.
кабінка

Ви можете кодувати 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: Зробити це за специфікацією (два пробіли між кожним вихідним стовпцем)


Я щойно схвалив редакцію "анонімного користувача" на цю відповідь; Я припускаю, що це ти, Марк, і ти просто забув увійти в систему. (Псалтир, здається, не зовсім специфічний; використання x.join(" ").gsub(/Q ?/,"Qu")цього виправить це ціною трьох додаткових символів.)
Ілмарі Каронен

(Це один додатковий пробіл у joinрядку та додатковий пробіл та знак запитання в регулярному виразі, якщо програмне забезпечення SE заграє пробіли ...)
Ільмарі Каронен

@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невідомо про вбудовану функцію в shellhell, тому я перетворив кожен результат на пару ключових значень - ключ, що дорівнює результату кістки, і значення, що дорівнює випадковому числу. Тоді це був лише випадок сортування цих пар за значенням, а потім виведення ключів.


можливо, ви могли б використовувати останні цифри за поточний час у мс як сортування?
Блейзер

@Blazer - можливо, але "випадковий" займає лише шість символів :-)
Ендрю Шеперд

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";
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.