랜덤 보글 보드 생성


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

재미있는 사실 : 세트에는 1K 만 있습니다. 어떤 다른 서한이 그 죽을 독점적으로 공유합니까?

이것은 이므로 가장 짧은 바이트 수를 가진 프로그램이 승리합니다!


3
K가 있으면 F가 될 수 없습니다. 이것은 당신이 철자를 철자 할 수 없다는 것을 의미합니다! : P
Blazer

@Blazer : 네, 그리고 당신도 철자를 쓸 수 없습니다. : P
Ry-

답변:


5

GolfScript, 116 바이트

점수는 바이트 단위이므로 솔루션에서 모든 바이트를 사용할 수 있음을 나타냅니다 . 인쇄 가능한 ASCII 세트를 벗어나면 Peter Taylor 's 보다 약간 더 짧은 솔루션을 사용할 수 있지만 여기에 코드를 표시하기가 더 어렵습니다. 인쇄 할 수없는 데이터가 없으면 내 코드는 다음과 같습니다.

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

그것은 Peter Taylor의 솔루션과 매우 유사하며 .81=' u '2/=, 더 나은 무작위성을 위해 여분의 char 바이트를 사용한 후에도 약간의 셔플을 약간 단축 할 수 있다고 생각하지만, 그 트릭 과 같은 약간의 수치를 빌려주는 것을 인정 합니다.

스크립트 시작 부분의 이진 문자열에는 인쇄 할 수없는 문자가 포함되어 있으므로 여기에 직접 붙여 넣을 수 없습니다. 대신 스크립트를 16 진수 덤프로 제공합니다.

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유틸리티가 설치된 시스템 에서이 16 진수 덤프는 116 바이트 GolfScript 프로그램을 통해 전달하여 다시 작동시킬 수 있습니다 xxd -r.

편집 : 대체 999rand9.?rand대한 훨씬 더 나은 임의성. 셔플은 이제 기본 RNG가 허용하는 한 완벽에 가깝습니다.


아-당신은 매핑으로 정렬 할 수 있다는 것을 잊었습니다.
피터 테일러

4

파이썬 2.7, 253229215 문자

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까지

edit3 : 215까지


1
당신은 색인과 코드가 엄격하게, 수 print a+' u'[a=='Q']print'\n'[j%4:]
키스 랜달

@keith 감사합니다! 나는 그 두 가지 트릭 : 결합하여 더욱 엄격하게
자켓

1
나는 그것을 죽이지 않고 218로 떨어 뜨 렸습니다 (제 생각에?) : 1) import 문을 변경하고 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*

내 (손으로) 분석이 정확하면 주사위의 순서와 주사위 내에서 간단한 교체로 데이터를 압축하기에 충분히 길고 빈번한 문자열이 없습니다.
피터 테일러

주사위를 인터리브하고 실행 길이 인코딩을 사용하여 테이블을 96에서 84 자로 줄였습니다. 차이를 구성 할 수있는 디코딩은 확실히 파이썬에 해당합니다.
boothby

6 개의 문자를 30 비트로 인코딩 한 다음 5 개의 인쇄 가능한 문자로 인코딩하여 16 바이트를 절약 할 수 있습니다. 그러나 추출하려면 시프트 / 마스크가 필요합니다.
ugoren

@ugoren, Ilmari는 이미 그렇게했습니다.
피터 테일러

@PeterTaylor, 당신이 그가 말한 경우, 나는 당신을 믿습니다 (나는 Golfscript를 배우고 싶지 않았습니다). 그러나 그는 인쇄 할 수없는 57 개의 문자를 사용하는 것 같지만 인쇄 가능한 80 개를 제안했습니다.
ugoren

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 : .split과 따옴표 쌍을 피하기 위해 % W ()를 사용했습니다.

편집 2 : 사양에 맞게 (각 출력 열 사이에 2 개의 공백)


방금 "익명 사용자"가이 답변에 대한 수정을 승인했습니다. 나는 그 마크를했다 가정하고 당신은 단지에 로그인하는 것을 잊었다 (시 당신 출력 사양에 정확히 될 것 같지 않습니다. 사용. x.join(" ").gsub(/Q ?/,"Qu"). 해결하는 것 그 세 가지 여분의 문자의 비용)
Ilmari 카로 넨

( joinSE 소프트웨어가 공백을
엉망으로 만드는

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

shufflepowershell 의 내장 기능을 알지 못 하므로 각 결과를 키-값 쌍으로 바 꾸었습니다. 키는 주사위 결과와 같고 값은 난수와 같습니다. 그런 다음이 쌍을 값으로 정렬 한 다음 키를 출력하는 경우 일뿐입니다.


어쩌면 현재 시간의 마지막 숫자를 정렬 값으로 ms 단위로 사용할 수 있습니까?
Blazer

@Blazer은 - 아마도,하지만 "랜덤"은 6 자 :-) 소요
앤드류 목사

0

펄, 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";
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.