Programma il mio autodialer


16

In passato, gli autodialer telefonici utilizzavano schede perforate con una colonna per ogni cifra del numero da comporre. Le colonne avevano sette file. Le prime tre righe rappresentavano rispettivamente i numeri (1,2,3), (4,5,6) e (7,8,9). Le ultime tre file hanno ruotato questa disposizione di 90 °: (1,4,7), (2,5,8) e (3,6,9). La riga centrale è stata usata per 0. Ogni cifra 1-9 avrebbe due fori: uno nelle prime tre file e uno nelle tre file in basso. Zero avrebbe solo un pugno nella riga centrale. Visualizziamo la colonna punzonata per il numero 6 (non .è perforata, xè perforata, la guida a sinistra è solo per illustrare la codifica):

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

Cerchiamo quali righe contengono il numero che stiamo cercando di comporre. Per 6, questa è la seconda riga e la nona riga. Queste due righe vengono perforate, le restanti cinque righe non vengono scrutate. Ecco i motivi perforati per tutte le cifre 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

Il tuo obiettivo è (scrivere un programma o una funzione per) dare un pugno a queste carte per me.

Input: un numero, preso in qualsiasi formato ragionevole (stringa, intero, elenco di numeri interi, ecc.), Non superiore a 9999999999999.

Output: la griglia di colonne perforate corrispondente all'immissione del numero. Non sono necessarie le intestazioni o la spaziatura aggiuntiva mostrate sopra, ma solo le colonne perforate stesse. Le nuove righe iniziali / finali sono ok, così come lo spazio tra righe / colonne purché sia ​​coerente . A proposito, purché siano coerenti, è possibile utilizzare qualsiasi carattere (non bianco) per i pugni e qualsiasi altro carattere per non battuto (mentre dovrebbe essere ovvio, si prega di specificare quali caratteri si stanno utilizzando).

Questo è code-golf, quindi vince il codice più corto. Le scappatoie standard non sono ammesse.

Casi di test (tutti usati .per non perforati, xperforati):

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

2
Totalmente inutile per risolvere la domanda, ma qui c'è una piccola galleria ordinata di queste schede / dispositivi .
brhfl,

puoi usare qualsiasi personaggio per il pugno, e qualsiasi altro personaggio per il non battuto intendi dei caratteri non bianchi?
Erik the Outgolfer

Sì, suppongo che sarebbe preferibile poiché lo spazio bianco è consentito altrove. E per il gusto di poter vedere. Si modifica in, grazie.
brhfl,

1
bella sfida ... tentata di scrivere una risposta FORTRAN 77, ma idk come
giocarla

@qwr Sentiti libero di creare un post "Suggerimenti per giocare a golf a Fortran".
mbomb007,

Risposte:



3

Pyth, 25 byte

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

Utilizza 0per punzonato e non "battuto.
Provalo qui

Spiegazione

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

3

JavaScript (ES6), 60 54 byte

Accetta l'input come una matrice di numeri interi. Restituisce una matrice binaria, con 0 = unpunched / 1 = punzonato.

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

Provalo online!


3

05AB1E , 16 15 byte

Usa 0 e 1 .

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

Provalo online!

Spiegazione

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



2

Python 3 , 84 80 byte

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

Provalo online!


Qualcosa sembra funky con la tua quinta e sesta fila (sembrano essere capovolte). [1,2,3] dovrebbe formare una linea diagonale verso il basso, per esempio.
brhfl,

@brhfl grazie per avermelo detto, risolto
ovs

2

C (clang) , 108 107 byte

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

Provalo online!

Accetta il numero di input come stringa. Stampa l'output in .e Xcome negli esempi.

Titoli di coda

-1 byte grazie @ solo ASCII


1
107 , e rimosso l'intestazione altrimenti dovresti includere l'intestazione nel bytecount
solo ASCII

Potete per favore indicarmi il consenso generale sul fatto che le inclusioni di intestazione devono essere conteggiate per il conteggio dei byte verso soluzioni di funzioni (non programmi completi)
GPS

1 , 2 , 3
ASCII il

Suggerisci putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]))c-=48invece dic-=48,putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]))
ceilingcat il

2

J , 31 20 byte

-11 byte grazie a FrownyFrog!

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

Provalo online!

J , 31 byte

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

Provalo online!

Prende l'input come un elenco di cifre

0 - non perforato, 1 - perforato

Spiegazione:

   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

@FrownyFrog Grazie! Sei brillante come sempre!
Galen Ivanov,



1

Carbone , 28 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Utilizza 0/1, ma può supportare caratteri arbitrari al costo di 1 byte: provalo online! . Spiegazione:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.