Hasilkan Papan Kericuhan Acak

16

Hasilkan kisi-kisi surat / spasi 4x12:

Setiap dadu harus muncul tepat satu kali, lokasi dipilih secara acak. Lokasi harus mendekati permutasi acak dadu yang seragam. Peragakan wajah acak (sekali lagi, kurang seragam) dari setiap dadu. Kiri-benarkan wajah di jendela 3 karakter. Sebagai contoh,

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

Adalah papan non-acak dalam format yang saya inginkan. Ruang tambahan diperbolehkan.

Dadu:

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

Fakta lucu: hanya ada 1 K di set. Apa surat lain yang secara eksklusif berbagi yang mati?

Ini adalah sehingga program dengan bytecount terpendek menang!

stan
sumber
3
tidak mungkin ada F jika ada K. ini berarti Anda tidak dapat mengeja ... iretruck! : P
Blazer
@ Blazer: Ya, dan kamu tidak bisa mengeja ... olk juga. : P
Ry-

Jawaban:

5

GolfScript, 116 byte

Karena skor dalam byte, saya pikir itu berarti kita dapat menggunakan semua byte dalam solusi. Keluar dari set ASCII yang dapat dicetak memungkinkan solusi yang agak lebih pendek daripada Peter Taylor , dengan biaya membuat kode lebih sulit untuk ditampilkan di sini. Tanpa data yang tidak patut, kode saya terlihat seperti ini:

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

Ini sangat mirip dengan solusi Peter Taylor, dan saya akui meminjam bit tanpa malu-malu (seperti .81=' u '2/=trik), meskipun saya pikir saya berhasil mempersingkat shuffle-nya sedikit, bahkan setelah menghabiskan byte char ekstra untuk keacakan yang lebih baik.

String biner di awal skrip berisi karakter yang tidak diinginkan, sehingga tidak dapat ditempelkan secara langsung di sini. Sebagai gantinya, saya akan memberikan script sebagai hex dump:

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*

Di Linux, atau sistem apa pun dengan xxdutilitas yang diinstal, hex dump ini dapat diubah kembali menjadi program GolfScript 116-byte yang bekerja dengan meneruskannya xxd -r.

Sunting: Diganti 999randdengan 9.?randuntuk keacakan yang jauh lebih baik. Acaknya sekarang harus sedekat mungkin dengan RNG yang mendasarinya.

Ilmari Karonen
sumber
Ah - Saya lupa bahwa Anda dapat mengurutkan berdasarkan pemetaan.
Peter Taylor
4

Python 2.7, 253 229 215 karakter

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:],

Sebagian besar karakter hanyalah dadu itu sendiri. Saya tidak ingin menghabiskan terlalu banyak waktu untuk mengurangi terlalu banyak

suntingan kecil: menghapus 2 byte yang tidak perlu (ruang ekstra)

edit2: turun ke 229

sunting3: hingga 215

Jaket
sumber
1
Anda dapat membuat kode Anda lebih ketat dengan pengindeksan, print a+' u'[a=='Q']danprint'\n'[j%4:]
Keith Randall
semoga terima kasih! Saya membuatnya lebih ketat dengan menggabungkan kedua trik ini :)
Blazer
1
Saya berhasil menurunkannya menjadi 218 tanpa membunuhnya (saya pikir?): 1) Ubah pernyataan impor menjadi from random import*dan hapus semua r.. 2) Ubah pemisah dalam string menjadi `` (spasi) dan manfaatkan str.splitargumen default. 3) Singkirkan segala sesuatu yang berhubungan dengan jdan gunakan '\n'[len(d)%4:]. 4) Gunakan list.popargumen default. 5) ... 6) Untung!
Dillon Cower
@ DC ahh terima kasih! Saya terkejut saya mengabaikan mereka. tapi saya rasa itulah yang saya dapatkan untuk menulisnya dalam beberapa menit: P
Blazer
1
Dan saya mengurangi lebih banyak lagi dengan 3 karakter menggunakan trik peta kecil, tapi saya harus tetap j=0...+'\n'[j%4:]membuatnya agar bisa berfungsi
Blazer
3

GolfScript ( 141 139 137 chars bytes)

Dari yang 94 diperluas ke string yang berisi dadu. Gambar tidak termasuk baris baru yang tidak perlu dimasukkan untuk membuatnya membungkus sehingga kode dapat dilihat tanpa menggulir:

'Y
ISY
XIAOOW
VYAAEEGNABBJOOEHRTVWCIMOTUEIOSSTACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZ'n/'TTELRD'*
6/{[6rand=99rand\]}%${1=.81='  u '2/=}%8/n*
Peter Taylor
sumber
Jika analisis saya (dengan tangan) benar, tidak ada string lain yang cukup panjang dan cukup sering untuk mengompres data dengan penggantian sederhana, terlepas dari pemesanan dadu dan dalam dadu.
Peter Taylor
Saya dapat menurunkan tabel dari 96 hingga 84 karakter dengan menyisipkan dadu dan menggunakan enkode run-length. Decoding yang mungkin membuat perbedaan ... itu pasti untuk python.
booth
Anda dapat menyandikan 6 huruf dalam 30 bit, kemudian dalam 5 karakter yang dapat dicetak, menghemat 16 byte. Tetapi Anda perlu beberapa shift / mask untuk mengekstraknya.
ugoren
@ugoren, Ilmari sudah melakukan itu.
Peter Taylor
@ PeterTaylor, jika Anda mengatakan itu, saya percaya Anda (saya tidak pernah repot-repot belajar Golfscript). Tapi dia tampaknya menggunakan 57 karakter yang tidak patut dicetak, sementara saya menyarankan 80 dicetak.
ugoren
2

Ruby, 201 197 karakter

%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")}

(dan itu satu-liner)

Sunting 1: Digunakan% W () untuk menghindari .split dan sepasang tanda kutip.

Sunting 2: Dibuat sesuai spesifikasi (dua spasi di antara setiap kolom keluaran)

Mark Thomas
sumber
Saya baru saja menyetujui hasil edit oleh "pengguna anonim" untuk jawaban ini; Saya berasumsi itu adalah Anda, Mark, dan Anda hanya lupa untuk login. (Mz. Output Anda tampaknya tidak tepat untuk spek; menggunakan x.join(" ").gsub(/Q ?/,"Qu")akan memperbaikinya dengan biaya tiga karakter tambahan.)
Ilmari Karonen
(Itu satu ruang ekstra di joinstring dan ruang ekstra dan tanda tanya di regex, jika perangkat lunak SE merusak ruang ...)
Ilmari Karonen
@IlmariKaronen Terima kasih, saya tidak melihat dua spasi di antara kolom. Seharusnya untuk spec sekarang.
Mark Thomas
2

Powershell, 234 karakter

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

Berikut kode yang sama dengan spasi putih tambahan, dalam upaya meningkatkan keterbacaan :-)

#########################################
# 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'
         }

Saya tidak mengetahui shufflefitur bawaan di PowerShell, jadi saya mengubah setiap hasil menjadi pasangan nilai kunci - kunci yang menyamakan hasil dadu dan nilai yang menyamai angka acak. Maka itu hanya kasus menyortir pasangan ini dengan nilai kemudian mengeluarkan kunci.

Andrew Shepherd
sumber
mungkin Anda bisa menggunakan angka terakhir di waktu sekarang dalam ms sebagai nilai pengurutan?
Blazer
@ Blazer - mungkin, tetapi "acak" hanya membutuhkan enam karakter :-)
Andrew Shepherd
0

Perl, 179 karakter

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

Inilah versi verbose dari program ini:

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";
}
kotak roti
sumber