Mapa de caracteres ASCII inverso

8

En Cartografiar caracteres ASCII ingresados , le pedí ... mapear caracteres ASCII ingresados. Esta vez, hará lo contrario, asignando inmediatamente todos los caracteres ASCII y luego asignando espacios sobre ellos.

Este programa tendrá usos prácticos, como ver qué personajes le quedan en una presentación de desafío de .

Desafío

Su trabajo consiste en escribir un programa que la ONU -mapas caracteres ASCII introducidos. Tan pronto como se ejecute el programa, mostrará este mapa exacto (excepto color, fuente, tamaño, etc.):

paso 1

Cada vez que el usuario ingresa un carácter ASCII imprimible, imprimirá un espacio sobre él.

gif

Reglas

  • La salida inicial debe ser exactamente como se muestra en la primera imagen de arriba: una cuadrícula de 6x16 con caracteres ASCII en sus respectivas posiciones, con el espacio (32) en la parte superior izquierda y la tilde (126) en un carácter a la izquierda desde la parte inferior derecha.
  • Su programa solo necesita mostrar los caracteres ASCII imprimibles, 0x20a 0x7E.
  • Su programa no debe terminar y continuar imprimiendo espacios sobre caracteres hasta que se hayan sobrescrito todos los caracteres ASCII imprimibles. Desde aquí, su programa puede terminar o ejecutarse en Neverland.
  • Su mapa inverso debe actualizarse en tiempo real (tan pronto como reciba la entrada del usuario).
  • Si su programa no lee la entrada en silencio, debe poner el cursor fuera del camino, para que el texto no se interponga en el mapa.

Aquí hay una tabla ASCII útil como referencia.

Puntuación

La respuesta con la menor cantidad de bytes en cada idioma gana. ¡Que te diviertas!

MD XF
fuente
Nota para los posibles DV-ers o votantes duplicados: sería más difícil enviar una respuesta en codegolf.stackexchange.com/q/124306/61563 aquí que escribir su propia respuesta. Las respuestas allí leen la entrada y luego la usan para imprimir en la pantalla. Las respuestas aquí deben imprimirse en la pantalla sin entrada (utilizando un mecanismo de bucle diferente) y luego probar cada carácter ingresado para su ubicación, luego imprimir un carácter diferente.
MD XF
¿Podemos suponer que el usuario presiona enter después de ingresar 1 carácter?
Sr. Xcoder
@ Mr.Xcoder Sí, está bien para idiomas que no pueden recibir información en tiempo real.
MD XF
@ Mr.Xcoder Ver la regla 1 -Your program only needs to display the printable ASCII characters, 0x20 to 0x7E
MD XF
3
@MDXF Sigue siendo sorprendentemente similar al desafío original. Solo necesito imprimir los caracteres ascii en las posiciones correctas, luego, en lugar de poner la entrada del usuario en el lugar correcto, solo uso un espacio.
Conor O'Brien

Respuestas:

2

SOGL V0.12 , 23 bytes

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

Pruébalo aquí!

Toma entrada en el cuadro de entrada. Espero que no sea un gran problema que los caracteres se puedan eliminar: p

Explicación:

]                   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
fuente
6

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

Volcado hexadecimal:

BC0100B101B07EBAFE0581EAE00080EA02B402CD1085E4750830E439C5750A30C0B40ACD1084C074094884D275E085D275D831C031E4CD1630E489C5EBC7

Montaje:

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

ingrese la descripción de la imagen aquí


fuente
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
fuente
Bienvenido a PPCG! Yo creo que puede quitar los espacios después de las #includes, así como i + 0x20-> i+0x20. Aunque podría estar equivocado.
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()," ")

Pruébalo en línea!

C McAvoy
fuente
1

Python 2 , 132 bytes

¡Guardado 4 bytes gracias 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:]

Pruébalo en línea!

musicman523
fuente
Esto imprime un 0x7f después de la tilde, solo para tu información
Conor O'Brien
@ ConorO'Brien Oops, arreglado
musicman523
1
¿Alguna razón por la que no pudiste agregar [:-2]después print s?
Aleks
@alleks que tiene demasiado sentido por eso
musicman523
1

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

-3 bytes gracias a @Shaggy.
-14 bytes inspirados en @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>

La preetiqueta de cierre es necesaria en este caso, ya que necesitamos que el innerTextvalor comience totalmente vacío.

Justin Mariner
fuente
Ahorre 2 bytes con O[h="innerHTML"]=a=[...Array(95)].map().
Shaggy
Y creo que puedes salvar otro byte al deshacerte de él por acompleto.
Shaggy
1
@Shaggy Gracias, yo estaba usando el extra avariables porque innerHTMLse estaba convirtiendo &en &amp;, junto con algunos otros. Cambiando a innerTextarreglado eso.
Justin Mariner
Puede pasar ial ámbito global para guardar 2 bytes:map(_=>String.fromCharCode(i++)+(i%16?...),i=32)
Arnauld
@Arnauld Usando esa idea, podría eliminar todo el mapeo de matriz y usar un bucle for en su lugar. ¡Gracias!
Justin Mariner
1

QBasic , 107 bytes

Una función anónima que toma como pulsaciones de teclas y borra una tabla 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 gracias a @DLosc

Taylor Scott
fuente
@DLosc: ni siquiera había considerado usar una Subsolución allí. Excelente. Desafortunadamente, tenemos que contar End Subya que la comunidad ha decidido que el autocompletado no es válido (al menos con VBA, pero estoy seguro de que también se aplica aquí)
Taylor Scott
Huh, eso es interesante: no me había dado cuenta de que había una distinción entre autoformato y autocompletado. Bueno saber.
DLosc
0

C # (.NET Core) , (138+ usando el sistema;) 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()," ");}}

Pruébalo en línea!

jkelm
fuente
130 bytes
TheLethalCoder
Ah, pero debe incluirlo using System;en su recuento de bytes si aún no lo ha hecho (olvidé agregarlo en el recuento anterior).
TheLethalCoder
@TheLethalCoder Por eso dice 138+ usando el Sistema;
jkelm
Lo quise decir principalmente porque olvidé agregar el uso en mi recuento de bytes anterior.
TheLethalCoder
Oh. No vi tu primer comentario allí. Me gusta el abuso del bucle infinito allí :)
jkelm
0

Node.js 233 212 bytes

Guardado 21 bytes gracias a @thePirateBay

Esto funciona, todavía estoy tratando de encontrar una opción en línea, ya que todas las respuestas que he encontrado secuestran 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())

Pruébalo en línea

Jared Smith
fuente
La versión en línea se puede encontrar en TIO . Solo unas pocas notas: puede guardar más de 30 bytes reorganizando sus identificadores y eliminando partes innecesarias. No necesita ninguna variable b, y también está utilizando un identificador readlineno inicializado (no estoy seguro si es compatible con la versión en TIO). Tampoco necesita variables ren absoluto, en lugar de &&al final, puede usar ,y reorganizar paréntesis. Lo mismo con el &&al principio. Además, no hay necesidad de que process.stdouten la readlineinterfaz, etc ...........
@ThePirateBay sin tirar process.stdout(al menos en mi versión de nodo). Lo de readline fue un error tipográfico (presionó ctrl-z demasiadas veces). Voy a cambiar el &&s.
Jared Smith el
El módulo Readline no requiere process.stdout. Puedes leer la especificación . Puede arrojar un error si arruinó algo con el resto de su código o si está utilizando una versión antigua / inconsistente de Node.js.
@ thePirateBay Debe ser mi nodo, estoy 6.9.1 en MacOS ... solo lo intenté nuevamente y createInterfaceaparentemente regresa undefinedsi omite el segundo parámetro. Seguí adelante y lo eliminé según los documentos que vinculaste. En cuanto a TIO, ¿cómo lo haces interactivo?
Jared Smith el
Aquí está usando solo 191 bytes, pero estoy seguro de que se pueden guardar al menos 10 bytes más. Lo siento, estoy demasiado aburrido ahora para seguir jugando al golf: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

Volcado hexadecimal:

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

Asamblea 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

Esto no tiene cursor alguno. También tengo una versión de 47 bytes que puede ser válida, dependiendo de lo que se entiende por "poner el cursor fuera del camino, para que el texto no se interponga en el 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

Esto coloca un cursor en el carácter después del carácter que escribe (que es el espacio entre caracteres), por lo que no sobrescribirá ninguno de los caracteres reales en el mapa. Si esto es válido o no, depende del creador del desafío.

insert_name_here
fuente
0

Python 2 , 96 bytes

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

Pruébalo en línea! La salida parece dudosa en TIO (porque la entrada se pasa de un archivo), pero está bien interactivamente. Espero 'A'\n, 'B'\netc es un formato de entrada bien.

Lynn
fuente