สร้างบอร์ดเกรงกลัวสุ่ม


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 K เท่านั้นในชุด มีจดหมายอะไรอีกที่บอกว่าตายโดยเฉพาะ

นี่คือเพื่อให้โปรแกรมที่มีจำนวนไบต์สั้นที่สุดชนะ!


3
มี F ไม่ได้ถ้ามีของ K หมายความว่าคุณไม่สามารถสะกด f ... iretruck! : P
Blazer

@Blazer: ใช่แล้วคุณไม่สามารถสะกด f ... olk ได้เช่นกัน : P
Ry-

คำตอบ:


5

GolfScript, 116 ไบต์

เนื่องจากการให้คะแนนมีหน่วยเป็นไบต์ฉันคิดว่าหมายความว่าเราสามารถใช้ไบต์ทั้งหมดในโซลูชันได้ การออกไปข้างนอกชุด ASCII ที่พิมพ์ได้ช่วยให้มีวิธีแก้ปัญหาที่ค่อนข้างสั้นกว่าของPeter Taylorโดยค่าใช้จ่ายในการแสดงรหัสจะยากขึ้นที่นี่ หากไม่มีข้อมูลที่ไม่สามารถพิมพ์ได้รหัสของฉันจะเป็นดังนี้:

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

มันค่อนข้างคล้ายกับวิธีแก้ปัญหาของ Peter Taylor และฉันยอมรับว่าจะยืมบิตของมัน (เช่น.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ยูทิลิตี้การติดตั้ง, การถ่ายโอนข้อมูลฐานสิบหกนี้สามารถเปิดกลับเข้าสู่การทำงานโปรแกรม GolfScript 116 xxd -rไบต์โดยผ่านมันผ่าน

แก้ไข:แทนที่999randด้วย9.?randสำหรับมากสุ่มที่ดีกว่า การสลับเพลงควรจะใกล้เคียงกับความสมบูรณ์แบบที่สุดเท่าที่ RNG พื้นฐานอนุญาต


อ่า - ฉันลืมไปแล้วว่าคุณสามารถจัดเรียงแผนที่
Peter Taylor

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 ไบต์ที่ไม่จำเป็นออก (ช่องว่างเพิ่มเติม)

แก้ไข 2: ลงไปที่ 229

แก้ไข 3: ลงไป 215


1
คุณสามารถทำให้โค้ดของคุณแน่นขึ้นด้วยการจัดทำดัชนีprint a+' u'[a=='Q']และprint'\n'[j%4:]
Keith Randall

@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:]มันใช้งานได้
Blazer

3

GolfScript ( 141 139 137 ตัวอักษรไบต์)

ซึ่ง 94 ขยายไปยังสายอักขระที่ประกอบด้วยลูกเต๋า รูปภาพไม่รวมการขึ้นบรรทัดใหม่ที่ไม่จำเป็นเพื่อทำให้มันห่อเพื่อให้สามารถมองเห็นโค้ดได้โดยไม่ต้องเลื่อน:

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

หากการวิเคราะห์ของฉัน (ด้วยมือ) ถูกต้องไม่มีสตริงอื่นใดที่มีความยาวเพียงพอและบ่อยเพียงพอที่จะบีบอัดข้อมูลโดยการแทนที่อย่างง่ายโดยไม่คำนึงถึงลำดับของลูกเต๋าและภายในลูกเต๋า
Peter Taylor

ฉันสามารถลดตารางจาก 96 เป็น 84 ตัวละครโดยการผสมผสานลูกเต๋าและใช้การเข้ารหัสความยาวของการวิ่ง การถอดรหัสที่อาจทำให้เกิดความแตกต่าง ... มันแน่นอนสำหรับงูหลาม
บูธโดย

คุณสามารถเข้ารหัส 6 ตัวอักษรใน 30 บิตจากนั้นใน 5 ตัวอักษรที่พิมพ์ได้ประหยัด 16 ไบต์ แต่คุณจะต้องกะ / หน้ากากเพื่อแยกพวกมัน
ugoren

@ugoren, Ilmari ทำเช่นนั้นแล้ว
Peter Taylor

@PeterTaylor ถ้าคุณบอกว่าเขาทำฉันเชื่อว่าคุณ (ฉันไม่เคยใส่ใจที่จะเรียนรู้ Golfscript) แต่ดูเหมือนว่าเขาจะใช้อักขระที่ไม่สามารถพิมพ์ได้ 57 ตัวในขณะที่ฉันแนะนำให้พิมพ์ได้ 80 ตัว
ugoren

2

Ruby, 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")จะแก้ไขได้ที่ค่าใช้จ่ายพิเศษสามตัวอักษร.)
Ilmari Karonen

(นั่นคือหนึ่งในช่องว่างพิเศษในjoinสายอักขระและเครื่องหมายเว้นวรรคและเครื่องหมายคำถามใน regex ในกรณีที่ซอฟต์แวร์ 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 ดังนั้นฉันจึงเปลี่ยนผลลัพธ์เป็นคู่ของคีย์ - ค่า - คีย์เท่ากับผลลูกเต๋าและค่าเท่ากับตัวเลขสุ่ม จากนั้นเป็นเพียงกรณีของการเรียงลำดับคู่เหล่านี้ด้วยค่าจากนั้นส่งออกคีย์


บางทีคุณอาจใช้ตัวเลขสุดท้ายในเวลาปัจจุบันเป็น ms เป็นค่าการเรียงลำดับ
Blazer

@Blazer - อาจเป็นไปได้ แต่ "สุ่ม" ใช้เวลาเพียงหกตัวอักษร :-)
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

นี่เป็นโปรแกรม verbose เวอร์ชัน:

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";
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.