Zufälliges Boggle Board generieren

16

Erzeugen Sie ein 4x12-Gitter aus Buchstaben / Leerzeichen:

Jeder Würfel sollte genau einmal erscheinen, wobei die Position zufällig gewählt wird. Die Positionen sollten ungefähr einer gleichmäßigen zufälligen Permutation der Würfel entsprechen. Zeigen Sie eine zufällige (wieder annähernd gleichmäßige) Fläche jedes Würfels an. Richten Sie das Gesicht im 3-Zeichen-Fenster linksbündig aus. Beispielsweise,

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

Ist ein nicht randomisiertes Board in dem von mir gewünschten Format. Leerzeichen sind erlaubt.

Der Würfel:

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

Amüsante Tatsache: Es gibt nur 1 K im Set. Welcher andere Brief teilt ausschließlich die, die sterben?

Das ist also gewinnt das Programm mit dem kürzesten bytecount!

boothby
quelle
3
es kann keine Fs geben, wenn es Ks gibt. das heißt, Sie können nicht f ... iretruck buchstabieren! : P
Blazer
@Blazer: Ja, und du kannst auch kein F ... olk buchstabieren. : P
Ry-

Antworten:

5

GolfScript, 116 Bytes

Da die Bewertung in Bytes erfolgt, bedeutet dies, dass wir alle Bytes in der Lösung verwenden können. Das Verlassen des druckbaren ASCII-Satzes ermöglicht eine etwas kürzere Lösung als die von Peter Taylor , was die Anzeige des Codes hier erschwert. Ohne die nicht druckbaren Daten sieht mein Code folgendermaßen aus:

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

Es ist Peter Taylors Lösung ziemlich ähnlich, und ich gebe zu, dass ich schamlos Teile davon ausgeliehen habe (wie den .81=' u '2/=Trick), obwohl ich glaube, dass ich es geschafft habe, sein Shuffle ein wenig zu verkürzen, selbst nachdem ich ein zusätzliches Zeichenbyte für eine bessere Zufälligkeit ausgegeben habe.

Die Binärzeichenfolge am Anfang des Skripts enthält nicht druckbare Zeichen und kann daher hier nicht direkt eingefügt werden. Stattdessen stelle ich das Skript als Hex-Dump bereit:

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*

Unter Linux oder auf jedem System, auf dem das xxdDienstprogramm installiert ist, kann dieser Hex-Speicherauszug durch Weitergabe in ein funktionsfähiges 116-Byte-GolfScript-Programm umgewandelt werden xxd -r.

Edit: Ersetzt 999randdurch 9.?randfür eine viel bessere Zufälligkeit. Das Shuffle sollte nun so gut wie perfekt sein, wie es der zugrunde liegende RNG zulässt.

Ilmari Karonen
quelle
Ah - ich hatte vergessen, dass Sie nach einer Zuordnung sortieren können.
Peter Taylor
4

Python 2.7, 253 229 215 Zeichen

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

Die meisten Charaktere sind nur die Würfel selbst. Ich wollte nicht zu viel Zeit damit verbringen, es zu reduzieren

Nebenbearbeitung: 2 unnötige Bytes entfernt (zusätzliche Leerzeichen)

edit2: runter auf 229

edit3: runter auf 215

Blazer
quelle
1
Sie können Ihren Code durch Indizierung enger machen, print a+' u'[a=='Q']undprint'\n'[j%4:]
Keith Randall
@keith danke! Ich habe es noch enger gemacht, indem ich diese beiden Tricks kombiniert habe :)
Blazer
1
Ich habe es geschafft, es auf 218 zu bringen, ohne es zu töten (glaube ich?): 1) Ändern Sie die import-Anweisung in from random import*und entfernen Sie alle r.. 2) Ändern Sie die Trennzeichen in der Zeichenfolge in `` (Leerzeichen) und nutzen Sie str.splitdas Standardargument von '. 3) Alles loswerden, was damit zu tun jund zu benutzen ist '\n'[len(d)%4:]. 4) Verwenden Sie list.popdas Standardargument von. 5) ... 6) Gewinn!
Dillon Cower
@DC ahh danke! Ich bin überrascht, dass ich sie übersehen habe. aber ich schätze, das ist es, was ich bekomme, um es in ein paar Minuten zu schreiben: P
Blazer
1
Und ich habe es mit einem kleinen Kartentrick noch weiter um 3 Zeichen reduziert, aber ich musste den behalten, j=0...+'\n'[j%4:]damit es funktioniert
Blazer
3

GolfScript ( 141 139 137 Zeichen Bytes)

Davon entfallen 94 auf die Zeichenfolge mit den Würfeln. In der Abbildung ist der unnötige Zeilenumbruch nicht enthalten, damit der Code ohne Bildlauf angezeigt werden kann:

'Y
ISY
XIAOOW
VYAAEEGNABBJOOEHRTVWCIMOTUEIOSSTACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZ'n/'TTELRD'*
6/{[6rand=99rand\]}%${1=.81='  u '2/=}%8/n*
Peter Taylor
quelle
Wenn meine (von Hand) Analyse korrekt ist, gibt es keine anderen Zeichenfolgen, die lang genug und häufig genug sind, um die Daten durch einfaches Ersetzen zu komprimieren, unabhängig von der Reihenfolge der Würfel und innerhalb der Würfel.
Peter Taylor
Ich konnte die Tabelle von 96 auf 84 Zeichen verkleinern, indem ich die Würfel verschachtelte und die Lauflängencodierung verwendete. Dekodierung, die den Unterschied ausmachen könnte ... das trifft auf Python zu.
Stand
Sie können 6 Buchstaben in 30 Bit und dann in 5 druckbaren Zeichen codieren, wodurch 16 Byte eingespart werden. Aber du brauchst eine Verschiebung / Maske, um sie zu extrahieren.
Ugoren
@ugoren, das hat Ilmari schon gemacht.
Peter Taylor
@PeterTaylor, wenn Sie sagen, dass er es getan hat, glaube ich Ihnen (ich habe nie die Mühe gemacht, Golfscript zu lernen). Aber er scheint 57 nicht druckbare Zeichen zu verwenden, während ich 80 druckbare vorschlug.
Ugoren
2

Ruby, 201 197 Zeichen

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

(und es ist ein Einzeiler)

Bearbeiten 1:% W () verwendet, um die Teilung und ein Paar Anführungszeichen zu vermeiden.

Edit 2: Angepasst (zwei Leerzeichen zwischen jeder Ausgabespalte)

Mark Thomas
quelle
Ich habe gerade die Bearbeitung dieser Antwort durch "einen anonymen Benutzer" genehmigt. Ich nehme an, dass du es warst, Mark, und du hast nur vergessen, dich einzuloggen. (Ps. Deine Ausgabe scheint nicht genau der Spezifikation zu entsprechen. Die Verwendung x.join(" ").gsub(/Q ?/,"Qu")würde das auf Kosten von drei zusätzlichen Zeichen beheben.)
Ilmari Karonen
(Das ist ein zusätzliches Leerzeichen in der joinZeichenfolge und ein zusätzliches Leerzeichen und Fragezeichen in der Regex, falls die SE-Software die Leerzeichen verstümmelt ...)
Ilmari Karonen
@IlmariKaronen Danke, ich habe die beiden Leerzeichen zwischen den Spalten nicht bemerkt. Es sollte jetzt zu spezifizieren sein.
Mark Thomas
2

Powershell, 234 Zeichen

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

Hier ist derselbe Code mit zusätzlichen Leerzeichen, um die Lesbarkeit zu verbessern :-)

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

Ich kenne keine eingebaute shuffleFunktion in Powershell und habe jedes Ergebnis in ein Schlüssel-Wert-Paar umgewandelt - den Schlüssel, der einem Würfelergebnis entspricht, und den Wert, der einer Zufallszahl entspricht. Dann war es nur ein Fall, diese Paare nach dem Wert zu sortieren und dann die Schlüssel auszugeben.

Andrew Shepherd
quelle
Vielleicht könnten Sie die letzten Ziffern der aktuellen Zeit in ms als Sortierwert verwenden?
Blazer
@ Blazer - möglicherweise, aber "zufällig" dauert nur sechs Zeichen :-)
Andrew Shepherd
0

Perl, 179 Zeichen

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

Hier ist eine ausführliche Version des Programms:

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";
}
Brot-Box
quelle