Programar mi marcador automático

16

En el pasado, los marcadores automáticos usaban tarjetas perforadas con una columna para cada dígito del número que se marcaría. Las columnas tenían siete filas. Las primeras tres filas representaban los números (1,2,3), (4,5,6) y (7,8,9) respectivamente. Las últimas tres filas giraron esta disposición 90 °: (1,4,7), (2,5,8) y (3,6,9). La fila central se usó para 0. Cualquier dígito 1-9 tendría dos agujeros perforados: uno en las primeras tres filas y otro en las tres filas inferiores. Zero solo tendría la fila del medio perforada. .Visualicemos la columna perforada para el número 6 ( está sin perforar, xestá perforada, la guía de la izquierda es solo para ilustrar la codificación):

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

Buscamos qué fila (s) contienen el número que intentamos marcar. Para 6, esta es la segunda fila y la novena fila. Estas dos filas están perforadas, las cinco filas restantes están sin perforar. Aquí están los patrones perforados para todos los dígitos 0-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

Su objetivo es (escribir un programa o función para) perforar estas tarjetas para mí.

Entrada: un número, tomado en cualquier formato razonable (cadena, número entero, lista de números enteros, etc.), que no exceda 9999999999999.

Salida: la cuadrícula de columnas perforadas correspondientes a la entrada del número. No necesita los encabezados o el espacio adicional que se muestra arriba, solo las columnas perforadas. Las nuevas líneas iniciales / finales están bien, al igual que el espacio en blanco entre filas / columnas siempre que sea coherente . Hablando de eso, siempre que sean consistentes, puede usar cualquier carácter (sin espacios en blanco) para perforar, y cualquier otro carácter para no perforar (aunque debería ser obvio, especifique qué caracteres está usando).

Este es el código de golf, por lo que gana el código más corto. Las lagunas estándar no están permitidas.

Casos de prueba (todo uso .para no perforado, xpara perforado):

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
fuente
2
Totalmente innecesario para resolver la pregunta, pero hay una pequeña galería ordenada de estas tarjetas / dispositivos aquí .
brhfl
puede usar cualquier carácter para perforar, y cualquier otro carácter para no perforar, ¿quiere decir que no tiene espacios en blanco?
Erik the Outgolfer
Sí, supongo que sería preferible ya que el espacio en blanco está permitido en otros lugares. Y en aras de poder ver. Se editará en, gracias.
brhfl
1
desafío genial ... tentado a escribir una respuesta FORTRAN 77, pero no sé cómo
jugarlo
@qwr Siéntase libre de crear una publicación de "Consejos para jugar golf en Fortran".
mbomb007

Respuestas:

3

Pyth, 25 bytes

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

Usos 0para perforado y "para no perforado.
Pruébalo aquí

Explicación

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

fuente
3

JavaScript (ES6), 60 54 bytes

Toma datos como una matriz de enteros. Devuelve una matriz binaria, con 0 = no perforado / 1 = perforado.

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

Pruébalo en línea!

Arnauld
fuente
3

05AB1E , 16 15 bytes

Utiliza 0 y 1 .

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

Pruébalo en línea!

Explicación

ε           }     # 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
fuente
2

Python 2 , 84 bytes

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

Pruébalo en línea!

0/1 se utiliza para no perforado / perforado.

Chas Brown
fuente
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)]

Pruébalo en línea!

ovs
fuente
Algo parece raro con tu quinta y sexta fila (parecen voltearse). [1,2,3] debería formar una línea diagonal hacia abajo, por ejemplo.
brhfl
@brhfl gracias por decírmelo, lo
arreglé
2

C (sonido metálico) , 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]));}

Pruébalo en línea!

Toma el número de entrada como cadena. Imprime resultados en .y Xcomo en los ejemplos.

Créditos

-1 byte gracias @ solo ASCII

GPS
fuente
1
107 , y se eliminó el encabezado; de lo contrario, deberá incluir el encabezado en el bytecount
solo ASCII el
¿Puede indicarme un consenso general de que las inclusiones de encabezado deben contarse para el recuento de bytes hacia soluciones funcionales (no programas completos)
GPS
1 , 2 , 3
solo ASCII
Sugerir en putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]))c-=48lugar dec-=48,putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]))
ceilingcat
2

J , 31 20 bytes

-11 bytes gracias a FrownyFrog!

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

Pruébalo en línea!

J , 31 bytes

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

Pruébalo en línea!

Toma la entrada como una lista de dígitos

0 - sin perforar, 1 - perforado

Explicación:

   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
fuente
@FrownyFrog ¡Gracias! Eres brillante como siempre!
Galen Ivanov
1
20
FrownyFrog
1

Carbón , 28 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Utiliza 0/1, pero puede admitir caracteres arbitrarios a un costo de 1 byte: ¡ Pruébelo en línea! . Explicación:

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
fuente