Запрограммируйте мой автодозвон


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

Ваша цель состоит в том, чтобы (написать программу или функцию) пробить эти карты для меня.

Входные данные: число, принятое в любом приемлемом формате (строка, целое число, список целых чисел и т. Д.), Не должно превышать 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

Вы можете использовать любой символ для перфорированных символов, и любой другой символ для неперфорированных вы имеете в виду любые непробельные символы?
Эрик Outgolfer

Да, я полагаю, что это было бы предпочтительнее, поскольку пробелы разрешены в других местах. И ради возможности видеть. Буду редактировать, спасибо.
brhfl

1
охладиться вызов ... искушенного написать FORTRAN 77 ответ, но ИДК , как гольф это
qwr

@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

JavaScript (ES6), 60 54 байта

Принимает ввод как массив целых чисел. Возвращает двоичную матрицу с 0 = неперфорированная / 1 = перфорированная.

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

Попробуйте онлайн!


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 спасибо, что сказали мне, исправили это
ovs

2

С (лязг) , 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 , и удалил заголовок, в противном случае вам нужно будет включить заголовок в bytecount
только для 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]))
floorcat

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.