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


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.