圣诞饼干神秘计算器


25

礼物已经打开。碎肉被吃掉了。观看了《星球大战》。圣诞节季节即将结束。到目前为止,您可能已经拉了几个圣诞饼干。如果你运气好,而不是通常的无用的塑料玩具,你可能已经赢得了神秘的计算器,使用它可以戏弄你的朋友和亲戚

在此处输入图片说明

这个技巧包括6张卡片,每张卡片上都印有一个4x8的数字网格。每个卡包含整数的不同子集[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

对于那些更多的面向Windows的人,我还将允许CRLF样式行结尾。在这种情况下,md5是:

  • md5sum和最后的换行符: e4f16ff9752eee2cedb5f97c7b5aec6d
  • 没有最终换行符的md5sum: 78c560eed3b83513e3080117ab5dc5fa

2
我只是在等待泡泡糖的答案。
Mike Bufardeci,2013年


前导空格是否可以接受?
泰特斯

@Titus抱歉,不,已提供md5,其他空格会将其弄乱。
Digital Trauma

Answers:


10

Python 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哈希值

怎么运行的

k初始化为1后,我们进入一个无限循环,该循环执行以下代码。

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具有有Ĵ 比特集,其中Ĵ是循环的迭代计数,即,2 Ĵ = K

('%2d '*7+'%2d\n')*4首先创建格式字符串'%2d %2d %2d %2d %2d %2d %2d \n',然后重复四次。这是每张卡的模板,它将元组中的每个整数填充为两个字符(前置空格),将每组8个整数按空格分开,并将组本身按换行分隔。

现在,Python 2的print声明是一个奇怪的野兽。它接受多个用逗号分隔的表达式,并一一打印。它计算第一个表达式,打印它,评估下一个表达式,打印它,等等,直到没有更多的表达式了。除非最后一个表达式后面带有逗号,否则它将在其后附加换行符。此外,它会为所有表达式加上一个空格,除非它们打印在一行的开头。

在每次迭代中,我们首先打印将格式字符串应用于元组的结果。我们在一行的开头,所以没有空格。

然后,我们(尝试)打印的结果11/(k<32)*' -'。如果k <32,则此表达式的计算结果为' - - - - - - - - - - -'。同样,我们在一行的开头,因此不加空格。该表达式后没有逗号,因此print追加换行符。但是,在第六次迭代中,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

Python 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))

在Python中拆分序列很烦人。

在线尝试


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

Ruby,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/256进行“与”操作,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

JavaScript(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的 194个116  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}

试试吧

(检查Debug部分以获得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尝试使用它的最佳方法实际上需要Wine(askubuntu.com/a/54271)或您下载VM(developer.microsoft.com/en-us/microsoft-edge/tools/vms)(建议您使用下载带有IE8的Windows 7,以节省空间。或者尝试使用以前可用的Windows XP + IE6 VM)
Ismael Miguel

1

的JavaScript(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

bash / 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

将领先的换行符转换为结尾的换行符将花费另外三个字节:

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

Python 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少的字节数。谢谢您指出!
触发测量

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,但这将要求您登录,因为您无法通过变量输出。
小麦巫师
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.