Noel Kraker Gizem Hesaplama


25

Hediyeler açıldı. Kıymalı turtalar yenildi. Yıldız Savaşları izlendi. Noel Sezonu düşmeye başladı. Şimdiye dek bir kaç Noel Krakeri çekmiş olabilirsiniz . Şanslıysanız, her zamanki işe yaramaz plastik oyuncaklar yerine, arkadaşlarınızı ve akrabalarınızı büyüleyebileceğiniz bir Gizem Hesaplayıcı kazanmış olabilirsiniz .

görüntü tanımını buraya girin

Bu numara, her biri üzerinde 4x8 ızgara bulunan 6 karttan oluşuyor. Her kart, tam sayıların farklı bir alt kümesini içerir [1,63]. Sihirbaz sizden bir karttan bir numara seçmenizi ve bu numarayı gizli tutmanızı isteyecektir. Sihirbaz daha sonra hangi kartların bu numaraya sahip olduğunu soracaktır. Bu bilgiyle, sihirbaz, tahmin edilen orijinal numarayı sihirli bir şekilde belirleyip açıklayabilecektir.


6 Mystery Calculator kartının tam setini tam olarak aşağıdaki gibi çıkarın:

 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

Çıktı son bir son satır yeni hat içerebilir veya içermeyebilir. Sonda boşluk yok. Her kart 11 -delik ile ayrılmıştır .

  • final newline ile md5sum: 7aa2d9339b810ec62a2b90c5e11d6f4a
  • son satırsonu olmadan md5sum: e9abe4e32dca3e8fbfdaa4886fc5efd2

Sizden daha çok pencere yönlendirmesi yapanlar için de izin vereceğim CRLF stil çizgisi sonlarına . Bu durumda, md5'ler:

  • final newline ile md5sum: e4f16ff9752eee2cedb5f97c7b5aec6d
  • son satırsonu olmadan md5sum: 78c560eed3b83513e3080117ab5dc5fa

2
Sadece ciklet cevabını bekliyorum.
Mike Bufardeci,


Önde gelen boşluklar kabul edilebilir mi?
Titus,

@Titus Üzgünüz, hayır, md5 verildi ve ek boşluklar bunları bozar.
Dijital Travma

Yanıtlar:


10

Python 2 , 99 96 93 91 bayt

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

Varsayılan olarak izin verilen bir hata ile çıkar .

Çevrimiçi deneyin! veya MD5 karma değerini doğrulayın .

Nasıl çalışır

Başlatılıyor sonra k olarak 1 , aşağıdaki kodu yürütür sonsuz bir döngüye girmek.

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)altındaki tüm negatif olmayan tamsayılar bir tuple oluşturur 64 orada var j inci ucu seti, j döngünün yineleme sayısı ise, yani 2 j = k .

('%2d '*7+'%2d\n')*4önce biçim dizesini oluşturur '%2d %2d %2d %2d %2d %2d %2d \n', ardından dört kez tekrarlar. Her kart için, tamsayıdaki her bir tam sayıyı iki karaktere (boşluk hazırlığı) yayan, her 8 tamsayı grubunu boşluklarla ve grupları da satır beslemeli olarak ayıran bir şablon .

Şimdi, Python 2'nin printifadesi meraklı bir canavardır. Virgülle ayrılmış birkaç ifade alır ve bunları birer birer basar. İlk ifadeyi değerlendirir, yazdırmaz, sonraki ifadeleri değerlendirir, başka ifadeler kalmayıncaya kadar yazdırır vb. Son ifadeyi virgül izlemiyorsa, ona satır başı beslemesi ekler. Ayrıca, bir satırın başında basılmadıkça, tüm ifadeler için bir boşluk hazırlar.

Her yinelemede, önce format dizesini dize uygulamanın sonucunu yazdırırız. Bir çizginin başlangıcındayız, bu nedenle yer oluşturulmadı.

Sonra, sonucunu (biz basmaya çalışırız) 11/(k<32)*' -'. Eğer k <32 ise , bu ifadeler değerlendirilir ' - - - - - - - - - - -'. Yine, biz bir çizginin başlangıcındayız, bu nedenle hiçbir boşluk hazırlanmamıştır. Bu ifadeden sonra virgül yok, bu yüzden printbir satır besleme ekler. Bununla birlikte, altıncı yinelemede, k = 2 5 = 32 , bu yüzden değerlendirmeye çalışmak, 11/(k<32)*' -'yakalanmamış bir ZeroDivisionError'ı yükseltir . Bu döngüden kopar ve programı derhal sonlandırır.


7

C (gcc), 105 bayt

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 bayt

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

Bölünme dizileri Python'da can sıkıcıdır.

Çevrimiçi deneyin .


5

Jöle , 27 26 bayt

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

Çevrimiçi deneyin! veya MD5 karma değerini doğrulayın .

Nasıl çalışır

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
Bu Gyerleşik bu meydan okuma için ciddi bir şekilde güçlendirilmiştir. Aynı şeyi yapmak için yaklaşık 10 bayta ihtiyacım vardı.
DLosc

5

Pip , 49 48 44 bayt

43 baytlık kod, -Sbayrak için +1 .

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

Çevrimiçi deneyin!

açıklama

                                             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

Yakut, 90 bayt

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

Ungolfed

Yeterince açıksözlü. Ek açıklama gerektirebilecek tek şey, bir alandan ziyade yeni bir satır olan bir sayıyı takip etmektir. Bu j+1%16==0, ilk dört kartta ve j+1%8son ikisinde == 0 olduğunda olur . Bu nedenle, ifade 15>>i/64/4veya eşdeğerde 15>>i/256, ANDed ( jboşluk) veya newline'ın gerekli olup olmadığını belirlemek için kullanılır.

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 bayt

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 bayt

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

Dene

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

Dene

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

Dene

( MD5 sonuçları için Hata Ayıklama bölümlerini kontrol edin )
Son ikisi Ruby ve C uygulamalarından ilham aldı / kopyalandı.


2

05AB1E , 71 bayt

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

Çevrimiçi deneyin!

Bu yaklaşım, deneme. Dürüst olmak gerekirse, bu utançtan kurtulacaktır. Matris manipülasyonu benim güçlü takımım değil bu yüzden 6 sekansın hepsini oluşturan kuvvet kuvvetini kırmaya çalıştım ve bunları düzgün bir şekilde birlikte pompaladım.


TFW yıllar önce kendi cevabınızı görüyorsunuz ¯\ (º_o) / ¯.
Magic Octopus Urn

1

Toplu iş, 249 bayt

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

Sondaki CRLF'yi verir.


1
@DigitalTrauma Denemenin en iyi yolları gerçekten Şarap gerektiriyor ( askubuntu.com/a/54271 ) ya da bir VM indirmeni ( developer.microsoft.com/en-us/microsoft-edge/tools/vms ) (tavsiye ederim yerden tasarruf etmek için IE8 işletim sistemli Windows 7'yi indirin ya da eskiden kullanabileceğiniz Windows XP + IE6 VM'de ellerinizi almaya çalışın)
Ismael Miguel

1

JavaScript (ES6), 103 102 bayt

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

Ölçek


1

bash / Unix yardımcı programları, 125 124 bayt

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

Düzenleme: Gereksiz bir ^, sonunda regex'ten kaldırıldı; regex zaten her zaman satırın başında eşleşir.


1

PHP, 102 bayt

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

her satırda bir satır başı, sondaki satır yok ve bir satır alanı yazdırır. İle koş-nrÇevrimiçi olarak veya deneyin .

PHP <5.6 için değiştirin 2**$cile (1<<$c). PHP 5.5 &~1<<$c?:yerine kullanabilirsiniz %2**$c||.
PHP <5.5 için değiştirin "\n"[$n++%8]ile ($n++%8?"":"\n").


Çizgi, baştaki boşluktan dolayı bir karakter dışıdır; str_paddüzeltmek için ilk parametreye boşluk ekleyin (ikinci kod satırından önce boşluk ekleyin).

Önde gelen boşluğu kaldırmak yerine, biraz korkutucu ve üç ek bayt gerektirir: printf("%c%2d",$n++%8?32:10,++$b%64);ve23 yerine25 .

Önde gelen newline'ı sonda olana çevirmek üç bayta daha mal olur:

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 bayt

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

Tüm özellikleriyle eşleşir ve tüm PHP sürümleriyle çalışır.


1

Python 2 , 89 bayt

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

Çevrimiçi deneyin!

Açıklama:

# 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

İyi, - - - - `ayırıcısı sadece kartlar arasında görünmeli, sonunda fazladan bir tane olmamalıdır.
Dijital Travma

@DiitalTrauma Dang, ben de Dennis'ten daha küçük bir bytecount alma konusunda çok gurur duyuyordum. Gösterdiğin için teşekkürler, tho!
Triggernometry,

1

05AB1E , 29 bayt

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

Liman dan @Emigna işte 05AB1E cevap , bundan sonra ben bu meydan içinde ihtiyaçlarına göre yazdırmak için ek kod eklendi.

Çevrimiçi deneyin veya md5sum’u doğrulayın .

Açıklama:

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

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)

Daha sonra bir açıklama yazacağım.

Gerekirse console.log, bayt sayısı 247 bayt olur.


Siteye Hoşgeldiniz! Çıktınızı bir diziye mi koyuyorsunuz? Javascript'i bilmiyorum ama bir değişken üzerinden çıktı alamayacağınız için giriş yapmanız gerekiyor.
Buğday Sihirbazı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.