Програмуйте мого автодиалера


16

Ще в той день телефонні автомайдани використовували перфокарти з одним стовпцем для кожної цифри номера, що набирається. Стовпці мали сім рядів. Перші три ряди представляли числа (1,2,3), (4,5,6) та (7,8,9) відповідно. Останні три ряди обертали цю схему на 90 °: (1,4,7), (2,5,8) та (3,6,9). Середній ряд використовувався для 0. Будь-яка цифра 1-9 мала б два отвори - один у перших трьох рядах, а один у нижньому три ряди. Нуль мав би пробити лише середній ряд. Давайте візуалізуємо перфорований стовпчик для числа 6 ( .є незапущеним, xпробитим, керівництво зліва - лише для ілюстрації кодування):

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

Ми шукаємо, який рядок (и) містить номер, який ми намагаємось набрати. Для 6 це другий ряд, а дев'ятий ряд. Ці два ряди пробиваються першими, решта п’ять рядів незапущені. Ось перфоровані схеми для всіх цифр 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

Ваша мета - (написати програму або функцію) пробити ці картки для мене.

Введення: Число, прийняте у будь-якому розумному форматі (рядок, ціле число, список цілих чисел та & c), що не перевищує 9999999999999.

Вихід: сітка перфорованих стовпців, що відповідає вводу числа. Вам не потрібні заголовки або додаткові відстані, показані вище, просто самі пробиті колонки. Провідні / кінцеві нові рядки в порядку, як і пробіл між рядками / стовпцями , доки це є послідовним . Якщо говорити про те, доки вони несуперечливі, ви можете використовувати будь-який (непробільний проміжок) символ для удару, а будь-який інший символ для незбитого (хоча це має бути очевидним, вкажіть, які символи ви використовуєте).

Це код-гольф, тому найкоротший код виграє. Стандартні лазівки заборонені.

Тестові випадки (усі використовуються .для незабитого, xдля перфорованого):

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
Зовсім непотрібне для вирішення питання, але тут є акуратна маленька галерея цих карток / пристроїв .
brhfl

ви можете використовувати будь-який символ для перфорованого, а будь-який інший символ для незапущеного ви маєте на увазі будь-які символи, що не пробілюються ?
Ерік Аутгольфер

Так, я вважаю, що це було б кращим, оскільки пробіл дозволений в інших місцях. І заради того, щоб мати можливість бачити. Буде редагувати, спасибі
brhfl

1
прикольний виклик ... спокусився написати відповідь FORTRAN 77, але idk як
пограти в

@qwr Не соромтеся створити пост "Поради щодо гольфу у Фортран".
mbomb007

Відповіді:



3

Pyth, 25 байт

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

Використовується 0для перфорованих і "для незапущених.
Спробуйте тут

Пояснення

.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

05AB1E , 16 15 байт

Використовує 0 і 1 .

ε9ÝÀ3ôD¨ø«¢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



2

Python 3 , 84 80 байт

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

Спробуйте в Інтернеті!


Щось здається стильним у вашому п'ятому та шостому рядах (вони, здається, перевернуті). [1,2,3], наприклад, має утворювати діагональну лінію вниз.
brhfl

@brhfl спасибі за те, що ви сказали, виправили це
1818

2

C (стук) , 108 107 байт

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

Спробуйте в Інтернеті!

Приймає номер введення як рядок. Друкує вихід у .та, Xяк у прикладах.

Кредити

-1 байт дякую @ ASCII


1
107 , і видалено заголовок, інакше вам потрібно буде включити заголовок до поточного рахунку
лише для ASCII

Чи можете ви, будь ласка, вказати мені на загальну думку про те, що включення заголовків потрібно вважати підрахунком байтів до функціональних рішень (а не повних програм)
GPS


Запропонувати putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]))c-=48замістьc-=48,putchar(".X"[(c--?16<<c%3|1<<c/3:8)>>i&1]))
roofcat

2

J , 31 20 байт

-11 байт завдяки FrownyFrog!

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

Спробуйте в Інтернеті!

J , 31 байт

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

Спробуйте в Інтернеті!

Приймає введення як перелік цифр

0 - незапущений, 1 - перфорований

Пояснення:

   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 Дякую! Ви блискучі, як завжди!
Гален Іванов



1

Вугілля деревне , 28 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Використовує 0/1, але може підтримувати довільні символи вартістю 1 байт: Спробуйте в Інтернеті! . Пояснення:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.