Vẽ bàn phím điện thoại nghệ thuật ASCII


8

Vẽ các mục sau trong vài byte ít nhất có thể:

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

1
Tại sao quá gần bỏ phiếu?
Chấn thương kỹ thuật số

1
Erm ... cảnh báo đầu ra mã hóa!
wizzwizz4

3
Đầu ra này có vẻ được lựa chọn rất tốt cho thử thách đầu ra cố định. Có cấu trúc hình học, các số được sắp xếp theo thứ tự, các chữ cái được sắp xếp theo thứ tự chữ cái và khối - rất nhiều sự đánh đổi có thể xảy ra đối với mã hóa cứng so với tạo. Tôi nghĩ rằng độ dài đủ cao để mã hóa cứng sẽ mất, nhưng chúng ta sẽ thấy.
xnor

Một chiếc điện thoại kiểu cũ không có Q hoặc Z sẽ dễ dàng tạo ra hơn.
Không phải là Charles

1
Bản thân tôi không phải là một người chơi mã (những ý tưởng thách thức thú vị hơn) nhưng liệu một số ngôn ngữ nhất định có được lợi từ việc loại bỏ P và W khỏi một mảng bảng chữ cái và sau đó thêm chúng vào bằng tay không? Vì họ là hai người duy nhất ra khỏi vị trí.
rybo111

Câu trả lời:


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]

(Chương trình này sẽ nhắc nhập liệu trong phiên bản hiện tại của pbi, vì nó đi đến Y = -1 và B cố gắng biến để cập nhật chính nó. Thậm chí nếu bạn làm nhập đầu vào, không có gì sẽ phá vỡ. Đó là khó chịu nhưng nó tốt hơn so với phiên bản cũ nhắc nhở đầu vào không có vấn đề gì.)

pb là một ngôn ngữ về việc coi thiết bị đầu cuối như một khung vẽ 2D. Để xuất ra, bạn phải di chuyển "cọ vẽ" (một điểm được biểu thị bằng các giá trị hiện tại của biến X và Y) đến nơi bạn muốn ký tự đó đi và đặt nó ở đó. Nó cồng kềnh cho những thứ như in ra một từ nhưng đối với nghệ thuật thì nó thường tiện lợi.

Chương trình này không thực sự rút ra chính xác những gì câu hỏi chỉ định. (Đợi đã, đừng coi thường tôi! Hãy để tôi giải thích!)

Vẽ các hộp với các vòng lặp khá dễ dàng, nhưng có một nhược điểm. Nếu bạn lặp lại hình dạng sau:

--------
|
|

Bạn nhận được hộp, nhưng cái bên phải và bên dưới sẽ được mở. Bạn có thể tự vẽ các mặt phụ, nhưng chi phí byte. Để giải quyết vấn đề này, chương trình của tôi thực sự rút ra điều này, với các cạnh mở ở bên trái và trên cùng:

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

Nhưng monorail! Đó không phải là những gì spec nói! Bạn không thể vẽ thứ gì khác vì nó dễ hơn và bạn cảm thấy thích nó! Ngoài ra, trong khi tôi có sự chú ý của bạn, bạn rất thông minh và dễ thương.

Suỵt, không sao đâu. pb cho phép bạn "ghi" vào một điểm trên khung vẽ với một hoặc nhiều giá trị âm trong tọa độ của nó. Giá trị được lưu trữ trong khi chương trình chạy, nhưng chỉ các điểm trong đó X và Y đều> = 0 thực sự được ghi vào màn hình. Chương trình này định vị bàn chải sao cho các khu vực được tô màu trong hình ảnh này có X hoặc Y âm:

Mặc dù các dòng thêm được "vẽ", chúng không bao giờ được in.

Sau khi lặp qua và tạo lưới, chương trình này sẽ điền vào chín ô trên cùng. Đầu tiên là mã hóa cứng, 1 được viết và chương trình tiếp tục. Tám cái còn lại được tạo lập trình. Bỏ qua mã để di chuyển đến hộp tiếp theo, nhận thấy khi hàng trống, v.v (giả sử bàn chải luôn bắt đầu ở hàng dưới cùng của hộp và ở cột giữa), đây là thứ được chạy tám lần:

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

Ngay cả khi biết rằng đó blà lệnh để viết một ký tự, ^v<>di chuyển bàn chải và w[a!b]{}chạy mã trong các dấu ngoặc nhọn cho đến khi a != b, điều này rất khó để làm theo. Điều quan trọng đầu tiên cần lưu ý là bạn không thể xác định các biến trong pb. Có sáu trong mỗi chương trình và bạn phải học cách sống với họ. Thứ hai, Tlà biến duy nhất mà bạn thực sự có thể sử dụng theo cách bạn đã sử dụng để sử dụng các biến; gán một giá trị và sau đó đọc nó sau. Mọi biến số khác không thể được đặt và chỉ cho bạn biết điều gì đó về điểm trong khung vẽ bạn đang bật hoặc chỉ có thể được đặt gián tiếp và với các hiệu ứng phụ ( ^v<>thay đổi XY, cũng thay đổi vị trí cọ vẽ.c Bộ Pđể(P+1)%8, cũng thay đổi màu đầu ra). Giữ một bộ đếm cho số nào cần được viết và những chữ cái đơn giản là không thể. Thay vào đó, mã này chỉ theo dõi số lượng và tìm ra các chữ cái dựa trên nó. Đây là cách thực hiện:

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

Điều này là không hoàn hảo, vì chỉ có 3 chữ cái được đặt vào hộp 7 và 9. Vì vậy, sau khi điền vào hàng dưới cùng (mã hóa đơn giản), mỗi chữ cái trong hộp 9 được tăng thêm 2 và W được đặt thủ công. Tương tự, mỗi chữ cái trong hộp 7 và 8 được tăng thêm 1 và P được đặt thủ công.

Ung dung:

<[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 ký tự (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 >>+++++[-<.....>]

Mã đơn giản:

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

3

Bong bóng , 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...

Chán và thực tế.


1
"Chán và thực tế" như bàn phím điện thoại :)
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(' '))

Một bản thảo nhanh chóng của một chiến lược cơ bản. Sử dụng định dạng chuỗi để chèn nhãn, được mã hóa cứng trong một chuỗi dài.


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

Thật ý nghĩa khi nhận được sự thật rằng các chữ cái được xếp theo thứ tự. Mã này chạy qua 325 ký tự của bàn phím và in một khoảng trắng hoặc chữ cái tiếp theo nếu cần.

Ung dung

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 byte

Chơi gôn

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

Ung dung:

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 byte (mặc dù có một dòng mới duy nhất, nhưng điều này được cho phép theo mặc định) , mặc dù vậy vẫn không có 289 byte .
Kevin Cruijssen

1

Lua, 209 byte

Chơi gôn

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)

Ung dung:

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

Các hàng gạch ngang rõ ràng có thể nén được và các chữ số cũng vậy nhưng tôi không thể làm gì với các chữ cái. Chỉnh sửa: Đã lưu 1 trong 2 byte nhờ @Shaggy.


Lưu một byte bằng: replace(/-|!./g,s=>s=="-"?s.repeat(25):"| ${s[1]} ")- thay thế dấu ngoặc kép bằng backticks. Tôi đã thử một vài thứ để loại bỏ các nhóm chữ cái nhưng tốt nhất tôi có thể làm là 194 byte.
Xù xì

1
@Shaggy Cảm ơn, và tôi cũng đã cạo được một byte khác!
Neil


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

Các ký tự không thể in được, vì vậy phiên bản uuencoding bên dưới.

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

Chờ đã, không -M...nên tính là tốt?
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)

Chỉ in những gì OP muốn, mặc dù nó có thể hơi dài.


0

Con trăn 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"),".",",= "),",","|="),"`","  |  "),"=","   ")

Chiến lược thay thế đơn giản.


0

Python 2, 168 byte

Một phương pháp đơn giản sử dụng không nén tích hợp:

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 ký tự

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

0

GML (Ngôn ngữ nhà sản xuất trò chơi) 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)

Trong Game Maker, #là nhân vật dòng mới và nó có thể được thoát bằng\#


0

Python 2, 134 byte

Nguồn này chứa các ký tự không in được, do đó, nó được trình bày dưới dạng hexdump có thể được giải mã 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')


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.