ASCIIアート電話のキーパッドを描く


8

可能な限り少ないバイト数で以下を描画します。

-------------------------
|       |  ABC  |  DEF  |
|   1   |   2   |   3   |
-------------------------
|  GHI  |  JKL  |  MNO  |
|   4   |   5   |   6   |
-------------------------
| PQRS  |  TUV  | WXYZ  |
|   7   |   8   |   9   |
-------------------------
|       |       |       |
|   *   |   0   |   #   |
-------------------------

1
なぜ広すぎる閉票?
Digital Trauma

1
えーと...出力アラートのハードコーディング!
wizzwizz4 2016年

3
この出力は、固定出力の課題に対して非常によく選択されているようです。幾何学的な構造があり、数字は順序付けられ、文字はアルファベット順に並べられており、ハードコーディングと生成には多くのトレードオフがあります。長さは、ハードコーディングが失われるほど十分に長いと思いますが、わかります。
xnor 2016年

QまたはZのない古いスタイルの電話は、生成が簡単です。
それはチャールズ

1
私自身はコードゴルファーではありませんが(もっと興味のあるチャレンジのアイデア)、特定の言語はアルファベット配列からPとWを削除してから手動で追加することでメリットがありますか?彼らが唯一のふさわしくないので。
rybo111 2016年

回答:


6

pb、240バイト

<[8]^w[Y!14]{w[X!24]{>[8]b[124]^b[124]v}vw[X!-8]{b[45]<}vv}>[12]^[12]b[49]>[12]w[T!8]{<[4]b[T+50]^<w[X%8!6]{b[65+T*3+X%8%3]>}>[10]vw[B!124]{<[24]vvv}t[T+1]}<[4]b[42]>[8]b[48]>[8]b[35]^[4]>w[B!0]{b[B+2]<}b[87]w[X!2]{<[5]w[B!0]{b[B+1]<}}b[80]

(このプログラムは、現在のバージョンのpbiで入力を要求します。これは、Y = -1になり、B変数がそれ自体を更新しようとするためです。入力を入力しても、何も壊れません。迷惑ですが、古いバージョンよりも優れています。何があっても入力を求められます。)

pbは、端末を2Dキャンバスとして扱うことに関するすべての言語です。出力するには、「ブラシ」(X変数とY変数の現在の値で表される点)をその文字を移動させたい場所に移動して、そこに配置する必要があります。単語をプリントアウトするようなものには面倒ですが、アートにはしばしば便利です。

このプログラムは、実際に質問が指定するものを正確には描画しません。(まだ、私に反対投票しないでください。説明させてください!)

ループでボックスを描くのはとても簡単ですが、落とし穴があります。次の形状を繰り返すと:

--------
|
|

あなたは箱を手に入れますが、右と下のものが開きます。余分な辺を手動で描画できますが、これにはバイトがかかります。これを回避するために、私のプログラムは実際に左と上に開いたエッジを使ってこれを描画します。

        |       |       |       |
        |       |       |       |
 --------------------------------
        |       |  ABC  |  DEF  |
        |   1   |   2   |   3   |
 --------------------------------
        |  GHI  |  JKL  |  MNO  |
        |   4   |   5   |   6   |
 --------------------------------
        | PQRS  |  TUV  | WXYZ  |
        |   7   |   8   |   9   |
 --------------------------------
        |       |       |       |
        |   *   |   0   |   #   |
 --------------------------------

しかしモノレール!それは仕様が言っていることではありません!他のものを描くのは簡単で、気分が良いので、それを描くことはできません。また、私はあなたの注目を集めていますが、あなたはとてもスマートでかわいいです。

Shh、shh、それは大丈夫です。pbを使用すると、座標に1つ以上の負の値を含むキャンバス上の点に「書き込む」ことができます。値はプログラムの実行中に保存されますが、XとYが両方とも> = 0であるポイントのみが実際に画面に書き込まれます。このプログラムは、この画像で色付けされた領域が負のXまたはYになるようにブラシを配置します。

追加の線は「描画」されますが、印刷されることはありません。

ループを実行してグリッドを作成した後、このプログラムは上位9つのボックスに入力します。最初のコードはハードコードされ、1が書き込まれ、プログラムが続行されます。他の8つはプログラムで生成されます。次のボックスに移動するためのコードを無視し、行が空になったときに通知するなど(ブラシは常にボックスの一番下の行と中央の列から始まると想定)、これは8回実行されます。

b[T+50]
^<w[X%8!6]{b[65+T*3+X%8%3]>}
t[T+1]

それbが文字を書き^v<>、ブラシを動かし、w[a!b]{}中括弧でコードを実行するコマンドであることを知っていてもa != b、これを理解するのは困難です。注意すべき最初の重要なことは、pbでは変数を定義できないことです。すべてのプログラムに6つあり、それらと一緒に暮らすことを学ぶ必要があります。2つ目Tは、変数の使用に慣れている方法で実際に使用できる唯一の変数です。値を割り当て、後でそれを読み取る。他のすべての変数が設定されていないとあなたがにしているかのみと副作用(と間接的に設定することができますキャンバス内のポイントについてあなたに何かを伝えるだけでするか^v<>変更XしてYも、ブラシの位置を変更し、。cセットP(P+1)%8、出力色も変更されます)。何の数字を書く必要があるのか​​、どの文字を書くのが不可能なのかを把握する。代わりに、このコードは番号のみを追跡し、それに基づいて文字を計算します。方法は次のとおりです。

b[T+50]                       # We start printing at box 2 with T==0, 0+50=='2'
^<                            # Go up and to the left of the number
w[X%8!6]{                     # Take the X coordinate mod 8 so it's like we're in
                              # the leftmost box. Until hitting the sixth cell:
    b[                          # Write this character:
      65                          # 'A'
      + T * 3                     # Number of current box - 2 (letters start at
                                  # 2) * 3 (3 letters per box)
      + X % 8 % 3                 # X % 8 makes every box behave like it's on the
                                  # left, % 3 puts 0 at the point where the first
                                  # letter goes, then 1, then 2. This is how each
                                  # letter is made different in a box.
    ]
    >                           # Move to the right
}
t[T+1]                        # Box is done, increase counter

ボックス7と9には3文字しか入力されないため、これは不完全です。したがって、下の行を埋めた後(単純なハードコーディング)、ボックス9の各文字を2増やし、Wを手動で配置します。同様に、ボックス7と8のすべての文字が1ずつ増加し、Pは手動で配置されます。

未ゴルフ:

<[8]^                         # Go to (-8, -1)
w[Y!14]{                      # While the brush is not on Y=14:
    w[X!24]{                      # While the brush is not on X=24:
        >[8]                          # Go right 8
        b[124]^b[124]v                # Draw a pipe at the current location and above it
    }
    vw[X!-8]{b[45]<}              # Go down and draw hyphens all the way until X=-8
    vv                            # Go down by 2 to start drawing next row
}
>[12]^[12]b[49]               # Write a 1 in the first box
>[12]                          # Go to the bottom pipe on the right of box 2       
w[T!8]{                       # While T is not 8:
    <[4]                          # Go to center cell of the box
    b[T+50]                       # Write the number that belongs there
    ^<w[X%8!6]{b[65+T*3+X%8%3]>}  # Write the letters
    >[10]v                        # Go to the next box
    w[B!124]{                     # If the next box isn't there:
        <[24]vvv                      # Go down a row
    }
    t[T+1]                        # Increase counter
}
<[4]b[42]>[8]b[48]>[8]b[35]   # Put the asterisk, 0 and hash in their boxes
^[4]>w[B!0]{b[B+2]<}          # Increase all letters in the 9th box by 2
b[87]                         # Put a W in the 9th box
w[X!2]{<[5]w[B!0]{b[B+1]<}}   # Increase all letters in the 7th/8th box by 1
b[80]                         # Put a P in the 7th box

6

Brainfuck、565文字(212バイト)

 1 +++++[>+++++>>>>+++++++++>>>>+++++++++++++<<<<<<<<<-]    //initialize
 2 >[->>+++++>>>>+++++<<<<<<]                               //initialize
 3 >>>++++++++[-<<<++++++>++++>>>>>>++++<<<<]               //initialize
 4 ++++++++++<->>>>-<<                                      //initialize
 5
 6 //print first block (123)
 7 >+++++[-<.....>]<<.>>>.>.......<.<++[->>..>.+.+.+<..<.<]<<.<.>>>+++[-<<<<...<+.>...>.>>>]<<.
 8 //print second block (456)
 9 >>+++++[-<.....>]<<.>>>.<+++[->>..>.+.+.+<..<.<]<<.<.>>>+++[-<<<<...<+.>...>.>>>]<<.
10 //print third block (789)
11 >>+++++[-<.....>]<<.>>>.>.>.+.+.+.+<..<.>..>.+.+.+<..<.>.>.+.+.+.+<..<.<<<.<.>>>+++[-<<<<...<+.>...>.>>>]<<.
12 //print fourth block (*0#)
13 >>+++++[-<.....>]<<.>>>.<+++[->>.......<.<]<<.<.<...<---------------.>...>.<...<++++++.>...>.<...<-------------.>...>.>>><<.
14 //print last block (the remaining dashes)
15 >>+++++[-<.....>]

プレーンコード:

+++++[>+++++>>>>+++++++++>>>>+++++++++++++<<<<<<<<<-]>[->>+++++>>>>+++++<<<<<<]>>>++++++++[-<<<++++++>++++>>>>>>++++<<<<]++++++++++<->>>>-<<>+++++[-<.....>]<<.>>>.>.......<.<++[->>..>.+.+.+<..<.<]<<.<.>>>+++[-<<<<...<+.>...>.>>>]<<.>>+++++[-<.....>]<<.>>>.<+++[->>..>.+.+.+<..<.<]<<.<.>>>+++[-<<<<...<+.>...>.>>>]<<.>>+++++[-<.....>]<<.>>>.>.>.+.+.+.+<..<.>..>.+.+.+<..<.>.>.+.+.+.+<..<.<<<.<.>>>+++[-<<<<...<+.>...>.>>>]<<.>>+++++[-<.....>]<<.>>>.<+++[->>.......<.<]<<.<.<...<---------------.>...>.<...<++++++.>...>.<...<-------------.>...>.>>><<.>>+++++[-<.....>]

3

バブルガム、103バイト

Hexdump:

00000000: d3d5 c501 b86a 1420 0048 3b3a 3983 6917  .....j. .H;:9.i.
00000010: 5737 200d 9631 84c8 2818 4169 6310 cd85  W7 ..1..(.Aic...
00000020: cb30 b069 ee1e 9e60 b55e de3e 60da d7cf  .0.i...`.^.>`...
00000030: 1f66 9a09 d414 5328 6d46 d0b4 80c0 a060  .f....S(mF.....`
00000040: b0da 90d0 3010 1d1e 1119 0533 cd1c 6a8a  ....0......3..j.
00000050: 0594 b624 ec36 984f 5169 b08c 1654 c400  ...$.6.OQi...T..
00000060: 4a2b e337 0d00 04                        J+.7...

退屈で実用的。


1
電話のキーパッドのような "退屈で実用的" :)
rybo111

2

Python 2、147バイト

print(("|%s"*3+"|\n")*2).join(["-"*25+"\n"]*5)%tuple(x.center(7)for x in" ABC DEF 1 2 3 GHI JKL MNO 4 5 6 PQRS TUV WXYZ 7 8 9    * 0 #".split(' '))

基本戦略の素案。文字列フォーマットを使用して、長い文字列にハードコードされたラベルを挿入します。


2

C、160バイト

j,k,l,m,n=65;main(i){for(i=325;i--;i%25||puts(""))l=i-139,putchar((k=i/25%3)?(j=i%25%8)?k-2?j-4?32:"123456789*0#"[m++]:j/3-1&&l*l!=64||i%290<75?32:n++:'|':45);}

文字が連続しているという事実を利用することは理にかなっています。このコードは、キーパッドの325文字を実行し、必要に応じてスペースまたは次の文字を印刷します。

未ゴルフ

i,    //main loop variable
j,    //x position within key
k,    //y position within key
l,    //distance from character 139 (the space immediately left of T)
m,    //symbol counter
n='A';//letter counter

main(){
  for(i=325;i--;i%25||puts(""))             //loop through 325 characters. puts() adds a newline at the end of each line of 25 
    l=i-139,                                //calculate l. if it is 8, we need to print P or W
    putchar((k=i/25%3)?                     //if row not divisible by 3
      (j=i%25%8)?                             //if position on row not a |
         k-2?                                   //if row mod 3 = 1
           j-4?' ':"123456789*0#"[m++]            //print a space or a character from the string (increment m for next time)
         :                                      //else row mod 3 must = 2
           j/3-1&&l*l!=64||i%290<75?' ':n++       //print a space or a letter according to formula (increment n to the next letter)
      :'|'                                    //else print |
    :
    '-')                                    //else print -
;}

// j/3-1 returns a 0 when in any of the three columns where letters are generally found
// l*l!=64 returns a 0 at the correct place fo P and W
// i%290<75 returns a 1 for keys 1,*,0,#, supressing the printing of letters/symbols

2

Java、296バイト

ゴルフ:

class a{static void main(String[]a){System.out.println("-\n|&|  ABC  |  DEF  |\n|$1$|$2$|$3$|\n-\n|  GHI  |  JKL  |  MNO  |\n|$4$|$5$|$6$|\n-\n| PQRS  |  TUV  | WXYZ  |\n|$7$|$8$|$9$|\n-\n|&|&|&|\n|$*$|$0$|$#$|\n-".replace("&","       ").replace("$","   ").replace("-","--------------------"));}}

未ゴルフ:

public class AsciiPhoneKeypad{
    public static void main(String []args){
        // - for twenty-five dashes
        // $ for three spaces
        // & for seven spaces
        System.out.println("-\n|&|  ABC  |  DEF  |\n|$1$|$2$|$3$|\n-\n|  GHI  |  JKL  |  MNO  |\n|$4$|$5$|$6$|\n-\n| PQRS  |  TUV  | WXYZ  |\n|$7$|$8$|$9$|\n-\n|&|&|&|\n|$*$|$0$|$#$|\n-"
        .replace("&","       ").replace("$","   ").replace("-","--------------------"));
     }
}

ただし、283バイト(末尾に改行が1つありますが、これはデフォルトで許可されています)ですが、それでも289バイトです。
Kevin Cruijssen 2017年

1

Lua、209バイト

ゴルフ:

a=("-\n|&|  ABC  |  DEF  |\n123|\n-\n|  GHI  |  JKL  |  MNO  |\n456|\n-\n| PQRS  |  TUV  | WXYZ  |\n789|\n-\n|&|&|&|\n*0#|\n-"):gsub("&","       "):gsub("([0-9*#])","|   %1   "):gsub("-",("-"):rep(25))print(a)

未ゴルフ:

-- "&" for seven spaces
-- "1" -> "|   1   "
-- "-" -> twenty-five dashes

a="-\n|&|  ABC  |  DEF  |\n123|\n-\n|  GHI  |  JKL  |  MNO  |\n456|\n-\n| PQRS  |  TUV  | WXYZ  |\n789|\n-\n|&|&|&|\n*0#|\n-"

a = a:gsub("&","       ")

a = a:gsub("([0-9*#])","|   %1   ")

a = a:gsub("-",("-"):rep(25))

print(a)

1

JavaScript(ES6)、184 182バイト

f=
_=>`-
! |  ABC  |  DEF  |
!1!2!3|
-
|  GHI  |  JKL  |  MNO  |
!4!5!6|
-
| PQRS  |  TUV  | WXYZ  |
!7!8!9|
-
! ! ! |
!*!0!#|
-`.replace(/-|!./g,s=>s<`-`?`|   ${s[1]}   `:s.repeat(25))
;document.write('<pre>'+f());

ダッシュの行は明らかに圧縮可能であり、数字もそうでしたが、文字では何もできませんでした。編集:@Shaggyのおかげで2バイトのうちの1バイトが保存されました。


バイトを保存します:replace(/-|!./g,s=>s=="-"?s.repeat(25):"| ${s[1]} ")-引用符をバッククォートで置き換えます。文字グループを埋めるためにいくつかのことを試しましたが、できる最高のことは194バイトでした。
Shaggy

1
@Shaggyありがとう、そして私もなんとかそれを切り落とすことができました!
ニール


0

Perl、142 + 1 = 143バイト

$ perl -MCompress::Zlib x.pl
$ cat x.pl
print uncompress(<DATA>)
__DATA__
x<9c><d3><d5><c5>^A<b8>j^T ^@H;:9<83>i^WW7 ^M<96>1<84><c8>(^XAic<10><cb>0<b0>i<ee>^^<9e>`<b5>^<de>>`<da><d7><cf>^_f<9a> <d4>^TS(mFд<80> `<b0>ڐ<d0>0^P^]^^^Q^Y^E3<cd>^\j<8a>^E<94><b6>$<ec>6<98>OQi<b0><8c>^VT<c4>^@J+<e3>7^M^@^D:@k

印刷できない文字なので、uuencodeされたバージョンは以下のとおりです。

$ cat x.pl.uue
begin 664 x.pl
M<')I;G1?=6YC;VUP<F5S<R@\1$%403XI"E]?1$%405]?"GB<T]7%`;AJ%"``
M2#LZ.8-I%U<W(`V6,83(*!A!:6,0S87+,+!I[AZ>8+5>WCY@VM?/'V::"=04
M4RAM1M"T@,"@8+#:D-`P$!T>$1D%,\T<:HH%E+8D[#:83U%IL(P65,0`2BOC
(-PT`!#I`:PH`
`
end
$

待って、それ-M...も数えてはいけませんか?
Ven

0

Python 3.5-240バイト:

k=' ABC DEF 1 2 3 GHI JKL MNO 4 5 6 PQRS TUV WXYZ 7 8 9    * 0 #'.split(' ')
for _ in range(8):
 print('\n',end='')
 if _%2==0:print("-"*27+'\n',end='')
 [print('|{}|'.format(g.center(7)),end='')for g in k[:3:1]];del k[:3:1]
print('\n'+"-"*27)

少し長いかもしれませんが、OPが必要とするものだけを出力します。


0

Python 2、200

r=str.replace;print r(r(r(r(r("""-.|  ABC`DEF`
,1=,2=,3 `-|  GHI`JKL`MNO`
,4=,5=,6 `-| PQRS`TUV`WXYZ |
,7=,8=,9 `-...|
,*=,0=,# `-""","-","\n"+"-"*25+"\n"),".",",= "),",","|="),"`","  |  "),"=","   ")

シンプルな交換戦略。


0

Python 2、168バイト

組み込みの圧縮を使用しない簡単な方法:

for i in range(13):print['-'*25,'|'+'|'.join(["123456789*0#"," ABC DEF GHI JKL MNO PQRS TUV WXYZ   ".split(' ')][i%3%2][i/3%4*3+m].center(7)for m in[0,1,2])+'|'][i%3>0]

0

///、154文字

/%/=====//=/-----//?/ ! //!/}  //{/ }//}/  |//(/|   /%
(  !ABC!DEF}
(1?2?3{
%
|  GHI!JKL!MNO}
(4?5?6{
%
| PQRS!TUV} WXYZ}
(7?8?9{
%
(  !   !   }
(*?0?#{
%

0

GML(ゲームメーカー言語)8.0、269バイト

a='-------------------------'b='   |   'c='  |#|   'draw_text(0,0,a+"#|       |  ABC  |  DEF"+c+"1"+b+"2"+b+"3   |#"+a+"#|  GHI  |  JKL  |  MNO"+c+"4"+b+"5"+b+"6   |#"+a+"#| PQRS  |  TUV  | WXYZ"+c+"7"+b+"8"+b+"9   |#"+a+"#|    "+b+" "+b+"  "+c+"*"+b+"0"+b+"\#   |#"+a)

ゲームメーカーで#は、は改行文字であり、次の方法でエスケープできます。\#


0

Python 2、134バイト

このソースには印刷できない文字が含まれているため、でデコードできる16進ダンプとして表示されxxd -rます。

00000000: efbb bf70 7269 6e74 2778 01d3 c505 b86a  ...print'x.....j
00000010: 1420 5c30 483b 3a39 8369 1757 3720 5c72  . \0H;:9.i.W7 \r
00000020: 9631 84c8 2818 4169 6310 cd85 d734 770f  .1..(.Aic....4w.
00000030: 4fb0 5a2f 6f1f 30ed ebe7 0f33 cd04 6a8a  O.Z/o.0....3..j.
00000040: 2994 3623 685a 4060 5030 586d 4868 1888  ).6#hZ@`P0XmHh..
00000050: 0e8f 888c 8299 660e 35c5 024a 5b12 345c  ......f.5..J[.4\
00000060: 7202 3068 b08c 1654 c45c 304a 2be3 375c  r.0h...T.\0J+.7\
00000070: 725c 3004 3a40 6b27 2e64 6563 6f64 6528  r\0.:@k'.decode(
00000080: 277a 6970 2729                           'zip')


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