Mapa de caracteres reverso ASCII

8

Em Mapear caracteres ASCII introduzidos , solicitei que você .. mapeasse caracteres ASCII introduzidos. Desta vez, você fará o oposto, mapeando imediatamente todos os caracteres ASCII e, em seguida, mapeando os espaços sobre eles.

Este programa terá usos práticos, como ver quais caracteres você deixou em um envio de desafio de .

Desafio

Seu trabalho é escrever um programa que desmarca os caracteres inseridos em ASCII. Assim que o programa for executado, ele exibirá esse mapa exato (exceto cor, fonte, tamanho, etc.):

passo 1

Cada vez que o usuário insere um caractere ASCII imprimível, você imprime um espaço sobre ele.

gif

Regras

  • A saída inicial deve ser exatamente como mostrado na primeira imagem acima: uma grade 6x16 com caracteres ASCII em suas respectivas posições, com o espaço (32) no canto superior esquerdo e o til (126) em um caractere esquerdo no canto inferior direito.
  • Seu programa só precisa exibir os caracteres ASCII imprimíveis 0x20para 0x7E.
  • Seu programa não deve terminar e continuar a imprimir espaços sobre caracteres até que todos os caracteres ASCII imprimíveis tenham sido substituídos. A partir daqui, seu programa pode ser encerrado ou executado em Neverland.
  • Seu mapa reverso deve ser atualizado em tempo real (assim que receber a entrada do usuário).
  • Se o seu programa não lê a entrada silenciosamente, ele deve afastar o cursor, para que o texto não atrapalhe o mapa.

Aqui está uma tabela ASCII útil para referência.

Pontuação

A resposta com o mínimo de bytes em cada idioma vence. Diverta-se!

MD XF
fonte
Observe para DV-ers em potencial ou eleitores duplicados - seria mais difícil portar uma resposta em codegolf.stackexchange.com/q/124306/61563 para aqui do que escrever sua própria resposta. As respostas ali lêem a entrada e, em seguida, use a entrada para imprimir na tela. As respostas aqui devem ser impressas na tela sem entrada (usando um mecanismo de loop diferente) e, em seguida, testar cada caractere inserido para sua localização e, em seguida, imprimir um caractere diferente.
MD XF
Podemos supor que o usuário pressiona enter depois de inserir 1 caractere?
Mr. Xcoder
@ Mr.Xcoder Sim, isso é bom para idiomas que não podem receber informações em tempo real.
MD XF
@ Mr.Xcoder Ver regra 1 -Your program only needs to display the printable ASCII characters, 0x20 to 0x7E
MD XF
3
@MDXF Ainda é surpreendentemente semelhante ao desafio original. Eu só preciso imprimir os caracteres ascii nas posições corretas e, em vez de colocar a entrada do usuário no local correto, apenas uso um espaço.
Conor O'Brien

Respostas:

2

SOGL V0.12 , 23 bytes

] ~Δ8«n"5αx2⁰³⁄¹‘→č@ŗ░T

Experimente aqui!

Recebe entrada na caixa de entrada. Espero que não seja um problema muito grande que os caracteres possam ser excluídos: p

Explicação:

]                   do.. while (popping (which makes the stack not blow up luckily :D))
  ~Δ                push the ascii characters (range("~"))
    8«n             split into lines of length 16
       "...‘        push "inputs.value" (could be 2 bytes less if my dictionary contained the word "inputs". I even added "input", but only now realise that the input box is id=inputs :/)
            →       evaluate as JavaScript, then push the result
             č      chop into characters
              @ŗ    replace each of the characters in the array with space
                ░   clear the output
                 T  output without popping (so do..while continues looping)
dzaima
fonte
6

Código da máquina x86-16, 62 bytes

Despejo hexagonal:

BC0100B101B07EBAFE0581EAE00080EA02B402CD1085E4750830E439C5750A30C0B40ACD1084C074094884D275E085D275D831C031E4CD1630E489C5EBC7

Montagem:

mov sp, 0x0001           ; Stack pointer is used as a flag; 0 - Print all characters, 1 - Delete specific character
mov cl, 0x01             ; Number of characters to print per interrupt call

printString:
  mov al, 0x7E           ; Last character to print
  mov dx, 0x05FE         ; Row: 0x05, Collumn: 0xFE
  printRow:
    sub dx, 0x00E0       ; Decrement row number + 2 extra characters
    printChar:
      sub dl, 0x02       ; Decrement collumn index + 1 space
      mov ah, 0x02       ; Prepare for interrupt call, 0x02 - Set cursor position
      int 0x10           ; BIOS interrupt

      test sp, sp        ; Are we printing all characters or removing specific character
      jnz print          ; In first case just print it and go on
      xor ah, ah         ; Otherwise reset the upper byte of ax (shorter than "and ax, 0x00FF")
      cmp bp, ax         ; Is the current character same as the input character
      jne after          ; If no, continue searching
      xor al, al         ; If yes, remove it

      print:
        mov ah, 0x0A     ; Prepare for print
        int 0x10         ; Print

      test al, al        ; If we found target character
      jz loop            ; then stop searching

      after:
        dec ax           ; Shorter than "dec, al"
        test dl, dl      ; Is it the last character in the row
        jnz printChar    ; If no, continue searching
    test dx, dx          ; Is it last char
    jnz printRow         ; If no, go to next row

loop:
  xor ax, ax             ; Remove "ah" cache
  xor sp, sp             ; Reset sp (it will never become 1 again)
  int 0x16               ; BIOS interrupt for reading keyboard input
  xor ah, ah             ; Again reset "ah", because BIOS may change it
  mov bp, ax             ; Save it in stack base pointer
  jmp printString        ; Remove the character from the list

insira a descrição da imagem aqui


fonte
2

C ++ (Visual C ++) , 253 (@Step Hen) 261 bytes

#include<cstdlib>
#include<iostream>
#include<conio.h>
int main(){char a[0x5E];for(int i=0;i<0x5E;i++)a[i]=(char)(i+0x20);while(true){system("cls");for(int i=0;i<0x5E;i++)if(i&&!(i%16))printf("\n%c ",a[i]);else printf("%c ",a[i]);a[_getch()-0x20]=' ';}}
Rob Gates
fonte
Bem-vindo ao PPCG! Eu acredito que você pode remover os espaços após os #include, bem como i + 0x20-> i+0x20. Eu posso estar errado embora.
Stephen
1

Python 3 , 116 bytes

o='\n'.join(''.join(map(chr,range(i,16+i)))for i in range(32,124,16))[:-1]
while 1:print(o);o=o.replace(input()," ")

Experimente online!

C McAvoy
fonte
1

Python 2 , 132 bytes

Guardado 4 bytes graças a @alleks!

s=''
for i in range(32,128,16):s+=' '.join(map(chr,range(i,i+16)))+'\n'
while 1:print s[:-2];i=2*ord(input())-64;s=s[:i]+' '+s[i+1:]

Experimente online!

musicman523
fonte
Isto imprime uma 0x7f após o til, apenas fyi
Conor O'Brien
@ ConorO'Brien Ops, corrigido
musicman523
1
Alguma razão para você não poder adicionar [:-2]depois print s?
Alleks
@alleks que faz muito sentido é por isso
musicman523
1

JavaScript (ES6) + HTML, 139 136 116 + 10 16 = 132 bytes

-3 bytes graças a @Shaggy.
-14 bytes inspirados em @Arnauld.

for(i=32;i<127;)O[h="innerText"]+=String.fromCharCode(i++)+(i%16?" ":`
`);onkeypress=e=>O[h]=O[h].replace(e.key," ")
<pre id=O></pre>

A pretag de fechamento é necessária neste caso, pois precisamos do innerTextvalor para começar totalmente vazio.

Justin Mariner
fonte
Salve 2 bytes com O[h="innerHTML"]=a=[...Array(95)].map().
Shaggy
E acho que você pode salvar outro byte se livrando acompletamente.
Shaggy
1
@Shaggy Obrigado, eu estava usando o adicional avariável porque innerHTMLestava se transformando &em &amp;, juntamente com alguns outros. Mudando para innerTextconsertar isso.
23717 Justin Mariner
Você pode mover ipara o escopo global para salvar 2 bytes:map(_=>String.fromCharCode(i++)+(i%16?...),i=32)
Arnauld
@ Arnauld Usando essa idéia, eu poderia remover todo o mapeamento da matriz e usar um loop for. Obrigado!
23678 Justin Mariner
1

QBasic , 107 bytes

Uma função anônima que recebe como pressionamentos de tecla e apaga uma tabela ASCII

FOR x=32TO 126
L x
?CHR$(x)
NEXT
DO
L ASC(Input$(1))
?" "'<- `"` included for highlighting only
LOOP
SUB L(x)
LOCATE x\16-1,2*(x MOD 16)+1
END SUB

-8 bytes graças a @DLosc

Taylor Scott
fonte
@DLosc - eu nem tinha pensado em usar uma Subsolução lá - ótima. Infelizmente, temos de contar o End Subquanto a comunidade decidiu que autocompletar não é válido (pelo menos com VBA, mas tenho certeza de que ela se aplica aqui também)
Taylor Scott
Ah, isso é interessante - eu não tinha percebido que havia uma distinção entre formatação automática e preenchimento automático. Bom saber.
DLosc
0

C # (.NET Core) , (138 + usando System;) 151 bytes

()=>{var j="";for(int i=32;i<127;i++){if(i%16<1)j+='\n';j+=(char)i+" ";}while(1>0){Console.Write(j);j=j.Replace(Console.ReadLine()," ");}}

Experimente online!

jkelm
fonte
130 bytes
TheLethalCoder
Ah, mas você precisa incluir using System;na sua contagem de bytes, se ainda não o esqueceu (esqueci de adicioná-la à contagem acima).
TheLethalCoder 3/17/17
@TheLethalCoder É por isso que diz 138 + using System;
precisa saber é
Eu quis dizer isso principalmente porque esqueci de adicionar o uso à minha contagem de bytes acima.
TheLethalCoder
Oh. Não viu seu primeiro comentário lá. I como o abuso do infinito loop for lá :)
jkelm
0

Node.js 233 212 bytes

Guardado 21 bytes graças a @thePirateBay

Isso funciona, ainda estou tentando encontrar uma opção on-line, pois todos os repls que encontrei hijack stdin.

a=[];l=_=>console.log(a.join``);for(i=32;i<127;i++)(x=String.fromCharCode(i)),a.push(i%16?x:x+'\n');l();b=require('readline');b.createInterface(process.stdin).on('line',c=>(a=a.join``.replace(c,' ').split``),l())

Experimente online

Jared Smith
fonte
A versão online pode ser encontrada no TIO . Apenas algumas notas: você pode salvar mais de 30 bytes reorganizando seus identificadores e removendo partes desnecessárias. Você não precisa de variáveis be também está usando um identificador readlinenão inicializado (não tenho certeza se é compatível com a versão no TIO). Você também não precisa de variáveis r, em vez de &&no final, pode usar ,e reorganizar parênteses. O mesmo acontece com &&o começo. Além disso, não há necessidade de process.stdoutem readlineinterface, etc ...........
@ThePirateBay sem process.stdoutlança (pelo menos na minha versão do nó). A coisa da linha de leitura foi um erro de digitação (pressione ctrl-z muitas vezes). Eu vou mudar os &&s.
Jared Smith
O módulo Readline não requer process.stdout. Você pode ler a especificação . Isso pode gerar um erro se você estragou algo com o restante do seu código ou se você estiver usando a versão antiga / inconsistente do Node.js.
@thePirateBay Deve ser meu nó, eu sou 6.9.1 no MacOS ... tentei novamente e, createInterfaceaparentemente, retorna undefinedse você omitir o segundo parâmetro. Fui em frente e o removi de acordo com os documentos que você vinculou. No que diz respeito ao TIO, como você o torna interativo?
Jared Smith
Aqui está usando apenas 191 bytes, mas tenho certeza de que pelo menos mais 10 bytes podem ser salvos. Desculpe, im muito aborrecido agora para continuar golfe isso:for(a=[],l=_=>console.log(a.join``),i=32;i<127;x=String.fromCharCode(i++),a.push(i&15?x:x+'\n'));l();require('readline').createInterface(process.stdin).on('line',c=>(a[a.indexOf(c)]=' ',l)())
0

Código de máquina 65c02 + Apple // e ROM, 52 (47?) Bytes

Despejo hexagonal:

8000- 20 58 FC A9 A0 20 20 80
8008- 20 ED FD 1A C9 FF D0 F5
8010- AD 00 C0 10 FB 8D 10 C0
8018- 20 20 80 20 57 DB 80 F0
8020- 48 38 E9 A0 48 29 0F 0A
8028- 85 24 68 4A 4A 4A 4A 20
8030- 5B FB 68 60

Montagem comentada:

 1 HTAB     =     $24        ; HORIZONTAL POSITION OF CURSOR
 2 SETVTAB  =     $FB5B      ; SETS VERTICAL POSITION OF CURSOR FROM ACC
 3 COUT     =     $FDED      ; OUTPUTS CHARACTER IN ACC
 4 HOME     =     $FC58      ; CLEARS SCREEN
 5 OUTSP    =     $DB57      ; APPLESOFT ROUTINE THAT OUTPUTS A SPACE
 6 KBD      =     $C000      ; KEY LAST PRESSED
 7 KBSTROBE =     $C010      ; ACCESS TO RESET "NEW KEY PRESSED" INDICATOR
 8          ORG   $8000
 9          JSR   HOME
10 * PRINT INITIAL CHARACTER MAP
11          LDA   #" "
12 LOOP     JSR   CHARPOS
13          JSR   COUT
14          INC              ; INCREMENT ACCUMULATOR
15          CMP   #"~"+1
16          BNE   LOOP
17 * WAIT FOR KEYPRESS
18 GETCH    LDA   KBD        ; GET LAST KEY PRESSED
19          BPL   GETCH      ; READ AGAIN IF KEYPRESS IS NOT NEW
20          STA   KBSTROBE   ; RESET "NEW KEYPRESS" INDICATOR
21          JSR   CHARPOS
22          JSR   OUTSP
23          BRA   GETCH
24 * SUBROUTINE TO POSITION CURSOR TO PRINT OVER CHARACTER IN ACCUMULATOR
25 CHARPOS  PHA              ; PRESERVE ACC
26          SEC              ; MAKE SURE CARRY IS SET TO SUBTRACT
27          SBC   #" "       ; SUBTRACT CHAR CODE OF SPACE
28          PHA              ; SAVE ACC
29          AND   #$0F       ; GET LOWER 4 BITS TO GET CURSOR X POSITION
30          ASL              ; SHIFT LEFT TO MAKE SPACES BETWEEN CHARS
31          STA   HTAB
32          PLA              ; GET OLD ACC
33          LSR              ; SHIFT HIGH NIBBLE
34          LSR              ; INTO LOW NIBBLE
35          LSR              ; TO GET CURSOR Y POSITION
36          LSR
37          JSR   SETVTAB
38          PLA              ; RESTORE ACC
39          RTS

Isso não tem nenhum cursor. Eu também tenho uma versão de 47 bytes que pode ser válida, dependendo do significado de "afastar o cursor, para que o texto não atrapalhe o mapa":

8000- 20 58 FC A9 A0 20 1B 80
8008- 20 ED FD 1A C9 FF D0 F5
8010- 20 0C FD 20 1B 80 20 57
8018- DB 80 F5 48 38 E9 A0 48
8020- 29 0F 0A 85 24 68 4A 4A
8028- 4A 4A 20 5B FB 68 60

Isso coloca um cursor no caractere após o caractere digitado (que é o espaço entre os caracteres), para que ele não substitua nenhum dos caracteres reais no mapa. Se isso é válido ou não, cabe ao criador do desafio.

insert_name_here
fonte
0

Python 2 , 96 bytes

from textwrap import*
a=fill(str(bytearray(range(32,127))),16)
while 1:a=a.replace(input(a),' ')

Experimente online! A saída parece duvidosa no TIO (porque a entrada é passada de um arquivo), mas funciona bem de maneira interativa. Espero 'A'\n, 'B'\netc , é um formato de entrada aceitável.

Lynn
fonte