Máy tính bí ẩn Giáng sinh


25

Những món quà đã được mở. Những chiếc bánh thịt băm đã được ăn. Chiến tranh giữa các vì sao đã được theo dõi. Mùa Giáng sinh đang bắt đầu xuống. Bây giờ bạn có thể đã kéo một vài Crackers Giáng sinh . Nếu bạn may mắn, thay vì những đồ chơi bằng nhựa vô dụng thông thường, bạn có thể đã giành được Máy tính bí ẩn mà bạn có thể làm bạn bè và người thân ngạc nhiên .

nhập mô tả hình ảnh ở đây

Thủ thuật này bao gồm 6 thẻ mỗi thẻ có lưới số 4x8 được in trên đó. Mỗi thẻ chứa một tập hợp con khác nhau của các số nguyên [1,63]. Ảo thuật gia sẽ yêu cầu bạn chọn một số từ một thẻ và giữ bí mật số đó. Nhà ảo thuật sau đó sẽ hỏi thẻ nào có số đó. Với kiến thức đó, nhà ảo thuật sẽ kỳ diệu có thể xác định và công bố số lượng ban đầu đoán.


Xuất ra bộ đầy đủ 6 thẻ Máy tính bí ẩn chính xác như sau:

 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

Đầu ra có thể có hoặc không chứa một dòng mới cuối cùng. Không được có khoảng trắng ở cuối. Mỗi thẻ được phân tách bằng 11 -lỗ.

  • md5sum với dòng mới cuối cùng: 7aa2d9339b810ec62a2b90c5e11d6f4a
  • md5sum không có dòng mới: e9abe4e32dca3e8fbfdaa4886fc5efd2

Đối với những bạn có nhiều hướng của cửa sổ, tôi cũng sẽ cho phép CRLFkết thúc dòng kiểu. Trong trường hợp đó, md5s là:

  • md5sum với dòng mới cuối cùng: e4f16ff9752eee2cedb5f97c7b5aec6d
  • md5sum không có dòng mới: 78c560eed3b83513e3080117ab5dc5fa

2
Tôi chỉ đang chờ câu trả lời của bubblegum.
Mike Bufardeci


Là không gian hàng đầu được chấp nhận?
Tít

@Titus Xin lỗi, không, md5 đã được cung cấp và khoảng trắng bổ sung sẽ làm rối tung chúng.
Chấn thương kỹ thuật số

Câu trả lời:


10

Python 2 , 99 96 93 91 byte

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

Thoát với một lỗi, được cho phép theo mặc định .

Hãy thử trực tuyến! hoặc xác minh hàm băm MD5 .

Làm thế nào nó hoạt động

Sau khi khởi tạo k1 , chúng ta nhập một vòng lặp vô hạn thực thi đoạn mã sau.

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)tạo ra một bộ gồm tất cả các số nguyên không âm dưới 64 có tập bit thứ j , trong đó j là số lần lặp của vòng lặp, tức là, 2 j = k .

('%2d '*7+'%2d\n')*4đầu tiên tạo chuỗi định dạng '%2d %2d %2d %2d %2d %2d %2d \n', sau đó lặp lại bốn lần. Đây là một mẫu cho mỗi thẻ, đệm mỗi số nguyên trong bộ dữ liệu thành hai ký tự (khoảng trắng chuẩn bị trước), phân tách mỗi nhóm 8 số nguyên theo khoảng trắng và chính các nhóm theo nguồn cấp dữ liệu.

Bây giờ, tuyên bố của Python 2print là một con thú tò mò. Phải mất một vài biểu thức, được phân tách bằng dấu phẩy và in từng cái một. Nó đánh giá biểu thức đầu tiên, in nó, đánh giá các biểu thức tiếp theo, in nó, vv cho đến khi không còn biểu thức nào nữa. Trừ khi biểu thức cuối cùng được theo sau bởi dấu phẩy, nó sẽ nối thêm một dòng cho nó. Ngoài ra, nó chuẩn bị một khoảng trắng cho tất cả các biểu thức, trừ khi chúng được in ở đầu dòng.

Trong mỗi lần lặp, trước tiên chúng tôi in kết quả của việc áp dụng chuỗi định dạng cho bộ dữ liệu. Chúng tôi đang ở đầu của một dòng, vì vậy không có không gian được chuẩn bị trước.

Sau đó, chúng tôi (cố gắng) in kết quả của 11/(k<32)*' -'. Nếu k <32 , biểu thức này ước tính thành ' - - - - - - - - - - -'. Một lần nữa, chúng tôi ở đầu một dòng, vì vậy không có không gian nào được chuẩn bị trước. Không có dấu phẩy sau biểu thức này, vì vậy hãy printthêm một nguồn cấp dữ liệu. Tuy nhiên, trong lần lặp thứ sáu, k = 2 5 = 32 , do đó, việc cố gắng đánh giá 11/(k<32)*' -'sẽ làm tăng ZeroDivisionError . Điều này thoát ra khỏi vòng lặp và kết thúc chương trình ngay lập tức.


7

C (gcc), 105 byte

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 byte

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

Việc tách chuỗi là khó chịu trong Python.

Hãy thử trực tuyến .


5

Thạch , 27 26 byte

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

Hãy thử trực tuyến! hoặc xác minh hàm băm MD5 .

Làm thế nào nó hoạt động

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
Nội dung đó Gbị áp đảo nghiêm trọng cho thử thách này. Tôi cần khoảng 10 byte để làm như vậy.
DLosc

5

Pip , 49 48 44 byte

43 byte mã, +1 cho -Scờ.

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

Hãy thử trực tuyến!

Giải trình

                                             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 byte

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

Bị đánh cắp

Khá đơn giản. Điều duy nhất có thể yêu cầu giải thích bổ sung là khi nào nên theo dõi một số với một dòng mới thay vì một khoảng trắng. Điều này xảy ra khi j+1%16==0trong bốn thẻ đầu tiên và j+1%8== 0 trong hai thẻ cuối. Do đó, biểu thức 15>>i/64/4hoặc tương đương 15>>i/256được ANDed với jđể xác định xem không gian hoặc dòng mới là bắt buộc.

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 byte

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 byte

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

Thử nó

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

Thử nó

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

Thử nó

(kiểm tra các phần Gỡ lỗi để biết kết quả MD5)
Hai phần cuối được lấy cảm hứng / phiên âm từ các triển khai của Ruby và C


2

05AB1E , 71 byte

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

Hãy thử trực tuyến!

Cách tiếp cận này, đừng thử nó. Có khả năng sẽ xóa điều này ra khỏi sự xấu hổ để thành thật. Thao tác ma trận không phải là phù hợp mạnh mẽ của tôi, vì vậy tôi đã cố gắng vũ phu tạo ra tất cả 6 chuỗi và sau đó bơm chúng lại với nhau một cách chậm chạp.


TFW bạn thấy câu trả lời của riêng bạn từ nhiều năm trước (º_o) /.
Bạch tuộc ma thuật Urn

1

Mẻ, 249 byte

@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=

Xuất ra một CRLF trailing.


1
@DigitalTrauma Các cách tốt nhất để dùng thử thực sự cần có Wine ( askubfox.com/a/54271 ) hoặc bạn tải xuống VM ( developer.microsoft.com/en-us/microsoft-edge/tools/vms ) (Tôi khuyên bạn nên tải xuống Windows 7 với IE8, để tiết kiệm dung lượng. Hoặc thử sử dụng máy ảo Windows XP + IE6 đã có sẵn)
Ismael Miguel

1

JavaScript (ES6), 103 102 byte

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

Kiểm tra


1

tiện ích bash / Unix, 125 124 byte

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

Chỉnh sửa: Đã xóa một ^ không cần thiết khỏi regex ở cuối; regex sẽ luôn luôn khớp ở đầu dòng.


1

PHP, 102 byte

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

in một dòng mới hàng đầu nhưng không có dấu, và một không gian hàng đầu trong mỗi dòng. Chạy với -nrhoặc thử trực tuyến .

Đối với PHP <5.6, thay thế 2**$cbằng (1<<$c). PHP 5.5 có thể sử dụng &~1<<$c?:thay vì %2**$c||.
Đối với PHP <5.5, thay thế "\n"[$n++%8]bằng($n++%8?"":"\n") .


Dấu gạch ngang là một ký tự do không gian hàng đầu; nối thêm một khoảng trắngstr_pad tham số (chèn khoảng trắng trước dòng mã thứ hai) để sửa.

Thay vào đó, việc xóa không gian hàng đầu đòi hỏi một số lỗi và ba byte bổ sung: printf("%c%2d",$n++%8?32:10,++$b%64);23 thay vào đó 25.

Biến dòng mới hàng đầu thành một dòng cuối sẽ tốn thêm ba byte:

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 byte

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

phù hợp với tất cả các thông số kỹ thuật và hoạt động với tất cả các phiên bản PHP.


1

Python 2 , 89 byte

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

Hãy thử trực tuyến!

Giải trình:

# 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

Tốt, ngoại trừ dấu phân cách `- - -` chỉ nên xuất hiện giữa các thẻ và không có thêm một dấu ở cuối.
Chấn thương kỹ thuật số

@DigitalTrauma Dang, và tôi cũng thấy RẤT NHIỀU khi nhận được một số lượng nhỏ hơn so với Dennis. Cảm ơn đã chỉ ra, tho!
Triggernometry

1

05AB1E , 29 byte

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

Cổng từ @Emigna 05AB1E câu trả lời 's đây , sau đó tôi đã thêm mã bổ sung để in nó theo các yêu cầu trong thử thách này.

Dùng thử trực tuyến hoặc xác minh md5sum .

Giải trình:

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 byte.

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)

Tôi sẽ viết giải thích sau.

Nếu console.logđược yêu cầu, số byte sẽ là 247 byte.


Chào mừng đến với trang web! Bạn đang đặt đầu ra của bạn trong một mảng? Tôi không biết Javascript nhưng điều đó sẽ yêu cầu bạn đăng nhập vì bạn không thể xuất qua một biến.
Thuật sĩ lúa mì
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.