自動ダイヤラーをプログラムする


16

当時、電話の自動ダイヤラーは、ダイヤルする番号の各桁に1列のパンチカードを使用していました。列には7行ありました。最初の3行は、それぞれ番号(1,2,3)、(4,5,6)、および(7,8,9)を表しています。最後の3行は、この配置を90°回転させました:(1,4,7)、(2,5,8)、および(3,6,9)。中央の行は0に使用されました。1〜9の数字には、最初の3行に1つ、下の3行に1つの2つの穴が開けられます。ゼロでは、中央の行のみがパンチされます。レッツ・視覚化数6のためのパンチ列(.非パンチで、xパンチされ、左側のガイドだけでエンコーディングを説明することです):

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

ダイヤルしようとしている番号を含む行を探します。6の場合、これは2行目、9行目です。これらの2つの行はパンチされ、残りの5つの行はパンチされません。すべての数字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

パンチに任意の文字を使用できます。パンチされていない他の文字は、空白以外の文字を意味しますか?
エリックアウトゴルファー

はい、空白は他の場所で許可されているため、それが好ましいと思います。そして見ることができるようにするため。編集します、ありがとう。
brhfl

1
クールな挑戦... FORTRAN 77の回答を書き込もうとしましたが、ゴルフの仕方は
わかりませんでし

@qwr「Fortranでのゴルフのヒント」の投稿を作成してください。
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

05AB1E16 15バイト

01を使用します

ε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の384の 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)]

オンラインでお試しください!


5行目と6行目にはファンキーなものがあります(反転しているようです)。たとえば、[1,2,3]は斜め下の線を形成する必要があります。
brhfl

@brhfl私に言ってくれてありがとう、それを修正
ovs

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]))
ceilingcat

2

J31 20バイト

FrownyFrogのおかげで-11バイト!

(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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.