เครื่องคิดเลขปริศนาคริสต์มาสแครกเกอร์


25

เปิดของขวัญแล้ว พายสับได้ถูกกินแล้ว The Star Wars ได้รับการชม เทศกาลคริสต์มาสเริ่มจะสงบลงแล้ว ถึงตอนนี้คุณอาจดึงแครกเกอร์คริสต์มาสสองสามตัว ถ้าคุณโชคดีแทนของของเล่นพลาสติกปกติไร้ประโยชน์ที่คุณอาจจะได้รับรางวัลลึกลับคำนวณที่คุณสามารถแปลกใจที่เพื่อนและญาติของคุณ

ป้อนคำอธิบายรูปภาพที่นี่

เคล็ดลับนี้ประกอบด้วยไพ่ 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 พร้อมกับ newline สุดท้าย: 7aa2d9339b810ec62a2b90c5e11d6f4a
  • md5sum โดยไม่ขึ้นบรรทัดใหม่ขั้นสุดท้าย: e9abe4e32dca3e8fbfdaa4886fc5efd2

สำหรับผู้ที่ต้องการวางแนวหน้าต่างมากกว่านี้ฉันจะอนุญาตให้CRLFสิ้นสุดบรรทัดสไตล์ ในกรณีนั้น md5s คือ:

  • md5sum พร้อมกับ newline สุดท้าย: e4f16ff9752eee2cedb5f97c7b5aec6d
  • md5sum โดยไม่ขึ้นบรรทัดใหม่ขั้นสุดท้าย: 78c560eed3b83513e3080117ab5dc5fa

2
ฉันแค่รอคำตอบทาสี
Mike Bufardeci


ช่องว่างชั้นนำยอมรับได้หรือไม่
ติตัส

@Titus ขออภัยไม่ได้รับ md5s และช่องว่างเพิ่มเติมจะทำให้ผู้อ่านสับสน
Digital Trauma

คำตอบ:


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)สร้าง tuple ทุก integers เชิงลบด้านล่าง64ที่มีมีเจTHบิตชุดที่เจคือการนับซ้ำของวงคือ2 J = k

('%2d '*7+'%2d\n')*4ก่อนอื่นให้สร้างสตริงรูปแบบ'%2d %2d %2d %2d %2d %2d %2d \n'จากนั้นทำซ้ำสี่ครั้ง นี่คือเทมเพลตสำหรับการ์ดแต่ละใบซึ่งรองแต่ละจำนวนเต็มใน tuple ถึงสองตัวอักษร (ช่องว่างที่เตรียมไว้) แยกแต่ละกลุ่มของจำนวนเต็ม8จำนวนโดยช่องว่างและกลุ่มตัวเองโดย linefeeds

ตอนนี้คำแถลงของ Python 2printเป็นสัตว์ประหลาด ใช้หลายนิพจน์คั่นด้วยคอมมาและพิมพ์ทีละตัว มันประเมินนิพจน์แรกพิมพ์มันประเมินนิพจน์ถัดไปพิมพ์มัน ฯลฯ จนกว่าจะไม่มีนิพจน์เหลืออยู่ เว้นเสียแต่ว่านิพจน์สุดท้ายจะตามด้วยเครื่องหมายจุลภาคมันจะเพิ่ม linefeed เข้าไป นอกจากนี้ยังเป็นการเพิ่มพื้นที่ให้กับนิพจน์ทั้งหมดยกเว้นว่าจะถูกพิมพ์ที่จุดเริ่มต้นของบรรทัด

ในการวนซ้ำแต่ละครั้งแรกเราพิมพ์ผลลัพธ์ของการใช้สตริงรูปแบบกับ tuple เราอยู่ที่จุดเริ่มต้นของบรรทัดดังนั้นจึงไม่มีช่องว่างเตรียมไว้

จากนั้นเราจะ (พยายาม) 11/(k<32)*' -'พิมพ์ผลของ ถ้าk <32นิพจน์นี้หาค่า' - - - - - - - - - - -'ได้ อีกครั้งเราอยู่ที่จุดเริ่มต้นของบรรทัดดังนั้นจึงไม่มีการเว้นวรรค ไม่มีเครื่องหมายจุลภาคหลังนิพจน์นี้ดังนั้นprintผนวก linefeed อย่างไรก็ตามในการทำซ้ำครั้งที่หกk = 2 5 = 32ดังนั้นการพยายามประเมิน11/(k<32)*' -'ทำให้เกิดZeroDivisionError ที่ไม่ถูกตรวจจับ สิ่งนี้จะแยกออกจากลูปและจบโปรแกรมทันที



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
นั่นGbuiltin จะสู้อย่างจริงจังสำหรับความท้าทายนี้ ฉันต้องการประมาณ 10 ไบต์เพื่อทำเช่นเดียวกัน
DLosc

5

Pip , 49 48 44 ไบต์

43 ไบต์ของรหัส +1 สำหรับการ-Sตั้งค่าสถานะ

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

Ungolfed

ค่อนข้างตรงไปตรงมา สิ่งเดียวที่อาจต้องการคำอธิบายเพิ่มเติมคือเมื่อต้องติดตามหมายเลขด้วยการขึ้นบรรทัดใหม่แทนที่จะเว้นวรรค สิ่งนี้จะเกิดขึ้นเมื่อj+1%16==0อยู่ในไพ่สี่ใบแรกและj+1%8== 0 ในไพ่สองใบสุดท้าย ดังนั้นการแสดงออก15>>i/64/4หรือเทียบเท่า15>>i/256คือ ANDed ด้วย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
}


2

Perl 6 ,  194 116  86 bytes

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) / ¯
Magic Octopus Urn

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 ) (ฉันขอแนะนำให้คุณ ดาวน์โหลด Windows 7 ด้วย IE8 เพื่อประหยัดเนื้อที่หรือลองใช้มือของคุณกับ 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/.//

แก้ไข: ลบ ^ ที่ไม่จำเป็นออกจาก regex ในตอนท้าย; regex จะจับคู่ที่จุดเริ่มต้นของบรรทัดเสมอ


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 ของที่นี่หลังจากที่ฉันเพิ่มรหัสเพิ่มเติมในการพิมพ์ตามความต้องการในการท้าทายนี้

ลองออนไลน์หรือตรวจสอบ md5summd5sum

คำอธิบาย:

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.