Zaprogramuj mój autodialer

16

Wcześniej auto-dialery telefoniczne używały kart dziurkowanych z jedną kolumną dla każdej cyfry wybieranego numeru. Kolumny miały siedem rzędów. Pierwsze trzy rzędy reprezentowały odpowiednio liczby (1,2,3), (4,5,6) i (7,8,9). Ostatnie trzy rzędy obróciły to ustawienie o 90 °: (1,4,7), (2,5,8) i (3,6,9). Środkowy rząd został użyty jako 0. Każda cyfra 1-9 miałaby dwa otwory - jeden w pierwszych trzech rzędach, a drugi w dolnych trzech rzędach. Zero wybiłoby tylko środkowy rząd. Wizualizujmy dziurkowaną kolumnę dla liczby 6 (nie .jest dziurkowana, xjest dziurkowana, przewodnik po lewej ilustruje kodowanie):

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

Szukamy, które wiersze zawierają numer, który próbujemy wybrać. Dla 6 jest to drugi rząd i dziewiąty rząd. Te dwa rzędy są wykrawane, pozostałe pięć rzędów nie jest wykrawanych. Oto wybite wzory dla wszystkich cyfr 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

Twoim celem jest (napisanie programu lub funkcji) wybicie dla mnie tych kart.

Dane wejściowe: liczba w dowolnym rozsądnym formacie (ciąg, liczba całkowita, lista liczb całkowitych i c.), Nieprzekraczająca 9999999999999.

Dane wyjściowe: Siatka perforowanych kolumn odpowiadająca wprowadzonej liczbie. Nie potrzebujesz nagłówków ani dodatkowych odstępów pokazanych powyżej, tylko same kolumny perforowane. Początkowe / końcowe znaki nowej linii są w porządku, podobnie jak spacje między wierszami / kolumnami o ile są spójne . Mówiąc o, pod warunkiem, że są one spójne, możesz użyć dowolnego znaku (bez białych znaków) do wybijania znaków i dowolnego innego znaku do bez perforacji (chociaż powinno to być oczywiste, określ, jakich znaków używasz).

To jest golf golfowy, więc wygrywa najkrótszy kod. Standardowe luki są niedozwolone.

Przypadki testowe (wszystkie są używane w .przypadku bez xdziurkowania , do dziurkowania):

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
źródło
2
Zupełnie niepotrzebne do rozwiązania pytania, ale tutaj jest schludna mała galeria tych kart / urządzeń .
brhfl 16.04.18
możesz użyć dowolnego znaku do wybicia, a innego znaku do wybicia masz na myśli jakiekolwiek znaki niebiałe ?
Erik the Outgolfer
Tak, przypuszczam, że byłoby to lepsze, ponieważ białe znaki są dozwolone gdzie indziej. I dla dobra widzenia. Wprowadzę zmiany, dzięki.
brhfl
1
fajne wyzwanie ... kusiło mnie, aby napisać odpowiedź na FORTRAN 77, ale nie
wiem,
@qwr Utwórz post „Wskazówki dotyczące gry w golfa w Fortranie”.
mbomb007

Odpowiedzi:

3

Pyth, 25 bajtów

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

Używa 0do dziurkowania i "do dziurkowania.
Wypróbuj tutaj

Wyjaśnienie

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

źródło
3

JavaScript (ES6), 60 54 bajtów

Pobiera dane wejściowe jako tablicę liczb całkowitych. Zwraca macierz binarną, gdzie 0 = nieprzebity / 1 = wybity .

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

Wypróbuj online!

Arnauld
źródło
3

05AB1E , 16 15 bajtów

Używa 0 i 1 .

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

Wypróbuj online!

Wyjaśnienie

ε           }     # 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
źródło
2

Python 2 , 84 bajtów

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

Wypróbuj online!

0/1 jest używany w przypadku braku dziurkowania / dziurkowania.

Chas Brown
źródło
2

Python 3 , 84 80 bajtów

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

Wypróbuj online!

ovs
źródło
Coś wydaje się dziwne w piątym i szóstym rzędzie (wydają się być odwrócone). [1,2,3] powinien na przykład tworzyć linię ukośną w dół.
brhfl 16.04.18
@brhfl dzięki za poinformowanie mnie, naprawić go
OVS
2

C (clang) , 108 107 bajtów

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

Wypróbuj online!

Pobiera numer wejściowy jako ciąg. Drukuje dane wyjściowe w .iX jak w przykładach.

Kredyty

-1 bajty dzięki @ ASCII-only

GPS
źródło
1
107 i usunięto nagłówek, w przeciwnym razie trzeba by dołączyć nagłówek do bajtu
tylko ASCII
Czy możesz mi wskazać ogólny konsensus, że inkluzje nagłówków należy liczyć w celu liczenia bajtów w stosunku do rozwiązań funkcyjnych (niepełne programy)
GPS
1 , 2 , 3
tylko ASCII
Zaproponuj putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]))c-=48zamiastc-=48,putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]))
ceilingcat
2

J , 31 20 bajtów

-11 bajtów dzięki FrownyFrog!

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

Wypróbuj online!

J , 31 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako listę cyfr

0 - nie dziurkowany, 1 - dziurkowany

Wyjaśnienie:

   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 Iwanow
źródło
@FrownyFrog Dziękujemy! Jesteś genialny jak zawsze!
Galen Iwanow
1
20
FrownyFrog
1

Węgiel drzewny , 28 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wykorzystuje 0/1, ale może obsługiwać dowolne znaki kosztem 1 bajtu: Wypróbuj online! . Wyjaśnienie:

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
źródło
0

Perl 5 -F , 52 bajty

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

Wypróbuj online!

Używa 1do dziurkowania i 0do dziurkowania.

Xcali
źródło