Gambarlah tombol telepon seni ASCII

8

Gambarlah berikut ini dalam byte sesedikit mungkin:

-------------------------
|       |  ABC  |  DEF  |
|   1   |   2   |   3   |
-------------------------
|  GHI  |  JKL  |  MNO  |
|   4   |   5   |   6   |
-------------------------
| PQRS  |  TUV  | WXYZ  |
|   7   |   8   |   9   |
-------------------------
|       |       |       |
|   *   |   0   |   #   |
-------------------------
rybo111
sumber
1
Mengapa pemungutan suara terlalu luas?
Digital Trauma
1
Erm ... peringatan keluaran hardcoding!
wizzwizz4
3
Output ini tampaknya dipilih dengan sangat baik untuk tantangan fixed-output. Ada struktur geometris, nomor-nomornya dipesan, huruf-hurufnya disusun menurut abjad dan potongan - banyak kemungkinan tradeoffs untuk hardcoding versus menghasilkan. Saya pikir panjangnya cukup tinggi sehingga hardcoding akan hilang, tetapi kita akan lihat.
xnor
Telepon gaya lama tanpa Q atau Z akan lebih mudah dibuat.
Bukan berarti Charles
1
Saya sendiri bukan pegolf kode (gagasan tantangan yang lebih tertarik) tetapi apakah bahasa tertentu akan mendapat manfaat dengan menghapus P dan W dari array alfabet dan kemudian menambahkannya secara manual? Karena hanya mereka berdua yang keluar dari tempatnya.
rybo111

Jawaban:

6

pb , 240 byte

<[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]

(Program ini akan meminta input dalam versi pbi saat ini, karena ia menuju ke Y = -1 dan Bvariabel mencoba untuk memperbarui sendiri. Bahkan jika Anda memasukkan input, tidak ada yang akan pecah. Ini menjengkelkan tetapi lebih baik daripada versi yang lama yang meminta input tidak peduli apa.)

pb adalah bahasa yang digunakan untuk memperlakukan terminal sebagai kanvas 2D. Untuk menghasilkan, Anda harus memindahkan "kuas" (titik yang diwakili oleh nilai saat ini dari variabel X dan Y) ke tempat Anda ingin karakter itu pergi dan meletakkannya di sana. Ini rumit untuk hal-hal seperti mencetak kata tetapi untuk seni sering kali nyaman.

Program ini sebenarnya tidak menggambarkan dengan tepat apa yang ditentukan pertanyaan. (Tunggu, jangan downvote saya dulu! Biarkan saya jelaskan!)

Menggambar kotak dengan loop cukup mudah, tetapi ada tangkapan. Jika Anda mengulangi bentuk berikut:

--------
|
|

Anda memang mendapatkan kotak, tetapi yang kanan dan bawah akan terbuka. Anda dapat menggambar sisi tambahan secara manual, tetapi itu membutuhkan byte. Untuk menyiasati ini, program saya benar-benar menggambar ini, dengan tepi terbuka di sebelah kiri dan atas:

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

Tapi monorel! Bukan itu yang dikatakan spek! Anda tidak bisa hanya menggambar sesuatu yang lain karena lebih mudah dan Anda merasa menyukainya! Juga, sementara saya mendapatkan perhatian Anda, Anda sangat cerdas dan imut.

Sst, sst, tidak apa-apa. pb memungkinkan Anda untuk "menulis" ke titik di kanvas dengan satu atau lebih nilai negatif dalam koordinatnya. Nilai disimpan saat program berjalan, tetapi hanya titik di mana X dan Y keduanya> = 0 yang benar-benar ditulis ke layar. Program ini memposisikan sikat sehingga area yang berwarna pada gambar ini memiliki X atau Y negatif:

Meskipun garis ekstra "ditarik", mereka tidak pernah dicetak.

Setelah mengulang dan membuat kisi, program ini mengisi sembilan kotak teratas. Yang pertama adalah hardcoded, 1 ditulis dan program melanjutkan. Delapan lainnya dihasilkan secara terprogram. Mengabaikan kode untuk pindah ke kotak berikutnya, memperhatikan ketika baris kosong, dll (anggap sikat selalu dimulai di baris bawah kotak dan di kolom tengah), inilah yang dijalankan delapan kali:

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

Bahkan mengetahui itu badalah perintah untuk menulis karakter, ^v<>pindahkan kuas dan w[a!b]{}jalankan kode dalam kurung kurawal sampai a != b, ini sulit untuk diikuti. Hal penting pertama yang perlu diperhatikan adalah Anda tidak dapat mendefinisikan variabel di pb. Ada enam di setiap program dan Anda harus belajar untuk hidup bersama mereka. Kedua, Tadalah satu-satunya variabel yang Anda benar-benar dapat menggunakan cara Anda terbiasa menggunakan variabel; menetapkan nilai dan kemudian membacanya nanti. Setiap variabel lain tidak dapat disetel dan hanya memberi tahu Anda tentang titik di kanvas tempat Anda berada atau hanya dapat ditetapkan secara tidak langsung dan dengan efek samping ( ^v<>ubah Xdan Y, yang juga mengubah lokasi kuas. cAtur Pke(P+1)%8, yang juga mengubah warna output). Menyimpan konter untuk nomor apa yang perlu ditulis dan surat mana yang tidak mungkin. Sebagai gantinya, kode ini hanya melacak nomor dan mencari tahu huruf-huruf berdasarkan itu. Begini caranya:

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

Ini tidak sempurna, karena hanya 3 huruf yang dimasukkan ke dalam kotak 7 dan 9. Jadi, setelah mengisi baris bawah (hardcoding sederhana), setiap huruf dalam kotak 9 bertambah 2 dan W ditempatkan secara manual. Demikian pula, setiap huruf dalam kotak 7 dan 8 bertambah 1 dan P ditempatkan secara manual.

Tidak Disatukan:

<[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
monmon bawah tanah
sumber
6

Brainfuck, 565 karakter (212 byte)

 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 >>+++++[-<.....>]

Kode polos:

+++++[>+++++>>>>+++++++++>>>>+++++++++++++<<<<<<<<<-]>[->>+++++>>>>+++++<<<<<<]>>>++++++++[-<<<++++++>++++>>>>>>++++<<<<]++++++++++<->>>>-<<>+++++[-<.....>]<<.>>>.>.......<.<++[->>..>.+.+.+<..<.<]<<.<.>>>+++[-<<<<...<+.>...>.>>>]<<.>>+++++[-<.....>]<<.>>>.<+++[->>..>.+.+.+<..<.<]<<.<.>>>+++[-<<<<...<+.>...>.>>>]<<.>>+++++[-<.....>]<<.>>>.>.>.+.+.+.+<..<.>..>.+.+.+<..<.>.>.+.+.+.+<..<.<<<.<.>>>+++[-<<<<...<+.>...>.>>>]<<.>>+++++[-<.....>]<<.>>>.<+++[->>.......<.<]<<.<.<...<---------------.>...>.<...<++++++.>...>.<...<-------------.>...>.>>><<.>>+++++[-<.....>]
Biarawati Bocor
sumber
3

Bubblegum , 103 byte

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...

Membosankan dan praktis.

Gagang pintu
sumber
1
"Membosankan dan praktis" seperti keypad ponsel :)
rybo111
2

Python 2, 147 byte

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(' '))

Draf cepat strategi dasar. Menggunakan pemformatan string untuk menyisipkan label, yang di-hardcode dalam string panjang.

Tidak
sumber
2

C, 160 byte

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

Masuk akal untuk memanfaatkan fakta bahwa surat-surat itu berurutan. Kode ini berjalan melalui 325 karakter keypad, dan mencetak spasi atau huruf berikutnya sesuai kebutuhan.

Tidak disatukan

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
Level River St
sumber
2

Java, 296 byte

Golf:

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("-","--------------------"));}}

Tidak Disatukan:

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("-","--------------------"));
     }
}
Biarawati Bocor
sumber
283 byte (memang memiliki single trailing new-line, tapi ini diizinkan secara default), tanpa masih 289 byte , meskipun.
Kevin Cruijssen
1

Lua, 209 byte

Golf:

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)

Tidak Disatukan:

-- "&" 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)
Biarawati Bocor
sumber
1

JavaScript (ES6), 184 182 byte

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());

Deretan tanda hubung jelas-jelas dapat dikompresi dan angka-angkanya juga tetapi saya tidak dapat melakukan apa pun dengan huruf-huruf itu. Sunting: Disimpan 1 dari 2 byte berkat @Shaggy.

Neil
sumber
Simpan satu byte dengan: replace(/-|!./g,s=>s=="-"?s.repeat(25):"| ${s[1]} ")- mengganti tanda kutip dengan backticks. Saya mencoba beberapa hal untuk melengkapi grup surat tetapi yang terbaik yang bisa saya lakukan adalah 194 byte.
Shaggy
1
@Shaggy Terima kasih, dan saya berhasil mencukur byte lain dari itu juga!
Neil
0

CJam, 128 byte

'-25*N+:A" ABC DEF GHI JKL MNO PQRS TUV WXYZ   "S/3/{['|\{_,5\-S*\"  |"}%N]:+:+}%"123456789*0#"1/3/{['|\{S3*_@@'|}%N]:+:+}%.+A*A

Cobalah online.

GamrCorps
sumber
0

Perl, 142 + 1 = 143 byte

$ 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

Karakter yang tidak dapat dicetak, jadi versi yang uuencode di bawah ini.

$ 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
$
steve
sumber
Tunggu, tidakkah -M...harus dihitung juga?
Ven
0

Python 3.5 - 240 byte:

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)

Mencetak apa yang diinginkan OP, meskipun mungkin agak panjang.

R. Kap
sumber
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"),".",",= "),",","|="),"`","  |  "),"=","   ")

Strategi penggantian yang sederhana.

Oliver Ni
sumber
0

Python 2, 168 byte

Metode langsung tanpa menggunakan kompresi bawaan:

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]
kuintopia
sumber
0

/// , 154 karakter

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

GML (Game Maker Language) 8.0, 269 byte

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)

Di Game Maker, #adalah karakter baris baru dan dapat diloloskan oleh\#

Timtech
sumber
0

Python 2, 134 byte

Sumber ini mengandung karakter yang tidak dapat dicetak, sehingga disajikan sebagai hexdump yang dapat didekodekan 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')
Anders Kaseorg
sumber
0

05AB1E , 91 byte (tidak bersaing)

•O«ò•3B7ô'-7×.ø'|ìε3×}'|«D¦Ð)˜»A3ô5£ðý"pqrs tuvwxyz"‚J5úR12úRv0y.;}1ð:2'A:9LJ"*0#"«v'Ay.;}u

Cobalah online!

Guci Gurita Ajaib
sumber
0

J , 105 103 byte

9!:7'|'9}11#'-'
echo'PW'(7 2;7 18)}":_3;/\(12{.'',8 3$65{26-.&'PW'\a.),:&(5|.7{.])"1' ',.'123456789*0#'

Cobalah online!

FrownyFrog
sumber