Christmas Cracker Mystery Calculator

25

Os presentes foram abertos. As tortinhas foram comidas. A Guerra nas Estrelas foi assistida. A temporada de Natal está começando a terminar. Até agora você já pode ter puxado alguns biscoitos de Natal . Se você tiver sorte, em vez dos brinquedos de plástico inúteis, você pode ter ganho uma Calculadora Misteriosa com a qual pode surpreender seus amigos e parentes .

insira a descrição da imagem aqui

Esse truque consiste em 6 cartas, cada uma com uma grade de números 4x8 impressa. Cada cartão contém um subconjunto diferente dos números inteiros [1,63]. O mágico solicitará que você escolha um número de um cartão e mantenha esse número em segredo. O mágico perguntará então quais cartões têm esse número. Com esse conhecimento, o mágico poderá magicamente determinar e divulgar o número original adivinhado.


Envie o conjunto completo de 6 cartões da Calculadora Misteriosa exatamente da seguinte maneira:

 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

A saída pode ou não conter uma nova linha final à direita. Não deve haver espaço em branco à direita. Cada cartão é separado por 11 -perfurações.

  • md5sum com nova linha final: 7aa2d9339b810ec62a2b90c5e11d6f4a
  • md5sum sem nova linha final: e9abe4e32dca3e8fbfdaa4886fc5efd2

Para aqueles que têm mais orientação do Windows, também permitirei CRLFfinais de linhas de estilo. Nesse caso, os md5s são:

  • md5sum com nova linha final: e4f16ff9752eee2cedb5f97c7b5aec6d
  • md5sum sem nova linha final: 78c560eed3b83513e3080117ab5dc5fa
Trauma Digital
fonte
2
Só estou esperando a resposta do chiclete.
Mike Bufardeci
@MikeBufardeci aqui - 184 bytes medíocres .
Digital Trauma
Os espaços à esquerda são aceitáveis?
Titus
@Titus Desculpe, não, os md5s foram fornecidos e espaços em branco adicionais atrapalhariam esses.
Digital Trauma

Respostas:

10

Python 2 , 99 96 93 91 bytes

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

Sai com um erro, que é permitido por padrão .

Experimente online! ou verifique o hash MD5 .

Como funciona

Após inicializar k como 1 , inserimos um loop infinito que executa o seguinte código.

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)cria uma tupla de todos os números inteiros não negativos abaixo de 64 que possuem o j- ésimo conjunto de bits, onde j é a contagem de iterações do loop, ou seja, 2 j = k .

('%2d '*7+'%2d\n')*4primeiro cria a string de formato '%2d %2d %2d %2d %2d %2d %2d \n'e depois a repete quatro vezes. Este é um modelo para cada cartão, que preenche cada número inteiro na tupla com dois caracteres (espaços precedentes), separa cada grupo de 8 números inteiros por espaços e os próprios grupos por linhas de alimentação.

Agora, a printdeclaração do Python 2 é uma fera curiosa. Ele pega várias expressões, separadas por vírgulas, e as imprime uma a uma. Ele avalia a primeira expressão, imprime, avalia as próximas expressões, imprime, etc., até que não haja mais expressões. A menos que a última expressão seja seguida por uma vírgula, ela anexa um avanço de linha. Além disso, ele anexa um espaço a todas as expressões, a menos que sejam impressas no início de uma linha.

Em cada iteração, primeiro imprimimos o resultado da aplicação da string de formato à tupla. Estamos no início de uma linha, portanto, nenhum espaço é precedido.

Então, (tentamos) imprimir o resultado de 11/(k<32)*' -'. Se k <32 , essa expressão é avaliada como ' - - - - - - - - - - -'. Mais uma vez, estamos no início de uma linha, portanto, nenhum espaço é precedido. Não há vírgula após esta expressão, portanto, printacrescenta um avanço de linha. No entanto, na sexta iteração, k = 2 5 = 32 , portanto, tentar avaliar 11/(k<32)*' -'gera um ZeroDivisionError não capturado . Isso interrompe o ciclo e termina o programa imediatamente.

Dennis
fonte
7

C (gcc), 105 bytes

o;main(i){for(;i<384;i++%64||puts(" - - - - - - - - - - -"))i&1<<i/64&&printf("%2d%c",i%64,++o%8?32:10);}
orlp
fonte
5

Python 2, 132 bytes

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

A divisão de seqüências é irritante no Python.

Experimente online .

orlp
fonte
5

Geléia , 27 26 bytes

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

Experimente online! ou verifique o hash MD5 .

Como funciona

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
fonte
2
Esse Grecurso está seriamente sobrecarregado para esse desafio. Eu precisava de cerca de 10 bytes para fazer o mesmo.
DLosc
5

Pip , 49 48 44 bytes

43 bytes de código, +1 para -Ssinalizador.

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

Experimente online!

Explicação

                                             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
fonte
4

Ruby, 90 bytes

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

Ungolfed

Bastante direto. A única coisa que pode exigir explicações adicionais é quando seguir um número com uma nova linha em vez de um espaço. Isso acontece quando j+1%16==0nas quatro primeiras cartas e j+1%8== 0 nas duas últimas. Portanto, a expressão 15>>i/64/4ou equivalente 15>>i/256é AND com jpara determinar se é necessário espaço ou nova linha.

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
fonte
3

JavaScript (ES6), 150 bytes

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

Tente

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

Tente

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

Tente

(verifique as seções Debug para obter os resultados do MD5)
As duas últimas foram inspiradas / transcritas nas implementações Ruby e C

Brad Gilbert b2gills
fonte
2

05AB1E , 71 bytes

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

Experimente online!

Essa abordagem, não tente. Provavelmente, isso será excluído por vergonha, para ser sincero. A manipulação de matrizes não é o meu forte, então tentei que a força bruta gerasse todas as 6 seqüências e as bombeie desleixadamente.

Urna de polvo mágico
fonte
TFW você vê sua própria resposta de anos atrás ¯\ (º_o) / ¯.
Magic Octopus Urn
1

Lote, 249 bytes

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

Produz um CRLF à direita.

Neil
fonte
1
@DigitalTrauma As melhores maneiras de experimentá-lo realmente exigem o Wine ( askubuntu.com/a/54271 ) ou o download de uma VM ( developer.microsoft.com/en-us/microsoft-edge/tools/vms ) (eu recomendo baixar o Windows 7 com IE8, para economizar espaço ou tentar obter suas mãos em um Windows XP + IE6 VM que costumava ser disponível).
Ismael Miguel
1

JavaScript (ES6), 103 102 bytes

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

Teste

Arnauld
fonte
1

utilitários bash / Unix, 125 124 bytes

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

Editar: Removido um ^ desnecessário da expressão regular no final; a regex sempre corresponderá no início da linha de qualquer maneira.

Mitchell Spector
fonte
1

PHP, 102 bytes

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

imprime uma nova linha à esquerda, mas não à direita, e um espaço à esquerda em cada linha. Corra com -nrou experimente online .

Para PHP <5.6, substitua 2**$cpor (1<<$c). PHP 5.5 poderia usar em &~1<<$c?:vez de %2**$c||.
Para PHP <5.5, substitua "\n"[$n++%8]por ($n++%8?"":"\n").


Traços são um caractere desativado devido ao espaço inicial; acrescente um espaço ao primeiro str_padparâmetro (insira um espaço antes da segunda linha de código) para corrigir.

A remoção do espaço à esquerda requer alguns ajustes e três bytes adicionais: printf("%c%2d",$n++%8?32:10,++$b%64);e em 23vez de 25.

Transformar a nova linha principal em uma linha final custaria outros três bytes:

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 bytes

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

corresponde a todas as especificações e funciona com todas as versões do PHP.

Titus
fonte
1

Python 2 , 89 bytes

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

Experimente online!

Explicação:

# 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
Triggernometria
fonte
Bom, exceto que o separador `- - -` deve aparecer apenas entre os cartões e não um adicional no final.
Digital Trauma
@DigitalTrauma Dang, e eu estava tão orgulhosa de conseguir uma conta menor do que Dennis também. Obrigado por apontar, tho!
Triggernometry
1

05AB1E , 29 bytes

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

Porto de @Emigna resposta 05AB1E 's aqui , depois que eu adicionei código adicional para imprimi-lo de acordo com os requisitos deste desafio.

Experimente online ou verifique md5sum .

Explicação:

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
fonte
0

JavaScript, 234 bytes.

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)

Vou escrever uma explicação mais tarde.

Se console.lognecessário, a contagem de bytes seria 247 bytes.

Naruyoko
fonte
Bem vindo ao site! Você está colocando sua saída em uma matriz? Eu não sei Javascript, mas isso exigiria que você registrasse, pois não é possível gerar uma saída através de uma variável.
Wheat Wizard