Tạo bảng ngẫu nhiên ngẫu nhiên


16

Tạo lưới 4x12 chữ cái / dấu cách:

Mỗi chết sẽ xuất hiện chính xác một lần, vị trí được chọn ngẫu nhiên. Vị trí phải gần đúng một hoán vị ngẫu nhiên thống nhất của súc sắc. Hiển thị một khuôn mặt ngẫu nhiên (một lần nữa, xấp xỉ đồng đều) của mỗi khuôn. Còn lại khuôn mặt trong cửa sổ 3 ký tự. Ví dụ,

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

Là một bảng không ngẫu nhiên trong định dạng tôi muốn. Không gian lưu trữ được cho phép.

Xúc xắc:

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

Thực tế thú vị: chỉ có 1 K trong bộ. Những lá thư khác độc quyền chia sẻ mà chết?

Đây là vì vậy chương trình nào có số lần thắng ngắn nhất!


3
không thể có F nếu có K. điều này có nghĩa là bạn không thể đánh vần ... iretruck! : P
Blazer

@Blazer: Vâng, và bạn cũng không thể đánh vần ... : P
Ry-

Câu trả lời:


5

GolfScript, 116 byte

Vì việc tính điểm được tính bằng byte, tôi cho rằng điều đó có nghĩa là chúng ta có thể sử dụng tất cả các byte trong giải pháp. Đi ra ngoài bộ ASCII có thể in cho phép một giải pháp ngắn hơn một chút so với Peter Taylor , với chi phí làm cho mã khó hiển thị hơn ở đây. Không có dữ liệu không thể in, mã của tôi trông như thế này:

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

Nó khá giống với giải pháp của Peter Taylor, và tôi thừa nhận đã mượn các bit của nó một cách đáng xấu hổ (chẳng hạn như .81=' u '2/=mánh khóe), mặc dù tôi nghĩ rằng tôi đã xoay sở để rút ngắn shuffle của mình một chút, ngay cả sau khi chi thêm một byte char để có sự ngẫu nhiên tốt hơn.

Chuỗi nhị phân ở phần đầu của tập lệnh chứa các ký tự không thể in được và do đó không thể dán trực tiếp vào đây. Thay vào đó, tôi sẽ cung cấp tập lệnh dưới dạng kết xuất hex:

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*

Trên Linux, hoặc bất kỳ hệ thống nào xxdđược cài đặt tiện ích, kết xuất hex này có thể được chuyển trở lại thành chương trình GolfScript 116 byte đang hoạt động bằng cách chuyển qua xxd -r.

Chỉnh sửa: Thay thế 999randbằng 9.?randcho ngẫu nhiên tốt hơn nhiều . Shuffle bây giờ sẽ gần hoàn hảo như RNG cơ bản cho phép.


À - tôi quên rằng bạn có thể sắp xếp theo bản đồ.
Peter Taylor

4

Python 2.7, 253 229 215 ký tự

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

Hầu hết các nhân vật chỉ là con xúc xắc. Tôi không muốn mất quá nhiều thời gian để cố gắng giảm quá nhiều

chỉnh sửa nhỏ: loại bỏ 2 byte không cần thiết (khoảng trắng thừa)

chỉnh sửa2: xuống 229

chỉnh sửa 3: xuống còn 215


1
bạn có thể làm cho mã của mình chặt chẽ hơn bằng cách lập chỉ mục print a+' u'[a=='Q']print'\n'[j%4:]
Keith Randall

@ xin cảm ơn! Tôi đã làm cho nó chặt chẽ hơn bằng cách kết hợp hai thủ thuật đó :)
Blazer

1
Tôi đã cố gắng giảm xuống còn 218 mà không giết nó (tôi nghĩ vậy?): 1) Thay đổi câu lệnh nhập thành from random import*và xóa tất cả r.. 2) Thay đổi các dấu phân cách trong chuỗi thành `` (dấu cách) và tận dụng str.splitđối số mặc định của. 3) Loại bỏ bất cứ điều gì để làm jvà sử dụng '\n'[len(d)%4:]. 4) Sử dụng list.popđối số mặc định. 5) ... 6) Lợi nhuận!
Dillon Cower

@DC ahh cảm ơn! Tôi ngạc nhiên khi tôi bỏ qua chúng. nhưng tôi đoán đó là những gì tôi nhận được khi viết nó trong vài phút: P
Blazer

1
Và tôi đã giảm được thậm chí nhiều hơn 3 ký tự bằng cách sử dụng một mẹo nhỏ trên bản đồ, nhưng tôi phải giữ j=0...+'\n'[j%4:]cho nó hoạt động
Blazer

3

GolfScript ( 141 139 137 byte ký tự )

Trong đó 94 mở rộng thành chuỗi chứa xúc xắc. Hình không bao gồm dòng mới không cần thiết được chèn để làm cho nó được bọc để có thể nhìn thấy mã mà không cần cuộn:

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

Nếu phân tích (bằng tay) của tôi là chính xác thì sẽ không có bất kỳ chuỗi nào khác đủ dài và thường xuyên đủ để nén dữ liệu bằng cách thay thế đơn giản, bất kể việc đặt xúc xắc và trong súc sắc.
Peter Taylor

Tôi đã có thể giảm bảng từ 96 xuống còn 84 ký tự bằng cách xen kẽ xúc xắc và sử dụng mã hóa độ dài chạy. Giải mã có thể tạo ra sự khác biệt ... nó chắc chắn làm cho python.
gian hàng

Bạn có thể mã hóa 6 chữ cái trong 30 bit, sau đó trong 5 ký tự có thể in, tiết kiệm 16 byte. Nhưng bạn sẽ cần một số ca / ​​mặt nạ để giải nén chúng.
ugoren

@ugoren, Ilmari đã làm điều đó.
Peter Taylor

@PeterTaylor, nếu bạn nói anh ấy đã làm, tôi tin bạn (tôi không bao giờ bận tâm đến việc học Golfscript). Nhưng anh ta dường như đang sử dụng 57 ký tự không thể in được, trong khi tôi đề nghị 80 có thể in được.
ugoren

2

Ruby, 201 197 ký tự

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

(và đó là một lớp lót)

Chỉnh sửa 1: Được sử dụng% W () để tránh .split và một cặp dấu ngoặc kép.

Chỉnh sửa 2: Làm cho nó thành spec (hai khoảng trắng giữa mỗi cột đầu ra)


Tôi vừa phê duyệt một chỉnh sửa của "một người dùng ẩn danh" cho câu trả lời này; Tôi cho rằng là bạn, Mark, và bạn chỉ cần quên để đăng nhập (Ps Bạn ra dường như không được chính xác spec;. Sử dụng. x.join(" ").gsub(/Q ?/,"Qu"). Sẽ khắc phục điều đó với chi phí của ba ký tự thêm)
Ilmari Karonen

(Đó là thêm một joinkhoảng trắng trong chuỗi và thêm một khoảng trắng và dấu hỏi trong regex, trong trường hợp phần mềm SE xáo trộn các khoảng trắng ...)
Ilmari Karonen

@IlmariKaronen Cảm ơn, tôi đã không nhận thấy hai khoảng trắng giữa các cột. Nó nên là để spec bây giờ.
Mark Thomas

2

Powershell, 234 ký tự

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

Đây là cùng một mã với khoảng trắng bổ sung, trong nỗ lực cải thiện khả năng đọc :-)

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

Tôi không biết về một shuffletính năng tích hợp trong powershell, vì vậy tôi đã biến mỗi kết quả thành một cặp giá trị khóa - khóa bằng với kết quả xúc xắc và giá trị bằng một số ngẫu nhiên. Sau đó, nó chỉ là một trường hợp sắp xếp các cặp này theo giá trị sau đó xuất ra các khóa.


có lẽ bạn có thể sử dụng các chữ số cuối cùng trong thời gian hiện tại tính bằng ms làm giá trị sắp xếp?
Blazer

@Blazer - có thể, nhưng "ngẫu nhiên" chỉ mất sáu ký tự :-)
Andrew Shepherd

0

Perl, 179 ký tự

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

Đây là phiên bản dài dòng của chương trình:

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";
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.