Різдвяний крекер калькулятор


25

Подарунки відкрили. Пиріжки з фаршу їли. Зоряні війни спостерігали. Різдвяний сезон починає стихати. На даний момент ви, можливо, вже витягнули кілька різдвяних сухарів . Якщо вам пощастить, замість звичних марних пластикових іграшок ви, можливо, виграли калькулятор таємниць, за допомогою якого ви зможете здивувати своїх друзів та родичів .

введіть тут опис зображення

Цей трюк складається з 6 карток на кожній, на яких розміщена сітка 4х8 цифр. Кожна карта містить різний підмножина цілих чисел [1,63]. Маг попросить вас забрати номер з однієї картки і зберегти це число в таємниці. Потім фокусник запитає, які картки мають цю кількість. Маючи ці знання, фокусник магічним чином зможе визначити та розкрити вгадане оригінальне число.


Виведіть повний набір 6 карт Mystery Calculator наступним чином:

 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

Для тих, хто має більше орієнтації на вікна, я також дозволю CRLFзакінчення стильових ліній. У цьому випадку md5 є:

  • md5sum з остаточним рядком: e4f16ff9752eee2cedb5f97c7b5aec6d
  • md5sum без остаточного нового рядка: 78c560eed3b83513e3080117ab5dc5fa

2
Я просто чекаю відповіді міхура.
Майк Буфардечі


Чи прийнятні провідні простори?
Тит

@Titus Вибачте, ні, md5 не надано, і додаткове пробіл зіпсує їх.
Цифрова травма

Відповіді:


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 , у яких є j- й бітовий набір, де j - кількість ітерацій циклу, тобто 2 j = k .

('%2d '*7+'%2d\n')*4спочатку створюється рядок формату '%2d %2d %2d %2d %2d %2d %2d \n', потім повторюється чотири рази. Це шаблон для кожної картки, який прошиває кожне ціле число в кортежі до двох символів (попередніх пробілів), розділяє кожну групу з 8 цілих чисел пробілами, а самі групи - рядковими каналами.

Тепер заява Python 2print - це цікавий звір. Він займає кілька виразів, розділених комами, і друкує їх по одному. Він оцінює перший вираз, друкує його, оцінює наступні вирази, друкує його тощо, поки не залишиться більше виразів. Якщо останній вираз не супроводжується комою, він додає до нього рядковий рядок. Крім того, він створює пробіл для всіх виразів, якщо вони не надруковані на початку рядка.

У кожній ітерації спочатку друкуємо результат застосування рядка формату до кортежу. Ми на початку рядка, тому жоден простір не передбачається.

Потім ми (намагаємось) надрукувати результат 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 байти коду, +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

Рубін, 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позначається AND, 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 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}

Спробуй це

(Перевірте розділи налагодження на результати 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 ) (рекомендую завантажте Windows 7 за допомогою IE8, щоб заощадити місце. Або спробуйте отримати свої руки на Windows XP + IE6 VM, який раніше був доступний)
Ісмаель Мігель


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

Добре, за винятком розділювача `- - -`, має з’являтися лише між картами, а не додатковою в кінці.
Цифрова травма

@DigitalTrauma Dang, і я настільки гордий отримати менший кількість рахунків, ніж Денніс. Дякуємо, що вказали на це, тхо!
Тригернометрія

1

05AB1E , 29 байт

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

Порт від відповіді 05AB1E @Emigna тут , після чого я додав додатковий код, щоб надрукувати його відповідно до вимог цього виклику.

Спробуйте в Інтернеті або перевірте 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, але це вимагає від вас увійти, оскільки ви не можете виводити через змінну.
Пшеничний майстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.