크리스마스 크래커 미스터리 계산기


25

선물이 열렸습니다. 다진 파이를 먹었습니다. 스타 워즈가 시청되었습니다. 크리스마스 시즌이 시작됩니다. 지금 당신은 몇몇 크리스마스 크래커를 잘 뽑았을 것 입니다. 운이 좋으면 평소 쓸모없는 플라스틱 장난감 대신 친구와 친척을 놀라게 할 수 있는 미스터리 계산기 를 얻었을 수도 있습니다 .

여기에 이미지 설명을 입력하십시오

이 트릭은 각각 4x8 격자 숫자가 인쇄 된 6 장의 카드로 구성됩니다. 각 카드에는 정수의 다른 하위 집합이 포함되어 있습니다 [1,63]. 마술사는 한 카드에서 숫자를 선택하고 그 숫자를 비밀로 유지하도록 요구합니다. 그러면 마술사는 어떤 카드에 해당 번호가 있는지 묻습니다. 그 지식으로 마술사는 마술 로 추측 한 원래 숫자를 결정하고 공개 할 수 있습니다.


다음과 같이 정확하게 6 개의 미스터리 계산기 카드 세트를 모두 출력하십시오.

 1  3  5  7  9 11 13 15
17 19 21 23 25 27 29 31
33 35 37 39 41 43 45 47
49 51 53 55 57 59 61 63
 - - - - - - - - - - -
 2  3  6  7 10 11 14 15
18 19 22 23 26 27 30 31
34 35 38 39 42 43 46 47
50 51 54 55 58 59 62 63
 - - - - - - - - - - -
 4  5  6  7 12 13 14 15
20 21 22 23 28 29 30 31
36 37 38 39 44 45 46 47
52 53 54 55 60 61 62 63
 - - - - - - - - - - -
 8  9 10 11 12 13 14 15
24 25 26 27 28 29 30 31
40 41 42 43 44 45 46 47
56 57 58 59 60 61 62 63
 - - - - - - - - - - -
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
 - - - - - - - - - - -
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63

출력에는 마지막 후행 줄 바꿈이 하나 포함되거나 포함되지 않을 수 있습니다. 공백이 없어야합니다. 각 카드는 11 개의 -천공으로 구분됩니다 .

  • 마지막 줄 바꿈이있는 md5sum : 7aa2d9339b810ec62a2b90c5e11d6f4a
  • 마지막 줄 바꿈이없는 md5sum : e9abe4e32dca3e8fbfdaa4886fc5efd2

더 많은 창 방향을 원한다면 CRLF스타일 선 끝을 허용 합니다. 이 경우 md5는 다음과 같습니다.

  • 마지막 줄 바꿈이있는 md5sum : e4f16ff9752eee2cedb5f97c7b5aec6d
  • 마지막 줄 바꿈이없는 md5sum : 78c560eed3b83513e3080117ab5dc5fa

2
풍선 껌 답변을 기다리고 있습니다.
Mike Bufardeci

@MikeBufardeci here- 평범한 184 바이트 .
Digital Trauma

선행 공백이 허용됩니까?
Titus

@Titus 죄송합니다. md5가 주어졌으며 추가 공백이 발생합니다.
Digital Trauma

답변:


10

파이썬 2 , 99 96 93 91 바이트

k=1
while 1:print('%2d '*7+'%2d\n')*4%tuple(n for n in range(64)if k&n),11/(k<32)*' -';k*=2

기본적으로 허용되는 오류와 함께 종료됩니다 .

온라인으로 사용해보십시오! 또는 MD5 해시를 확인하십시오 .

작동 원리

k1 로 초기화 한 후 다음 코드를 실행하는 무한 루프를 입력합니다.

print('%2d '*7+'%2d\n')*4%tuple(n for n in range(64)if k&n),11/(k<32)*' -';k*=2

tuple(n for n in range(64)if k&n)아래의 모든 음이 아닌 정수 터플 생성한다 (64) 가있다 J 번째 비트 세트, j는 루프의 반복 횟수이다, 즉, 2 , J = 케이 .

('%2d '*7+'%2d\n')*4먼저 형식 문자열 '%2d %2d %2d %2d %2d %2d %2d \n'을 만든 다음 4 번 반복합니다. 이것은 튜플의 각 정수를 공백 2 개로 채우고 각 8 개의 정수 그룹을 공백으로, 그룹 자체를 줄 바꿈으로 구분하는 각 카드의 템플릿입니다 .

자, 파이썬 2의 print진술 은 호기심 많은 짐승입니다. 쉼표로 구분 된 여러 표현식을 사용하여 하나씩 인쇄합니다. 첫 번째 표현식을 평가하고, 인쇄하고, 다음 표현식을 평가하고, 더 이상 표현식이 남아 있지 않을 때까지 인쇄합니다. 마지막 표현식 뒤에 쉼표가 없으면, 줄 바꿈이 추가됩니다. 또한 행의 시작 부분에 인쇄되지 않는 한 모든 표현식에 공백을 추가합니다.

각 반복에서 먼저 형식 문자열을 튜플에 적용한 결과를 인쇄합니다. 우리는 줄의 시작 부분에 있으므로 공간이 선행되지 않습니다.

그런 다음의 결과를 인쇄하려고 시도합니다 11/(k<32)*' -'. 만약 K <32 이 식을 평가하여 ' - - - - - - - - - - -'. 다시 말하지만, 우리는 줄의 시작 부분에 있으므로 공간이 선행되지 않습니다. 이 표현식 뒤에 쉼표가 없으므로 print줄 바꿈을 추가합니다. 그러나 6 번째 반복에서는 k = 2 5 = 32 이므로 평가하려고 11/(k<32)*' -'하면 잡히지 않는 ZeroDivisionError가 발생 합니다. 이것은 루프에서 빠져 나와 프로그램을 즉시 종료합니다.


7

C (gcc), 105 바이트

o;main(i){for(;i<384;i++%64||puts(" - - - - - - - - - - -"))i&1<<i/64&&printf("%2d%c",i%64,++o%8?32:10);}

5

파이썬 2, 132 바이트

for c in range(6):s=" ".join("%2d"%n for n in range(64)if n&1<<c);print"\n".join([s[24*i:24*i+23]for i in range(4)]+[" -"*11]*(c<5))

파이썬에서 시퀀스 분할은 성가신 일입니다.

온라인으로 사용해보십시오 .


5

젤리 , 27 26 바이트

Ts8GW
⁾ -ẋ11W
63RBUz0Ñ€j¢Y

온라인으로 사용해보십시오! 또는 MD5 해시를 확인하십시오 .

작동 원리

63RBUz0Ñ€j¢Y  Main link. No arguments.

63R           Range 63; yield [1, ..., 63].
   B          Binary; convert each integer to base 2.
    U         Upend; reverse the binary representations.
     z0       Zip with filler 0; transpose rows and columns, filling gaps in
              the (non-rectangular) matrix with zeroes.
       р     Map the first helper link over the new rows.
          ¢   Yield the return value of the second helper link.
         j    Join the left result, separating by the right result.
           Y  Join the results, separating by line feeds.

Ts8G          First helper link. Argument: A (array of 1's and 0's)
T             Truth; get all indices of 1's.
 s8           Split the indices into chunks of length 8.
   G          Grid; convert the 2D array into a string, separating row items
              by spaces, rows by linefeeds, and left-padding each integer
              with spaces to equal lengths.
    W         Wrap the generated string in an array.


⁾ -ẋ11W       Second helper link. No arguments.

⁾ -           Yield " -".
   ẋ11        Repeat the string 11 times.
      W       Wrap the generated string in an array.

2
G기본 기능은이 도전에 대해 심각하게 압도됩니다. 동일한 작업을 수행하려면 약 10 바이트가 필요했습니다.
DLosc

5

, 49 48 44 바이트

43 바이트의 코드, -S플래그의 경우 +1

Fi,6{IiP" -"X11P(sX2-#_._M2**iBA_FI,64)<>8}

온라인으로 사용해보십시오!

설명

                                             s is space (preinitialized)
Fi,6{                                     }  For i in range(6):
     Ii                                      If i is nonzero (i.e. all except 1st loop):
       P" -"X11                              Print hyphens
                                 FI,64       Range(64), filtered on this function:
                          2**iBA_              2**i bitwise AND with argument (is nonzero)
                         M                   To each remaining number, map this function:
                   2-#_                        2-len(argument)
                 sX                            ^ that many spaces
                       ._                      prepended to argument
                (                     )<>8   Group list into length-8 sublists
               P                             Print (-S flag joins on space then newline)

4

루비, 90 바이트

1.upto(383){|i|print (j=i%64)<1?' -'*11+$/:"%2d%s"%[j,j+1&15>>i/256>0?' ':$/]*(j>>i/64&1)}

언 골프

매우 간단합니다. 추가 설명이 필요할 수있는 유일한 것은 공백이 아닌 개행 문자로 숫자를 따르는 경우입니다. 이것은 j+1%16==0처음 네 카드 j+1%8에서 마지막 두 카드에서 == 0 일 때 발생합니다 . 따라서 공백 또는 개행이 필요한지 여부를 판별하기 위해 표현식 15>>i/64/4또는 이와 동등하게 15>>i/256AND됩니다 j.

1.upto(383){|i|                              #Count starting at 1 instead of 0 to supress - -  before 1st card
  print (j=i%64)<1?                          #j=number to consider for card. If 0,
    ' -'*11+$/:                              #print - - -... else print
     "%2d%s"%[j,j+1&15>>i/256>0?' ':$/]*     #j formatted to 2 spaces followed by a space (or if j+1 divisible by 16 or 8 depending on card, a newline.) 
     (j>>i/64&1)                             #only print appropriate numbers for this card, i.e. when this expression evaluates to 1
}

3

자바 스크립트 (ES6), 150 바이트

f=
_=>[1,2,4,8,16,32].map(m=>[...Array(64)].map((_,i)=>` ${i}`.slice(-2)).filter(i=>i&m).join` `.replace(/(.{23}) /g,`$1
`)).join(`
${` -`.repeat(11)}
`)
;document.write(`<pre>`+f())


2

Perl 6 ,  194116  86 바이트

put join "\n{' -'x 11}\n",map {join "\n",.[^32].rotor(8)».fmt('%2s')},(1,3...63),(2,{|($_ X+1,4)}...*),(4,{|($_ X+1,2,3,8)}...*),(8,{|((1...7,16)X+$_)}...*),(16,{|((1...15,32)X+$_)}...*),32..63

시도 해봐

for 1..383 {print !($/=$_%64)??"{' -'x 11}\n"!!$/+>($_/64)%2??$/.fmt('%2d')~(($/+1)+&(15+>($_/256))??' '!!"\n")!!''}

시도 해봐

for 1..383 {$_%64||put ' -'x 11;$_+&(1+<($_/64))&&printf "%2d%c",$_%64,++$/%8??32!!10}

시도 해봐

( MD5 결과에 대한 디버그 섹션을 확인하십시오 )
마지막 두 가지는 Ruby 및 C 구현에서 영감을 얻었습니다.


2

05AB1E , 71 바이트

63L©DÉÏ®À2ô®ÉÏ®ÀÀÀ4ô®ÉÏ®Á8ô®ÈÏ63®Á16ô®ÈÏ63D32sŸ)˜32ôvy8ôvy.B}„ -11×})¨»

온라인으로 사용해보십시오!

이 방법은 시도하지 마십시오. 솔직히 말해서 이것을 부끄러워하지 않을 것입니다. 매트릭스 조작은 나의 강력한 소송이 아니기 때문에 6 개의 시퀀스를 모두 생성 한 후 무차별 적으로 펌핑하려고했습니다.


TFW 당신은 ​​몇 년 전 ¯\ (º_o) / ¯에서 자신의 답변을 볼 수 있습니다.
매직 문어 항아리

1

배치, 249 바이트

@echo off
set s=
for %%i in (1 2 4 8 16 32)do for /l %%j in (0,1,63)do call:c %%i %%j
exit/b
:c
if %2==0 if %1 gtr 1 echo  - - - - - - - - - - -
set/an=%1^&%2
if %n%==0 exit/b
set n=  %2
set s=%s%%n:~-3%
if not "%s:~23%"=="" echo%s%&set s=

후행 CRLF를 출력합니다.


1
@DigitalTrauma 와인을 사용하는 가장 좋은 방법은 와인 ( askubuntu.com/a/54271 )을 필요로 하거나 VM ( developer.microsoft.com/en-us/microsoft-edge/tools/vms ) 을 다운로드하는 것입니다 (권장 사항) 공간을 절약하기 위해 IE8을 사용하여 Windows 7을 다운로드하거나 사용 가능한 Windows XP + IE6 VM을 사용해보십시오)
Ismael Miguel

1

자바 스크립트 (ES6) 103 102 바이트

f=(k=1,n=z=0)=>n>>6?k>>5?'':' -'.repeat(11)+`
`+f(k*2):(n&k?(n>9?'':' ')+n+`
 `[++z&7&&1]:'')+f(k,++n)

MD5 : 7AA2D9339B810EC62A2B90C5E11D6F4A

테스트


1

떠들썩한 파티 / UNIX 유틸리티 125 124 바이트

b='- - - - ';for ((x=1;x<33;x*=2));{ for n in {0..63};{ ((x&n))&&printf \ %2d $n;};echo $b$b$b;}|fold -w24|sed -e\$d -es/.//

편집 : 끝에 정규식에서 불필요한 ^를 제거했습니다. 어쨌든 정규식은 항상 줄의 시작 부분과 일치합니다.


1

PHP, 102 바이트

for(;$c<6;$n%32||$c+=print str_pad("
",25," -"),$n%2**$c||$b+=1<<$c)printf("
"[$n++%8]."%3d",++$b%64);

선행하지만 후행 줄 바꿈이없고 각 줄마다 하나의 선행 공간을 인쇄합니다. 온라인으로 실행 -nr하거나 사용해보십시오 .

PHP <5.6의 경우, 교체 2**$c와 함께 (1<<$c). PHP 5.5 &~1<<$c?:대신 사용할 수 있습니다 %2**$c||.
PHP <5.5, 교체 "\n"[$n++%8]와 함께 ($n++%8?"":"\n").


대시는 선행 공간으로 인해 하나의 문자가 사라집니다. 수정하려면 첫 번째 str_pad매개 변수에 공백을 추가 하십시오 (두 번째 코드 행 앞에 공백을 삽입하십시오).

: 선행 공백을 제거하는 대신 일부 손보는와 세 개의 추가 바이트를 필요로 printf("%c%2d",$n++%8?32:10,++$b%64);하고 23대신을 25.

선행 줄 바꿈을 후행 줄로 바꾸려면 3 바이트가 더 필요합니다.

for(;$c<6;$n%32||$c+=print str_pad("",22," -")."
",$n%2**$c||$b+=1<<$c)printf("%2d%c",++$b%64,++$n%8?32:10);

PHP, 109 바이트

for($c=1;~$c&64;$n%32||$c<<=print str_pad("",22," -")."
",$n%$c||$b+=$c)printf("%2d%c",++$b%64,++$n%8?32:10);

모든 사양과 일치하며 모든 PHP 버전에서 작동합니다.


1

파이썬 2 , 89 바이트

i=0;exec"print('%2d '*7+'%2d\\n')*4%tuple(j for j in range(64)if j&2**i)+' -'*11;i+=1;"*6

온라인으로 사용해보십시오!

설명:

# initialize outer counter variable
i=0
           # generate a formatting string for a single row of numbers
           # %2d will left pad an integer with spaces, up to string length 2
           # the \\n is so that exec will interpret it as a character rather than a literal line break
           '%2d '*7+'%2d\\n'
          # create a formatting string of 4 lines of 8 numbers
          (.................)*4
                               # format the string with a generated tuple of numbers that have a 1 in the current bit slot
                               # (or more literally, bitwise j AND 2^i is not zero)
                               %tuple(j for j in range(64)if j&2**i)
                                                                    # add the perforation break
                                                                    +' -'*11
     # print the generated string, then increment the counter
     print..................................................................;i+=1
# execute the following statements 6 times
exec"............................................................................."*6

`---`구분자를 제외하면 좋습니다. 마지막에 여분의 것이 아니라 카드 사이에만 나타나야합니다.
Digital Trauma

@DigitalTrauma Dang, 그리고 Dennis보다 작은 바이트 수를 얻는 것이 너무 자랑 스러웠습니다. 지적 해 주셔서 감사합니다.
Triggernometry

1

05AB1E , 29 바이트

63L2вíƶ0ζε0K8ô§2j»}„ -11׶.øý

@Emigna 의 05AB1E 답변 포트 여기 에이 도전의 요구 사항에 따라 인쇄하는 코드를 추가했습니다.

온라인으로 시도 하거나 md5sum을 확인 하십시오 .

설명:

63L          # Create a list in the range [1,63]
   2в        # Convert each number to binary as lists of 0s and 1s
     í       # Reverse each binary list
      ƶ      # Multiply each binary digit by its 1-based index [1,length] (so [1,63])
       0ζ    # Zip/transpose; swapping rows/columns, with "0" as filler
ε            # Map each inner list to:
 0K          #  Remove all 0s
   8ô        #  Split it into (four) lists of size 8
     §       #  Cast each integer to string (bug, shouldn't be necessary..)
      2j     #  And pad leading spaces to make each string size 2
        »    #  Join the inner lists by spaces, and then all strings by newlines
}„ -         # After the map: push string " -"
    11×      # Repeated 11 times to " - - - - - - - - - - -"
       ¶.ø   # Surround it with newlines: "\n - - - - - - - - - - -\n"
          ý  # And join the mapped strings with this delimiter-string
             # (after which the result is output implicitly)

0

JavaScript, 234 바이트

for(a=[[],[],[],[],[],[]],i=1;i<64;i++)for(j=0;j<6;j++)i&2**j?a[j].push(i<10?" "+i:i):0;for(j=0;j<6;j++){for(s=[],i=0;i<4;)s.push(a[j].slice(i*8,++i*8).join(" "));b=s.join(n="\n");a[j]=b.substr(0,b.length)};a.join(n+" -".repeat(11)+n)

나중에 설명을 쓰겠습니다.

console.log필요한 경우 바이트 수는 247 바이트입니다.


사이트에 오신 것을 환영합니다! 출력을 배열에 넣습니까? Javascript를 모르지만 변수를 통해 출력 할 수 없으므로 로깅해야합니다.
밀 마법사
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.