Ordnen Sie eingegebene ASCII-Zeichen zu


32

Stellen Sie sicher, dass Sie die andere Herausforderung, die umgekehrte ASCII-Zeichentabelle, sehen !

Der ASCII-Zeichensatz (American Standard Code for Information Interchange) ist der am häufigsten verwendete Standard für die Zeichencodierung. ASCII-Codes stehen für Text in Computern, Telekommunikationsgeräten und anderen Geräten.

Herausforderung

Ihre Herausforderung besteht darin, eine Zuordnung des ASCII-Zeichensatzes zu drucken, während der Benutzer sie eingibt. GIF:

gif

Nachdem der Benutzer jedes ASCII-Zeichen eingegeben hat, sollte die Ausgabe folgendermaßen aussehen:

Tabelle

Kartierung

Jedes Zeichen hat eine zugewiesene Position in einem 16x6-Logikraster, beginnend mit dem Leerzeichen in der oberen linken Position, und wird so umbrochen, dass die Ziffer 0 darunter angezeigt wird.

Wenn druckbare ASCII-Eingaben empfangen werden, drucken Sie dieses ASCII-Zeichen an der zugewiesenen Bildschirmposition, ohne eines der derzeit auf dem Bildschirm angezeigten Zeichen zu löschen.

Regeln

  • Ihr Programm muss nur die druckbaren ASCII-Zeichen zuordnen, 0x20um 0x7E.
  • Ihr Programm darf erst dann beendet werden, wenn alle druckbaren ASCII-Zeichen eingegeben wurden. Von hier aus kann Ihr Programm entweder beendet oder in Neverland ausgeführt werden.
  • Ihr Programm kann Zeichen beliebig zuordnen, z. B. zu einer Tabelle, einer Tabelle, einem Konsolenfenster oder einem Grafikfenster.
  • Unabhängig davon, wie Sie das Mapping anzeigen, muss es in Echtzeit aktualisiert werden (sobald Benutzereingaben eingehen).
  • Wenn Ihr Programm Eingaben nicht im Hintergrund liest, muss es den Cursor aus dem Weg räumen, damit der Text die Karte nicht behindert.

Hilfe

Hier ist der Pseudocode-Algorithmus, mit dem ich das GIF erstellt habe:

loop forever
    c = input
    y_coord = c / 16
    x_coord = c - y * 16
    if c is printable
        print c at (x_coord * 2 + 1, y_coord + 1)
    end if
end loop

Es kann auch einen anderen Weg geben, um die erforderliche Leistung zu erzielen. Sie können meinen oder Ihren eigenen Algorithmus verwenden, aber die Ausgabe muss unabhängig davon gleich sein.

Hier ist eine nützliche ASCII-Tabellenreferenz.

Wertung

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


Müssen wir Leerzeichen zwischen den Zeichen haben?
musicman523

@ musicman523 Ja, die sind notwendig. Die Ausgabe muss genau so aussehen , wie in den Screenshots gezeigt.
MD XF

Dürfen wir die Hintergrundfarbe des Terminals annehmen?
Totalhuman

Ist das Löschen des Terminals und das erneute Zeichnen der aktualisierten Tabelle für jedes Zeichen akzeptabel?
Digital Trauma

@DigitalTrauma - Jedes Mal neu zu zeichnen ist akzeptabel - Ich habe in der Sandbox
nachgefragt

Antworten:


3

QBIC , 53 57 Bytes

4 Bytes für den Abstand hinzugefügt.

{locate 7,1┘_?┘i=asc(A)┘locate i/16-1,(i%16+1)*2┘?chr$(i)

QBIC begann die Entwicklung als Abkürzung für QBasic, daher dachte ich, dass die Übersetzung meiner QBasic-Antwort dies gut demonstrieren würde. Wir haben etwa 40% in der Byte-Anzahl für ein funktionsgleiche Programm gespeichert - und das ist auch bei LOCATE, ASCund CHRhat keine QBIC-Funktionen vor. Glücklicherweise kann QBIC Code direkt an QBasic übergeben, um dies zu kompensieren. Ein Side-by-Side:

QBIC              QBASIC
------------      ------------
{                 DO
locate 7,1        LOCATE 7,1
                  note that the lower-case alphabet is left unaltered in QBIC.
_?                LINE INPUT A$  (LINE INPUT used instead of INPUT to handle comma's)
i=asc(A)          i=ASC(A$)
locate i/16-1     LOCATE i/16-1
   ,(i%16+1)*2       ,(i MOD 16+1)*2
?chr$(i)          ?CHR$(i)
                  LOOP   (implicitly added to QBIC at EOF)

18

JavaScript (ES6) + HTML, 114 + 16 = 130 Byte

16 Bytes dank @Shaggy eingespart

a=Array(96).fill` `;onkeypress=k=>(a[k.key.charCodeAt()-32]=k.key,O.innerText=a.join` `.match(/.{1,32}/g).join`
`)
<pre id=O></pre>

Es ist so unglaublich befriedigend, nur die Tastatur zu zerdrücken ...


9
"So unglaublich befriedigend, nur die Tastatur zu zerdrücken" war vielleicht nicht das, wonach ich gesucht habe. 1
MD XF

Und ja, Sie können davon ausgehen, dass nur druckbares ASCII angegeben ist. Ich bin mir ziemlich sicher, dass das Regel Nr. 1 ist.
MD XF

Kannst du nicht einfach prompt()in einer Schleife verwenden? Es erspart Ihnen die gesamte Ereignisbehandlung und HTML. OP scheint es zu erlauben. Siehe die Kommentare des Mathematica-Posts.
Arjun

Kann nur druckbares ASCII verarbeiten. subtrahieren Sie 7 Bytes, wenn wir davon ausgehen können, dass nur druckbares ASCII angegeben ist. Das scheint nicht sinnvoll zu sein. Wenn nur druckbares ASCII verarbeitet wird, wie kann dann angenommen werden, dass druckbares ASCII alle Bytes speichert?
Arjun

Sie sollten in der Lage sein, nur onkeypressfür sich selbst zu verwenden, sodass Sie das bodyTag ablegen können. Auch das preTag kann auf gerade gekürzt werden <pre id=O. Sie müssen jedoch das Closing einschließen >, damit es in einem Snippet funktioniert.
Shaggy

15

QBasic 4.5, 81 85 Bytes

4 Bytes hinzugefügt, um der Abstandsregel zu entsprechen.

DO
LOCATE 7,1
LINE INPUT A$:i=ASC(A$)
LOCATE i\16-1,(i MOD 16+1)*2
?CHR$(i)
LOOP

Und die Ausgabe wird so aussehen (HINWEIS: Alter Screenshot, jetzt ist jedes Zeichen durch ein Leerzeichen getrennt):Bildbeschreibung hier eingeben

QBasic hat den LOCATEBefehl, der hier nützlich ist. Eine Aufschlüsselung dieses Codes:

DO                          Starts an infinite loop
LOCATE 7,1                  Moves the cursor out of the way
LINE INPUT A$:i=ASC(A$)     LINE INPUT gets user input; we need LINE INPUT instead of regular input
                            for support of <space> and <comma>. The ASC() function then takes the
                            ASCII value of the first character in the input, so it can deal with
                            inputs like 'Hello' - it will take ASC('H') and assign that to 'i'
LOCATE i\16-1               Here's the cool bit: LOCATE takes a row and a column to put the cursor on.
    ,(i MOD 16+1)*2         Row is determined by dividing the ASC value by 16, minus 1 (SPACE, ASC 32 
                            is placed on row 1), and for columns we take the modulo plus 1 (Again, SPACE 
                            mod 16 = 0, plus 1 = column 1). Multiplied by 2 gives us the spacing. 
                            We move the cursor to 1,2
?CHR$(i)                    PRINT a cast of the ASCII value to CHR at the specified location.
LOOP                        Ad infinitum

QBasic schlägt alle! Wow!
Arjun

5
@ Arjun Sie Kinder und Ihr Java ...
Steenbergh

8

Java 8 , 143 Bytes

o->{for(;;){char c=System.console().readPassword()[0];if(c>31&c<127)System.out.println(String.format("\u001B[%d;%df%c",c/16+1,(c%16+1)*2,c));}}

Verwendet den ANSI-Steuercode CSI n ; m f zum Festlegen der Cursorposition und Console.readPassword()zum stillen Lesen der Benutzereingaben. Ausgabe einiger Zeichen:

sscreenshot


1
Das erste Mal, dass ich sehe, dass Java auch im Codegolf eine Chance hat! Nett !
LMD

1
+1, noch nie so readPassword()gebraucht gesehen . Oh, und Ihnen scheint nach dem Ausdruck ein Semikolon zu fehlen. Ist es auch nicht möglich, System.out.printfirgendwie statt zu verwenden System.out.println(String.format(? Und Sie können zu wechseln ()->, o->indem Sie einen nicht verwendeten leeren Parameter verwenden .
Kevin Cruijssen

@ KevinCruijssen behoben, danke!
Bashful Beluga

6

BrainFuck , 355 Bytes

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

Die Optionen von BrainFuck sind ziemlich begrenzt, so dass die Ausgabe im Terminal erfolgt und der Bildschirm mit 20 Zeilenumbrüchen "gelöscht" wird. Die Eingabe sollte aus ASCII-Zeichen bestehen, die durch Zeilenumbrüche getrennt sind.

Probieren Sie es online!

Formatiert und dokumentiert

Dies sind die Debug-Hinweise, mit denen ich das Programm geschrieben habe. Ich habe meinen Interpreter verwendet, der optional den Zustand des Bandes bei jedem '~' Zeichen zum Debuggen drucken kann.

[
    run.bf
    codegolf.stackexchange.com/questions/124306/map-inputted-ascii-characters
]


[
    Calculate 16 * 6
    Resulting tape state:
    [0 0 0 0 0 0 16 96 0 0 0 0 ...]
               ^
    Note that, to obtain a 16-by-6 grid, the 16
    immediately to the right is decreased to 15
    (since we will decrease it by 1 each loop
    until we reach 0 and immediately reset)
]
>>>>++++[->++++[->+>++++++<<]<]>~

[
    Our next goal is to make 96 sets of 3 cells each in the pattern [C D 0]
    The first cell will represent an entered character--when the corresponding
    input on the keyboard is pressed, it will change to the entered key.
    The first cell is initialized to 32 (' ').

    The second cell will represent the delimiter after that character.
    Every 16 cells, this should be 10 for '\n'. Otherwise, it should be 32 for ' '.

    The third cell is a buffer cell, used for traversal of the grid. In general,
    it should be only temporarily modified and then reset to 0.
]

>->[-<
    [
       -<<<<++++[->++++++++<]
       [
           The second cell of our 3-set should be 32, so the above line
           writes 32 to the 3rd cell from the beginning of the tape (0-indexed)
       ]
    ]
    >>>
    [
       <<<[ The second cell of our 3-set should be 10, and we must reset the line counter ] 
       <<++++++++[->>++<<<+>]>>-<<<++>>
    ]

    [ At this point, the delimiting cell we need is two cells to the left. ]
    <<[>>>>>>[>>>]>+<<<<<[<<<]<<-]

    >>>>>>[>>>]++++[-<++++++++>]
    [ Debug Mode: In the previous loop, add a + in the string of 8 +'s to get visible spaces in the grid ($-signs) ]
    >[-<+>]<<[<<<]>>
]

[ Go back to the beginning of the tape and clear up the residual '15' ]
<[-]~

<<,

[
    [->+>+<<],[-]++++[->>--------<<]

    [
        Take input such that the state of the tape now looks like this:
        [0 0 0 0 0 c c-32 0 32 32 0 32 32 0 32 32 0 ...]
                 ^
        Where 'c' was the entered character.
        We now set up 1's in the buffer zones of the first c-32
        3-sets and clear the character that is currently there.
        All that is left, then, is to copy c to that location.
    ]

    [ Set up the row of 1's. ]
    >>[>>>>[>>>]+[<<<]<-]

    [ Clear the current character. ]
    >>>>[>>>]<<[-]~<[<<<]

    [ Copy the new character. ]
    <<[>>>>>[>>>]<<+<[<<<]<<-]

    [ Clean up the 1's. ]
    >>>>>[>>>]~<<<[[-]<<<]

    [ Print the grid. ]
    >[.>.>>]~

    [ Print a bunch of newlines ]
    ++++++++++[->+>++<<]>>[-<.>]<[-]

    [ Take a new input. ]
    <<<<[<<<]<,
]

6

Mathematica, 108 Bytes

a=" "~Table~16~Table~6;Dynamic@Grid@a
((a[[⌊#/16⌋-1,#~Mod~16+1]]=i)&@ToCharacterCode[i=Input[]];#0[])&[]

Versuchen Sie es online unter https://sandbox.open.wolframcloud.com/

Wenn Sie Code einfügen und drücken Shift+Enter, wird ein Dialogfeld angezeigt, das Sie "a"beispielsweise als Zeichen eingeben a. Das Programm läuft für immer.

Hinweis: In der Wolfram-Sandbox ist die Schriftart anders formatiert als in Mathematica auf meinem Computer. Der Zeilen- / Spaltenabstand sieht also möglicherweise seltsam aus.


Ordnet dies kontinuierlich jeden Charakter zu? Dh müssen Sie es mehrmals ausführen, um die gewünschte Ausgabe zu sehen?
MD XF

Sie führen es einmal aus, und jedes Mal, wenn Sie OKauf ein Eingabefeld drücken , wird ein anderes Eingabefeld angezeigt, in das Sie die Eingabe eingeben können.
user202729

Klingt dann gültig, danke. Gute Arbeit!
MD XF

Ich denke, i = ToString @ Input []] wäre praktischer. Benutzer sollten nur a und nicht "a"
eingeben

oder besser i = InputString []
J42161217

5

Python 2 , 115 Bytes

s='\n'.join([' '*31]*6)
while 1:
 c=input();i=ord(c)
 if 31<i<128:i-=32;i=i%16*2+i//16*32;s=s[:i]+c+s[i+1:];print s

Probieren Sie es online!

Benötigt Anführungszeichen (einfach oder doppelt) um die eingegebenen Zeichen (die TIO-Version nicht).


1
Sie können ändern , raw_inputum , inputwie es Gemeinschaft Volkszählung ist , dass Sie die Eingabe in Anführungszeichen es hat , wenn nötig annehmen kann.
Caird Coinheringaahing

1
Hört sich gut an! Beim Testen habe ich nur Schlüssel eingegeben, und es war unglücklich, dass ich {ohne eine Übereinstimmung eingegeben habe} .
musicman523

4

str , nicht konkurrierend, 18 Bytes

Vorstellung meiner neuen semi-esoterischen Sprache.

#C;dby16#/~2-~u#pq

Animiertes GIF

#C;dby16#/~2-~u#pq
..;                   preamble
#C                    clear screen
   ...............    main program; each character is pushed to the stack before
   d                  duplicate
    b                 buffer the character
     y                convert to character code
      16#/            divmod by 16 (a / b, a % 6)
          ~2-~        subtract a / b by 2
              u       unbuffer the character
               #p     place that character in the given position
                 q    "quiet"; disable auto-printing

Ich sehe keine Leerzeichen zwischen den Zeichen ...
MD XF

2
@MDXF Die Spezifikation sagt nichts über Leerzeichen zwischen Zeichen aus. Ganz zu schweigen davon, dass es viele Antworten gibt, die keine Leerzeichen verwenden.
Conor O'Brien

3

Haskell, 133 Bytes

p=putStr.("\27["++)
g l=do c<-getChar;p"2J";mapM h(c:l);g(c:l)
h c|(y,x)<-divMod(fromEnum c)16=p$show y++';':show(2*x+1)++'H':[c]
g[]

Erfordert ein Terminal, das ANSI-Escape-Sequenzen versteht.

Es ist kürzer, eine Liste aller bisher gedrückten Tasten zu halten und den Bildschirm zu löschen, bevor alle Tasten in jeder Runde gedruckt werden, als das Echo in der Terminalsitzung auszuschalten. Letzteres braucht import System.IOund hSetEcho stdin(2<1)was zu viele Bytes kostet.


3

C 101 Bytes

c,y,x;f(){while(~(c=getchar()))printf("\e[1;20H"),y=c/16,x=c-y*16,printf("\e[%d;%dH%c",y+1,x*2+1,c);}

Dies war das Programm, mit dem ich die Grafiken erstellt habe. Die Ausgabe erfolgt wie im GIF gezeigt. ;)


3

QBasic, 62 58 Bytes

a=ASC(INPUT$(1))
LOCATE a\16-1,1+2*(a MOD 16)
?CHR$(a)
RUN

Getestet mit QB64 . Sollte auch mit normalem QBasic gut funktionieren, obwohl Sie es möglicherweise ändern möchten, um aCLS beim ersten Start ausgeführt wird.

Ähnlich wie die Antwort von steenbergh , aber verwendet INPUT$(1), um Zeichen einzeln zu lesen. Dieser Ansatz ist kürzer und zeigt auch keine Eingabeaufforderung an. Es wird auch RUNfür die Endlosschleife verwendet, da zwischen den Iterationen nur der Status des Bildschirms gespeichert werden muss.


Wow nett. Wusste nicht input$(). Ich mag das TIPPS-Thema übrigens auch.
Steenbergh

1

Pascal, 112 Zeichen

Uses crt;var c:char;Begin ClrScr;repeat c:=ReadKey;GotoXY(ord(c)and$F*2+1,ord(c)shr 4-1);write(c);until 1<0;End.

Da meine Mathematica Lösung viele Bytes nimmt div, modund ToCharacterCode[Input[]]versuche ich , eine andere Antwort mit Pascal zu machen. Aber ohne ClrScrmeinen Compiler (FPC) blieben einige Kompilierinformationen auf dem Bildschirm. ClrScr;dauert 7 Bytes.

Der *2für den richtigen Abstand verwendete Wert benötigt weitere 2 Bytes.


1

LOGO, 90 Bytes

cs
rt 90
keyboardon[invoke[setxy 30*modulo ? 16 -30*int ?/16 label char ?]keyboardvalue]pu

Probieren Sie es auf FMSLogo.

Immerhin ist meine Logo-Lösung die kürzeste im Vergleich zu meiner Mathematica- und Pascal-Antwort.

Fügen Sie 3 Bytes hinzu, wenn die Schildkröte ausgeblendet werden soll.


1

6502 Maschinencode + Apple // e ROM, 31 Bytes

Hex-Dump:

8000- 20 58 FC 20 0C FD 48 38
8008- E9 A0 48 29 0F 0A 85 24
8010- 68 4A 4A 4A 4A 20 5B FB
8018- 68 20 ED FD 4C 03 80

Kommentierte Versammlung:

 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 RDKEY    =     $FD0C      ; GETS CHARACTER FROM KEYBOARD, STORES IN ACC
 6          ORG   $8000
 7          JSR   HOME
 8 GETINP   JSR   RDKEY
 9 * POSITION CURSOR
10          PHA              ; PRESERVE ACC
11          SEC              ; MAKE SURE CARRY IS SET TO SUBTRACT
12          SBC   #" "       ; SUBTRACT CHAR CODE OF SPACE
13          PHA              ; SAVE ACC
14          AND   #$0F       ; GET LOWER 4 BITS TO GET CURSOR X POSITION
15          ASL              ; SHIFT LEFT TO MAKE SPACES BETWEEN CHARS
16          STA   HTAB
17          PLA              ; GET OLD ACC
18          LSR              ; SHIFT HIGH NIBBLE
19          LSR              ; INTO LOW NIBBLE
20          LSR              ; TO GET CURSOR Y POSITION
21          LSR
22          JSR   SETVTAB
23          PLA              ; RESTORE ACC
24 *
25          JSR   COUT
26          JMP   GETINP

GIF-Demo

Wenn der Cursor ihn ungültig macht, ist dies eine 36-Byte-Version ohne Cursor:

8000- 20 58 FC AD 00 C0 10 FB
8008- 8D 10 C0 48 38 E9 A0 48
8010- 29 0F 0A 85 24 68 4A 4A
8018- 4A 4A 20 5B FB 68 20 ED
8020- FD 4C 03 80

1

Ruby, 79 75 71 + 13 = 84 Bytes

+13 Bytes für -rio/consoleFlag.

loop{$/+=STDIN.getch
97.times{|n|print$/[(n+31).chr]||" ",["
"][n%16]}}

Ungolfed

loop {
  $/ += STDIN.getch
  97.times {|n|
    print $/[(n+31).chr] || " ", ["
"][n%16]
  }
}

1

SmileBASIC 3, 82 Bytes

CLS
@L
C$=INKEY$()IF""!=C$THEN V=ASC(C$)-32LOCATE V MOD 16*2,V DIV 16*2?C$;
GOTO@L

Befindet sich im SmileBASIC-Zeichensatz dort, ¥wo \normalerweise wäre; hoffentlich macht dies diese Antwort nicht vollständig ungültig.


0

Applesoft BASIC , 134 Byte

0TEXT:HOME:PR#0
1C=PEEK(49152):POKE49168,0:HTAB1:VTAB20:NORMAL:IFC>=128THENC=C-128:INVERSE
4Y=INT(C/16):X=C-Y*16:HTABX*2+1:VTABY+1:IFC>=32THEN PRINTCHR$(C):IFC<32THEN PRINTCHR$(127)
9GOTO1

Dies ist eine Golfversion des Apple] [Tastaturtests, der die Herausforderung angeregt hat.


Dies sind tatsächlich 134 Bytes, da Applesoft BASIC tokenisiert ist.
insert_name_here

@insert_name_here Ah, ja. Vielen Dank.
MD XF
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.