Natal Misteri Kalkulator Kalkulator

25

Hadiah telah dibuka. Kue pai telah dimakan. Star Wars telah ditonton. Musim Natal mulai reda. Sekarang Anda mungkin telah menarik beberapa Kerupuk Natal . Jika Anda beruntung, alih-alih mainan plastik biasa yang tidak berguna, Anda mungkin telah memenangkan Kalkulator Misteri yang dengannya Anda dapat memukau teman dan kerabat Anda .

masukkan deskripsi gambar di sini

Trik ini terdiri dari 6 kartu masing-masing dengan kotak angka 4x8 dicetak di atasnya. Setiap kartu berisi subset integer yang berbeda [1,63]. Pesulap akan meminta Anda untuk memilih nomor dari satu kartu dan merahasiakan nomor itu. Pesulap kemudian akan bertanya kartu mana yang memiliki nomor itu. Dengan pengetahuan itu, pesulap akan secara ajaib dapat menentukan dan mengungkapkan nomor asli yang ditebak.


Keluarkan set lengkap 6 kartu Kalkulator Misteri persis seperti berikut:

 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

Keluaran mungkin mengandung atau mungkin tidak mengandung satu baris akhir baru. Tidak boleh ada spasi spasi tambahan. Setiap kartu dipisahkan oleh 11 -perforasi.

  • md5sum dengan baris terakhir: 7aa2d9339b810ec62a2b90c5e11d6f4a
  • md5sum tanpa baris baru final: e9abe4e32dca3e8fbfdaa4886fc5efd2

Bagi Anda yang lebih dari orientasi windows, saya juga akan membiarkan CRLFujung garis gaya. Dalam hal ini, md5s adalah:

  • md5sum dengan baris terakhir: e4f16ff9752eee2cedb5f97c7b5aec6d
  • md5sum tanpa baris baru final: 78c560eed3b83513e3080117ab5dc5fa
Trauma Digital
sumber
2
Saya hanya menunggu jawaban permen karet.
Mike Bufardeci
@ MikeBufardeci di sini - 184 byte biasa-biasa saja .
Trauma Digital
Apakah ruang memimpin dapat diterima?
Titus
@Titus Maaf, tidak, md5s telah diberikan, dan spasi tambahan akan mengacaukannya.
Trauma Digital

Jawaban:

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

Keluar dengan kesalahan, yang diizinkan secara default .

Cobalah online! atau memverifikasi hash MD5 .

Bagaimana itu bekerja

Setelah menginisialisasi k sebagai 1 , kita memasukkan infinite loop yang mengeksekusi kode berikut.

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)membuat tuple dari semua bilangan bulat non-negatif di bawah 64 yang memiliki bit set j th , di mana j adalah jumlah iterasi dari loop, yaitu, 2 j = k .

('%2d '*7+'%2d\n')*4pertama-tama membuat string format '%2d %2d %2d %2d %2d %2d %2d \n', kemudian mengulanginya empat kali. Ini adalah templat untuk setiap kartu, yang membungkus masing-masing bilangan bulat dalam tuple ke dua karakter (spasi yang ditentukan sebelumnya), memisahkan masing-masing kelompok 8 bilangan bulat dengan spasi, dan kelompok-kelompok itu sendiri dengan umpan garis.

Sekarang, pernyataan Python 2print adalah binatang yang aneh. Dibutuhkan beberapa ekspresi, dipisahkan oleh komata, dan mencetaknya satu per satu. Ini mengevaluasi ekspresi pertama, mencetaknya, mengevaluasi ekspresi berikutnya, mencetaknya, dll. Sampai tidak ada lagi ekspresi yang tersisa. Kecuali jika ekspresi terakhir diikuti oleh koma, itu menambahkan umpan baris ke sana. Juga, ini memberi spasi pada semua ekspresi, kecuali jika dicetak pada awal baris.

Di setiap iterasi, pertama-tama kita mencetak hasil menerapkan string format ke tuple. Kami berada di awal garis, jadi tidak ada ruang yang ditambahkan.

Kemudian, kami (berupaya) mencetak hasil 11/(k<32)*' -'. Jika k <32 , ekspresi ini dievaluasi menjadi ' - - - - - - - - - - -'. Sekali lagi, kita berada di awal sebuah garis, jadi tidak ada ruang yang ditambahkan. Tidak ada koma setelah ekspresi ini, jadi printtambahkan linefeed. Namun, dalam iterasi keenam, k = 2 5 = 32 , jadi mencoba mengevaluasi 11/(k<32)*' -'menimbulkan ZeroDivisionError yang tidak tertangkap . Ini keluar dari loop dan mengakhiri program dengan segera.

Dennis
sumber
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);}
orlp
sumber
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))

Membagi urutan sangat mengganggu di Python.

Cobalah online .

orlp
sumber
5

Jelly , 27 26 byte

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

Cobalah online! atau memverifikasi hash MD5 .

Bagaimana itu bekerja

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.
Dennis
sumber
2
Yang Gbuiltin secara serius dikalahkan untuk tantangan ini. Saya membutuhkan sekitar 10 byte untuk melakukan hal yang sama.
DLosc
5

Pip , 49 48 44 byte

43 byte kode, +1 untuk -Sbendera.

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

Cobalah online!

Penjelasan

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

Tidak disatukan

Cukup mudah. Satu-satunya hal yang mungkin memerlukan penjelasan tambahan adalah kapan harus mengikuti nomor dengan baris baru daripada spasi. Ini terjadi ketika j+1%16==0dalam empat kartu pertama dan j+1%8== 0 dalam dua kartu terakhir. Oleh karena itu ekspresi 15>>i/64/4atau yang setara 15>>i/256adalah AND dengan juntuk menentukan apakah ruang atau baris baru diperlukan.

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
}
Level River St
sumber
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())

Neil
sumber
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

Cobalah

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

Cobalah

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

Cobalah

(periksa bagian Debug untuk hasil MD5)
Dua yang terakhir terinspirasi / ditranskripsi dari implementasi Ruby dan C

Brad Gilbert b2gills
sumber
2

05AB1E , 71 byte

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

Cobalah online!

Pendekatan ini, jangan coba-coba. Kemungkinan besar akan menghapus ini karena rasa malu. Manipulasi matriks bukanlah setelan kuat saya, jadi saya mencoba dengan brute force menghasilkan semua 6 urutan dan kemudian memompa mereka bersama-sama dengan sembrono.

Guci Gurita Ajaib
sumber
TFW Anda melihat jawaban Anda sendiri dari tahun lalu ¯\ (º_o) / ¯.
Magic Gurita Guci
1

Batch, 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=

Menghasilkan CRLF tambahan.

Neil
sumber
1
@DigitalTrauma Cara terbaik untuk mencobanya benar-benar memerlukan Wine ( askubuntu.com/a/54271 ) atau Anda mengunduh VM ( developer.microsoft.com/en-us/microsoft-edge/tools/vms ) (saya sarankan Anda untuk unduh Windows 7 dengan IE8, untuk menghemat ruang. Atau coba gunakan Windows XP + IE6 VM yang dulu tersedia)
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

Uji

Arnauld
sumber
1

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

Sunting: Menghapus ^ yang tidak perlu dari regex di akhir; regex akan selalu cocok pada awal baris.

Mitchell Spector
sumber
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);

mencetak baris baru yang memimpin tetapi tidak ada yang tertinggal, dan satu spasi di setiap baris. Jalankan dengan -nratau coba online .

Untuk PHP <5.6, ganti 2**$cdengan (1<<$c). PHP 5.5 bisa digunakan &~1<<$c?:sebagai gantinya %2**$c||.
Untuk PHP <5.5, ganti"\n"[$n++%8] dengan ($n++%8?"":"\n").


Tanda hubung adalah satu karakter mati karena ruang terdepan; tambahkan spasi ke yang pertamastr_pad parameter (masukkan spasi sebelum baris kode kedua) untuk diperbaiki.

Menghapus ruang terdepan sebagai gantinya membutuhkan beberapa mengutak-atik dan tiga byte tambahan: printf("%c%2d",$n++%8?32:10,++$b%64);dan23 bukannya 25.

Mengubah baris baru menjadi baris tambahan akan membutuhkan tiga byte lagi:

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

cocok dengan semua spesifikasi dan berfungsi dengan semua versi PHP.

Titus
sumber
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

Cobalah online!

Penjelasan:

# 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
Triggernometri
sumber
Bagus, kecuali pemisah `- - -` seharusnya hanya muncul di antara kartu dan bukan kartu tambahan di akhir.
Trauma Digital
@DigitalTrauma Dang, dan saya SANGAT BANGGA mendapatkan bytecount yang lebih kecil dari Dennis juga. Terima kasih telah menunjukkannya, tho!
Triggernometri
1

05AB1E , 29 byte

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

Port dari @Emigna 's 05AB1E menjawab di sini , setelah itu saya menambahkan kode tambahan untuk mencetaknya sesuai dengan persyaratan dalam tantangan ini.

Cobalah online atau verifikasi md5sum .

Penjelasan:

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)
Kevin Cruijssen
sumber
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)

Saya akan menulis penjelasan nanti.

Jika console.logdiperlukan, jumlah byte akan 247 byte.

Naruyoko
sumber
Selamat datang di situs ini! Apakah Anda meletakkan output dalam array? Saya tidak tahu Javascript tapi itu mengharuskan Anda untuk masuk karena Anda tidak dapat menampilkan melalui variabel.
Wheat Wizard