Programar meu discador automático

16

Naquele dia, os discadores automáticos de telefone usavam cartões perfurados com uma coluna para cada dígito do número a ser discado. As colunas tinham sete linhas. As três primeiras linhas representaram os números (1,2,3), (4,5,6) e (7,8,9), respectivamente. As últimas três fileiras giraram esse arranjo em 90 °: (1,4,7), (2,5,8) e (3,6,9). A linha do meio foi usada para 0. Qualquer dígito 1 a 9 teria dois furos - um nas três primeiras linhas e um nas três linhas inferiores. Zero teria apenas a linha do meio perfurada. Vamos visualizar a coluna perfurada para o número 6 ( .não xperfurada, perfurada, o guia à esquerda é apenas para ilustrar a codificação):

123 .
456 x
789 .
 0  .
147 .
258 .
369 x

Procuramos quais linhas contêm o número que estamos tentando discar. Para 6, esta é a segunda linha e a nona linha. Essas duas linhas são perfuradas, as cinco linhas restantes não são perfuradas. Aqui estão os padrões perfurados para todos os dígitos de 0 a 9:

    0 1 2 3 4 5 6 7 8 9
123 . x x x . . . . . .
456 . . . . x x x . . .
789 . . . . . . . x x x
 0  x . . . . . . . . .
147 . x . . x . . x . .
258 . . x . . x . . x .
369 . . . x . . x . . x

Seu objetivo é (escrever um programa ou função) perfurar esses cartões para mim.

Entrada: Um número, obtido em qualquer formato razoável (sequência, número inteiro, lista de números inteiros, etc.), que não exceda 9999999999999.

Saída: a grade de colunas perfuradas correspondente à entrada de número. Você não precisa dos cabeçalhos ou espaçamento extra mostrados acima, apenas das próprias colunas perfuradas. As novas linhas iniciais / finais estão ok, assim como o espaço em branco entre linhas / colunas , desde que consistente . Falando nisso, desde que sejam consistentes, você pode usar qualquer caractere (sem espaço em branco) para perfurar e qualquer outro caractere para não perfurar (embora deva ser óbvio, especifique quais caracteres você está usando).

Isso é código-golfe, então o código mais curto vence. As brechas padrão não são permitidas.

Casos de teste (todos usados .para não perfurados, xpara perfurados):

In: 911
Out: .xx
     ...
     x..
     ...
     .xx
     ...
     x..

In: 8675309
Out: ....x..
     .x.x...
     x.x...x
     .....x.
     ..x....
     x..x...
     .x..x.x

In: 5553226
Out: ...xxx.
     xxx...x
     .......
     .......
     .......
     xxx.xx.
     ...x..x
brhfl
fonte
2
Totalmente desnecessário para resolver a questão, mas há uma pequena galeria bem organizada desses cartões / dispositivos aqui .
Brhfl 16/04/19
você pode usar qualquer caractere para perfurado, e qualquer outro caractere para perfurado, quer dizer caracteres que não sejam espaços em branco?
Erik the Outgolfer
Sim, suponho que seria preferível, já que espaço em branco é permitido em outro lugar. E por uma questão de poder ver. Editará, obrigado.
Brhfl 16/04/19
1
arrefecer desafio ... tentado a escrever uma resposta Fortran 77, mas idk como golf-lo
QWR
@qwr Sinta-se à vontade para criar uma postagem "Dicas para jogar golfe no Fortran".
mbomb007

Respostas:

3

Pitão, 25 bytes

.tm?djNmX*3NkZ.Dtd3X*7N3Z

Usa 0para perfurados e não perfurados ".
Experimente aqui

Explicação

.tm?djNmX*3NkZ.Dtd3X*7N3Z
  m                      Q  For each number in the (implicit) input...
   ?d                       ... if the number is nonzero...
              .Dtd3         ... get (n - 1) divmod 3...
       mX*3NkZ              ... replace each position in `"""` with `0`...
     jN                     ... and stick them together with `"`. ...
                   X*7N3Z   ... Otherwise, `"""0"""`.
.t                          Transpose the result.

fonte
3

JavaScript (ES6), 60 54 bytes

Recebe a entrada como uma matriz de números inteiros. Retorna uma matriz binária, com 0 = não perfurado / 1 = perfurado.

a=>[14,112,896,1,146,292,584].map(n=>a.map(i=>n>>i&1))

Experimente online!

Arnauld
fonte
3

05AB1E , 16 15 bytes

Usa 0 e 1 .

ε9ÝÀ3ôD¨ø«¢O}ø»

Experimente online!

Explicação

ε           }     # apply to each digit in input                
 9Ý               # push the range [0 ... 9]
   À              # rotate left
    3ô            # split into pieces of 3
      D¨          # duplicate and remove the last digit (0)
        ø         # transpose
         «        # append
          ¢O      # sum the counts of each in the current digit     
             ø    # transpose
              »   # format output
Emigna
fonte
2

Python 2 , 84 bytes

lambda a:[''.join(`(ord('(1Aa2Bb4Dd'[int(n)])-32)>>k&1`for n in a)for k in range(7)]

Experimente online!

0/1 é usado para não perfurado / perfurado.

Chas Brown
fonte
2

Python 3 , 84 80 bytes

def f(s):[print(*[int(i in[~-n//3,6--n%3-3*(n<1)])for n in s])for i in range(7)]

Experimente online!

ovs
fonte
Algo parece estranho com sua quinta e sexta linhas (elas parecem estar invertidas). [1,2,3] deve formar uma linha diagonal para baixo, por exemplo.
Brhfl 16/04/19
@brhfl obrigado por me dizer,
corrigi-
2

C (clang) , 108 107 bytes

c,i;f(*q){char*r;for(i=~0;i++<6;puts(""))for(r=q;c=*r++;c-=48,putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]));}

Experimente online!

Pega o número da entrada como string. Imprime a saída em .e Xcomo nos exemplos.

Créditos

-1 byte thanks @ somente ASCII

GPS
fonte
1
107 , e cabeçalho removido de outra forma que você precisa para incluir o cabeçalho na bytecount
ASCII-only
Você pode por favor me aponte para um consenso geral de que a inclusões de cabeçalho que precisa ser contada para contagem de bytes para soluções de função (não programas completos)
GPS
1 , 2 , 3
somente ASCII
Sugerir em putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]))c-=48vez dec-=48,putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]))
roofcat 23/11
2

J , 31 20 bytes

-11 bytes graças ao FrownyFrog!

(e."1],0,|:)1+i.@3 3

Experimente online!

J , 31 bytes

1*@|:@:#.(a,0,|:a=.1+i.3 3)=/~]

Experimente online!

Toma a entrada como uma lista de dígitos

0 - não perfurado, 1 - perfurado

Explicação:

   a=.1+i.3 3 - generates the matrix and stores it into a
1 2 3
4 5 6
7 8 9

   (a,0,|:a=.1+i.3 3) - generates the entire comparison table 
1 2 3
4 5 6
7 8 9
0 0 0
1 4 7
2 5 8
3 6 9

   ]=/ - creates an equality table between the input and the comparison table

 ((a,0,|:a=.1+i.3 3)=/~]) 9 1 1
0 0 0
0 0 0
0 0 1
0 0 0
0 0 0
0 0 0
0 0 1

1 0 0
0 0 0
0 0 0
0 0 0
1 0 0
0 0 0
0 0 0

1 0 0
0 0 0
0 0 0
0 0 0
1 0 0
0 0 0
0 0 0

  1*@|:@:#. - adds the tables, transposes the resulting table and finds the magnitude

  (1*@|:@:#.(a,0,|:a=.1+i.3 3)=/~])  9 1 1
0 1 1
0 0 0
1 0 0
0 0 0
0 1 1
0 0 0
1 0 0
Galen Ivanov
fonte
@FrownyFrog Obrigado! Você é brilhante como sempre!
Galen Ivanov
1
20
FrownyFrog,
1

Tela , 27 25 bytes

{9+├3÷u4% ×#+#¹╷3%5+1╋]↶↕

Experimente aqui!

dzaima
fonte
1

Carvão , 28 bytes

E⁴⭆θI⁼ι÷﹪⊖λχ³E³⭆θI∧Iλ¬﹪⁻⊖λι³

Experimente online! Link é a versão detalhada do código. Usa 0/1, mas pode suportar caracteres arbitrários a um custo de 1 byte: Experimente online! . Explicação:

E⁴              Loop from 0 to 3
  ⭆θ            Loop over input string and join
           λ     Current character
         ⊖      Cast to integer and decrement
        ﹪  χ    Modulo predefined variable 10 (changes -1 to 9)
       ÷    ³   Integer divide by literal 3
     ⁼ι         Compare to outer loop variable
    I           Cast to string
                Implicitly print each outer result on a separate line

E³              Loop from 0 to 2
  ⭆θ            Loop over input string and join
            λ   Current character
           ⊖    Cast to integer and decrement
          ⁻  ι  Subtract outer loop variable
         ﹪    ³ Modulo by literal 3
        ¬       Logical not
       λ        Inner loop character
      I         Cast to integer
     ∧          Logical and
    I           Cast to string
                Implicitly print each outer result on a separate line
Neil
fonte
0

Perl 5 -F , 52 bytes

for$i(123,456,789,0,147,258,369){say map$i=~$_|0,@F}

Experimente online!

Usa 1para perfurados e não perfurados 0.

Xcali
fonte