ASCII-Zeichentabelle umkehren

8

In von der Karte eingegebenen ASCII-Zeichen habe ich Sie gebeten, .. eingegebene ASCII-Zeichen zuzuordnen. Dieses Mal tun Sie das Gegenteil, indem Sie sofort alle ASCII-Zeichen zuordnen und dann Leerzeichen über ihnen zuordnen.

Dieses Programm hat praktische Verwendungszwecke, z. B. das Anzeigen der Zeichen, die Sie in einem Programm hinterlassen haben Herausforderung einreichen.

Herausforderung

Ihre Aufgabe ist es, ein Programm zu schreiben , dass un eingegebenen ASCII - Zeichen -Karten. Sobald das Programm ausgeführt wird, wird genau diese Karte angezeigt (außer Farbe, Schriftart, Größe usw.):

Schritt 1

Jedes Mal, wenn der Benutzer ein druckbares ASCII-Zeichen eingibt, wird ein Leerzeichen darüber gedruckt.

gif

Regeln

  • Die anfängliche Ausgabe muss genau wie im ersten Bild oben gezeigt sein: ein 6x16-Raster mit ASCII-Zeichen an ihren jeweiligen Positionen, wobei das Leerzeichen (32) oben links und die Tilde (126) ein Zeichen links unten rechts sind.
  • Ihr Programm muss nur die druckbaren ASCII-Zeichen anzeigen, 0x20um 0x7E.
  • Ihr Programm darf nicht beendet werden und weiterhin Leerzeichen über Zeichen drucken, bis alle druckbaren ASCII-Zeichen überschrieben wurden. Von hier aus kann Ihr Programm entweder beendet oder in Neverland ausgeführt werden.
  • Ihre Reverse Map muss in Echtzeit aktualisiert werden (sobald sie Benutzereingaben erhält).
  • Wenn Ihr Programm Eingaben nicht still liest, muss es den Cursor aus dem Weg räumen, damit der Text der Karte nicht im Weg steht.

Hier ist eine nützliche ASCII-Tabelle als Referenz.

Wertung

Die Antwort mit den wenigsten Bytes in jeder Sprache gewinnt. Habe Spaß!

MD XF
quelle
Hinweis für potenzielle DV-er oder doppelte Wähler - es wäre schwieriger, eine Antwort auf codegolf.stackexchange.com/q/124306/61563 hierher zu portieren , als Ihre eigene Antwort zu schreiben. Die Antworten dort lesen die Eingabe und verwenden dann die Eingabe, um auf dem Bildschirm zu drucken. Die Antworten hier müssen ohne Eingabe auf dem Bildschirm gedruckt werden (unter Verwendung eines anderen Schleifenmechanismus) und dann jedes eingegebene Zeichen auf seine Position testen und dann ein anderes Zeichen drucken.
MD XF
Können wir davon ausgehen, dass der Benutzer die Eingabetaste drückt, nachdem er 1 Zeichen eingegeben hat?
Mr. Xcoder
@ Mr.Xcoder Ja, das ist in Ordnung für Sprachen, die keine Eingaben in Echtzeit vornehmen können.
MD XF
@ Mr.Xcoder Siehe Regel 1 -Your program only needs to display the printable ASCII characters, 0x20 to 0x7E
MD XF
3
@MDXF Es ist immer noch auffallend ähnlich wie die ursprüngliche Herausforderung. Ich muss nur die ASCII-Zeichen an den richtigen Positionen drucken. Anstatt die Benutzereingaben an der richtigen Stelle zu platzieren, verwende ich stattdessen nur ein Leerzeichen.
Conor O'Brien

Antworten:

2

SOGL V0.12 , 23 Bytes

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

Probieren Sie es hier aus!

Nimmt Eingaben in das Eingabefeld vor. Ich hoffe, dass es kein allzu großes Problem ist, dass Zeichen gelöscht werden können: p

Erläuterung:

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

x86-16 Maschinencode, 62 Byte

Hex Dump:

BC0100B101B07EBAFE0581EAE00080EA02B402CD1085E4750830E439C5750A30C0B40ACD1084C074094884D275E085D275D831C031E4CD1630E489C5EBC7

Versammlung:

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

Geben Sie hier die Bildbeschreibung ein


quelle
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
quelle
Willkommen bei PPCG! Ich glaube, Sie können die Leerzeichen nach dem #includes sowie i + 0x20-> entfernen i+0x20. Ich könnte mich jedoch irren.
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()," ")

Probieren Sie es online aus!

C McAvoy
quelle
1

Python 2 , 132 Bytes

4 Bytes dank @alleks gespeichert!

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

Probieren Sie es online aus!

musicman523
quelle
Dies druckt eine 0x7f nach der Tilde, nur
Conor O'Brien
@ ConorO'Brien Ups, behoben
musicman523
1
Gibt es einen Grund, den Sie nicht einfach [:-2]nachher hinzufügen können print s?
Alleks
@alleks, das macht zu viel Sinn, deshalb
musicman523
1

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

-3 Bytes dank @Shaggy.
-14 Bytes inspiriert von @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>

preIn diesem Fall ist das Schließen des Tags erforderlich, da der innerTextWert vollständig leer beginnen muss.

Justin Mariner
quelle
Speichern Sie 2 Bytes mit O[h="innerHTML"]=a=[...Array(95)].map().
Shaggy
Und ich denke, Sie können ein weiteres Byte speichern, indem Sie es avollständig entfernen .
Shaggy
1
@Shaggy Danke, ich habe die zusätzliche aVariable verwendet, weil innerHTMLsie &sich &amp;zusammen mit einigen anderen in verwandelt hat . Umschalten auf innerTextbehoben.
Justin Mariner
Sie können iin den globalen Bereich wechseln , um 2 Bytes zu speichern:map(_=>String.fromCharCode(i++)+(i%16?...),i=32)
Arnauld
@Arnauld Mit dieser Idee könnte ich einfach die gesamte Array-Zuordnung entfernen und stattdessen eine for-Schleife verwenden. Vielen Dank!
Justin Mariner
1

QBasic , 107 Bytes

Eine anonyme Funktion, die als Tastenanschläge eine ASCII-Tabelle löscht

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 dank @DLosc

Taylor Scott
quelle
@ DLosc - Ich hatte noch nicht einmal darüber nachgedacht, eine Subdortige - großartige Lösung zu verwenden. Leider müssen wir das zählen, End Subda die Community entschieden hat, dass die automatische Vervollständigung nicht gültig ist (zumindest bei VBA, aber ich bin sicher, dass dies auch hier gilt)
Taylor Scott
Huh, das ist interessant - ich hatte nicht bemerkt, dass es einen Unterschied zwischen Autoformating und Autocompletion gibt. Gut zu wissen.
DLosc
0

C # (.NET Core) , (138 + unter Verwendung von 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()," ");}}

Probieren Sie es online aus!

jkelm
quelle
130 Bytes
TheLethalCoder
Oh, aber Sie müssen using System;in Ihre Byteanzahl aufnehmen, wenn Sie dies noch nicht getan haben (ich habe vergessen, es in die obige Zählung aufzunehmen).
TheLethalCoder
@TheLethalCoder Deshalb heißt es 138 + using System;
Jkelm
Ich meinte es hauptsächlich so, weil ich vergessen habe, die Verwendung in meine obige Byteanzahl aufzunehmen.
TheLethalCoder
Oh. Hab deinen ersten Kommentar dort nicht gesehen. Ich mag den Missbrauch der Endlosschleife dort :)
jkelm
0

Node.js 233 212 Bytes

21 Bytes dank @thePirateBay gespart

Dies funktioniert, ich versuche immer noch, eine Online-Option zu finden, da alle Antworten, die ich gefunden habe, stdin hijacken.

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

Probieren Sie es online aus

Jared Smith
quelle
Die Online-Version finden Sie auf TIO . Nur ein paar Anmerkungen: Sie können mehr als 30 Bytes sparen, indem Sie Ihre Kennungen neu anordnen und unnötige Teile entfernen. Sie benötigen überhaupt keine Variable bund verwenden auch einen nicht initialisierten Bezeichner readline(nicht sicher, ob er mit der Version auf TIO kompatibel ist). Sie benötigen auch überhaupt keine Variablen r, statt &&am Ende können Sie ,Klammern verwenden und neu anordnen. Gleiches gilt für die &&am Anfang. Auch keine Notwendigkeit process.stdoutin der readlineSchnittstelle, etc ...........
@ThePirateBay ohne process.stdoutes wirft (zumindest auf meiner Version des Knotens). Die Readline-Sache war ein Tippfehler (drücken Sie zu oft Strg-Z). Ich werde das &&s ändern .
Jared Smith
Readline-Modul nicht erforderlich process.stdout. Sie können die Spezifikation lesen . Es kann einen Fehler auslösen, wenn Sie den Rest Ihres Codes durcheinander gebracht haben oder wenn Sie eine alte / inkonsistente Version von Node.js verwenden.
@thePirateBay Muss mein Knoten sein, ich bin 6.9.1 unter MacOS ... habe es einfach noch einmal versucht und createInterfacekehrt anscheinend zurück, undefinedwenn Sie den zweiten Parameter weglassen. Ich habe es jedoch gemäß den von Ihnen verlinkten Dokumenten entfernt. Wie machen Sie TIO interaktiv?
Jared Smith
Hier werden nur 191 Bytes verwendet, aber ich bin sicher, dass mindestens 10 weitere Bytes gespeichert werden können. Entschuldigung, 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

65c02 Maschinencode + Apple // e ROM, 52 (47?) Bytes

Hex Dump:

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

Kommentierte Montage:

 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

Dies hat überhaupt keinen Cursor. Ich habe auch eine 47-Byte-Version, die möglicherweise gültig ist, je nachdem, was mit "den Cursor aus dem Weg räumen, damit der Text der Karte nicht im Weg steht" gemeint ist:

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

Dadurch wird ein Cursor auf das Zeichen nach dem eingegebenen Zeichen gesetzt (dies ist der Abstand zwischen den Zeichen), sodass keine der tatsächlichen Zeichen in der Karte überschrieben werden. Ob dies gültig ist oder nicht, ist Sache des Erstellers der Herausforderung.

insert_name_here
quelle
0

Python 2 , 96 Bytes

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

Probieren Sie es online aus! Die Ausgabe sieht auf TIO zweifelhaft aus (da die Eingabe von einer Datei übergeben wird), ist aber interaktiv in Ordnung. Ich hoffe 'A'\n, 'B'\netc ist ein okay Eingabeformat.

Lynn
quelle