Desenhar um teclado de telefone artístico ASCII


8

Desenhe o seguinte no menor número possível de bytes:

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

1
Por que a votação fechada muito ampla?
Digital Trauma

1
Erm ... alerta de saída codificada!
Wizzwizz4

3
Essa saída parece muito bem escolhida para um desafio de saída fixa. Existe uma estrutura geométrica, os números são ordenados, as letras estão em ordem alfabética e em pedaços - muitas possíveis trocas por codificação codificada versus geração. Eu acho que o comprimento é alto o suficiente para que o código rígido perca, mas veremos.
Xnor

Um telefone antigo sem Q ou Z seria mais fácil de gerar.
Não que Charles,

1
Eu não sou um jogador de código (idéias de desafios mais interessadas), mas alguns idiomas se beneficiariam com a remoção de P e W de uma matriz de alfabeto e a adição manual? Uma vez que eles são os únicos dois fora do lugar.
precisa saber é o seguinte

Respostas:


6

pb , 240 bytes

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

(Este programa solicitará a entrada na versão atual do pbi, porque vai para Y = -1 e a Bvariável tenta se atualizar. Mesmo se você digitar a entrada, nada será interrompido. É irritante, mas é melhor que a versão antiga que solicitou entrada, não importa o quê.)

pb é uma linguagem que trata o tratamento do terminal como uma tela 2D. Para produzir, você deve mover o "pincel" (um ponto representado pelos valores atuais das variáveis ​​X e Y) para onde deseja que esse caractere vá e o coloque lá. É complicado para coisas como imprimir uma palavra, mas para a arte geralmente é conveniente.

Na verdade, este programa não desenha exatamente o que a pergunta especifica. (Espere, não me diminua ainda! Deixe-me explicar!)

Desenhar caixas com loops é muito fácil, mas há um problema. Se você repetir a seguinte forma:

--------
|
|

Você recebe caixas, mas as da direita e da parte inferior estarão abertas. Você pode desenhar manualmente os lados extras, mas isso custa bytes. Para contornar isso, meu programa realmente desenha isso, com as bordas abertas à esquerda e em cima:

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

Mas monotrilho! Não é isso que a especificação diz! Você não pode simplesmente desenhar outra coisa, porque é mais fácil e você sente vontade! Além disso, enquanto eu tenho sua atenção, você é muito inteligente e fofa.

Shh, shh, está tudo bem. O pb permite "escrever" em um ponto da tela com um ou mais valores negativos em suas coordenadas. O valor é armazenado enquanto o programa é executado, mas apenas os pontos onde X e Y são> = 0 são gravados na tela. Este programa posiciona o pincel para que as áreas coloridas nesta imagem tenham um X ou Y negativo:

Embora linhas extras sejam "desenhadas", elas nunca são impressas.

Depois de percorrer e criar a grade, este programa preenche as nove caixas principais. O primeiro é codificado, um 1 é gravado e o programa segue em frente. Os outros oito são gerados programaticamente. Ignorando o código para ir para a próxima caixa, notando quando a linha está vazia etc. (suponha que o pincel sempre comece na linha inferior da caixa e na coluna do meio), é o que é executado oito vezes:

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

Mesmo sabendo que esse bé o comando para escrever um caractere, ^v<>mova o pincel e w[a!b]{}execute o código entre chaves até que a != bisso seja difícil de seguir. A primeira coisa importante a se notar é que você não pode definir variáveis ​​em pb. Existem seis em todos os programas e você precisa aprender a conviver com eles. Segundo, Té a única variável que você pode realmente usar da maneira que está acostumado a usar variáveis; atribuir um valor e depois lê-lo. Cada outra variável ou não pode ser definido e apenas diz-lhe algo sobre o ponto da tela que você está jogando, ou só pode ser definida de forma indireta e com efeitos secundários ( ^v<>mudança Xe Y, que também altera o local pincel. cSets Pa(P+1)%8, que também altera a cor de saída). Manter um contador para qual número precisa ser escrito e quais letras são simplesmente impossíveis. Em vez disso, esse código apenas rastreia o número e descobre as letras com base nele. Aqui está como:

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

Isso é imperfeito, pois apenas 3 letras são colocadas nas caixas 7 e 9. Portanto, depois de preencher a linha inferior (codificação simples), cada letra na caixa 9 é aumentada em 2 e o W é colocado manualmente. Da mesma forma, todas as letras nas caixas 7 e 8 são aumentadas em 1 e o P é colocado manualmente.

Ungolfed:

<[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 caracteres (212 bytes)

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

Código simples:

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

3

Bubblegum , 103 bytes

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

Chato e prático.


1
"Chato e prático", como um teclado de telefone :)
rybo111

2

Python 2, 147 bytes

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

Um rascunho rápido de uma estratégia básica. Usa formatação de sequência para inserir os rótulos, que são codificados em uma sequência longa.


2

C, 160 bytes

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

Faz sentido aproveitar o fato de que as letras estão em sequência. Esse código percorre os 325 caracteres do teclado e imprime um espaço ou a próxima letra, conforme necessário.

Ungolfed

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 bytes

Golfe:

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

Ungolfed:

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 bytes (possui uma única linha nova à direita, mas isso é permitido por padrão) , embora ainda não tenham 289 bytes .
Kevin Cruijssen 27/10

1

Lua, 209 bytes

Golfe:

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)

Ungolfed:

-- "&" 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 bytes

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

As linhas de traços são obviamente compressíveis e os dígitos também, mas não pude fazer nada com as letras. Editar: salvou 1 de 2 bytes graças a @Shaggy.


Salve um byte com: replace(/-|!./g,s=>s=="-"?s.repeat(25):"| ${s[1]} ")- substituindo aspas por reticulares. Tentei algumas coisas para agrupar os grupos de letras, mas o melhor que pude fazer foi 194 bytes.
Shaggy

1
@ Shaggy Obrigado, e eu consegui raspar outro byte também!
Neil

0

CJam, 128 bytes

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

Experimente online.


0

Perl, 142 + 1 = 143 bytes

$ 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

Caracteres não imprimíveis, portanto, a versão codificada está abaixo.

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

Espere, não deve -M...ser contado também?
Ven

0

Python 3.5 - 240 bytes:

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)

Imprime exatamente o que o OP deseja, embora possa demorar um pouco.


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

Estratégia de substituição simples.


0

Python 2, 168 bytes

Um método direto, sem compactação interna:

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 caracteres

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

0

GML (linguagem do criador de jogos) 8.0, 269 bytes

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)

No Game Maker, #é o personagem de nova linha e pode ser escapado por\#


0

Python 2, 134 bytes

Essa fonte contém caracteres não imprimíveis e, portanto, é apresentada como um hexdump que pode ser decodificado 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')


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.