Карта введенных символов ASCII


32

Не забудьте увидеть другой вызов, Reverse ASCII символьную карту !

Кодировка ASCII (американский стандартный код для обмена информацией) является наиболее широко используемым стандартом кодирования символов. Коды ASCII представляют текст в компьютерах, телекоммуникационном оборудовании и других устройствах.

Вызов

Ваша задача состоит в том, чтобы напечатать отображение набора символов ASCII, когда пользователь вводит их. GIF:

GIF

После того, как пользователь вводит каждый символ ASCII, вывод должен выглядеть следующим образом:

стол

картографирование

Каждому символу назначается позиция в логической сетке 16x6, начиная с символа пробела в левом верхнем углу и заканчивая таким образом, что под ним появляется цифра 0.

При получении печатного ввода ASCII напечатайте этот символ ASCII в назначенном для него месте на экране, не удаляя символы, отображаемые в данный момент на экране.

правила

  • Ваша программа должна только отобразить печатаемые символы ASCII, 0x20чтобы 0x7E.
  • Ваша программа не должна завершаться и продолжать отображать символы на экране до тех пор, пока не будут введены все печатные символы ASCII. Отсюда ваша программа может либо прекратить, либо убежать в Неверлэнд.
  • Ваша программа может отображать символы любым удобным вам способом, например, в электронную таблицу, таблицу, окно консоли или графическое окно.
  • Независимо от того, как вы отображаете отображение, оно должно обновляться в реальном времени (как только оно получает пользовательский ввод).
  • Если ваша программа не читает ввод молча, она должна убрать курсор, чтобы текст не мешал карте.

Помогите

Вот алгоритм псевдокода, который я использовал для генерации GIF:

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

Может быть другой способ достижения требуемого результата. Вы можете использовать мой алгоритм или свой собственный, но результат должен быть одинаковым независимо.

Вот полезная ссылка на таблицу ASCII.

счет

Ответ с наименьшим количеством байтов на каждом языке выигрывает. Повеселись!


Нужно ли иметь пробелы между персонажами?
musicman523

@ musicman523 Да, это необходимо. Вывод должен выглядеть точно так, как показано на скриншотах.
MD XF

Разрешено ли нам принимать цвет фона терминала?
полностью человек

Допустима ли очистка терминала, а затем перерисовывание обновленной таблицы для каждого символа?
Цифровая травма

@DigitalTrauma - Перерисовывать каждый раз, когда это приемлемо - я спросил в песочнице сообщение
musicman523

Ответы:


3

QBIC , 53 57 байт

Добавлено 4 байта для пробела.

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

QBIC начал разработку как сокращение для QBasic, поэтому я подумал, что перевод моего ответа QBasic продемонстрирует это наглядно. Мы сэкономили около 40% в байт-счетчик для функционально идентичной программы - и это даже тогда , когда LOCATE, ASCи CHRне имеют QBIC-функции еще. К счастью, QBIC может передать код непосредственно в QBasic, чтобы компенсировать это. Бок о бок:

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 байт

Сохранено 16 байтов благодаря @Shaggy

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>

Это так невероятно приятно просто пюре из клавиатуры ...


9
«так невероятно приятно просто помять клавиатуру», может быть, а может и не быть тем, к чему я стремился. +1
MD XF

И да, вы можете предположить, что дается только печатный ASCII. Я уверен, что это правило № 1.
MD XF

Вы не можете просто использовать prompt() внутри цикла? Это избавит вас от всей обработки событий и HTML. ОП, кажется, позволяет это. См. Комментарии к сообщению Mathematica.
Арджун

Только ручки для печати ASCII; вычтите 7 байт, если мы можем предположить, что задан только печатный ASCII, который, кажется, не имеет смысла. Если он обрабатывает только ASCII для печати, то как предположить, что ASCII для печати может сохранить байты?
Арджун

Вы должны быть в состоянии просто использовать onkeypress сам по себе, позволяя вам сбросить bodyтег. Также preтег можно сократить до всего <pre id=O. Тем не менее, вам нужно будет включить закрытие, >чтобы оно работало в сниппете.
Лохматый

15

QBasic 4.5, 81 85 байт

Добавлены 4 байта для соответствия правилу интервалов.

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

И вывод будет выглядеть так (ПРИМЕЧАНИЕ: старый скриншот, теперь каждый символ разделен пробелом):введите описание изображения здесь

У QBasic есть LOCATEкоманда, которая здесь пригодится. Разбивка этого кода:

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 побеждает всех! Вот Это Да!
Арджун

5
@Arjun Вы, дети и ваша Java ...
Steenbergh

8

Java 8 , 143 байта

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

Использует управляющий код ANSI CSI n ; m f для установки положения курсора и Console.readPassword()для тихого чтения пользовательского ввода. Вывод некоторых символов:

sscreenshot


1
В первый раз я вижу, что у Java есть шанс и в гольф-коде! Ницца !
LMD

1
+1, никогда не видел, readPassword()использовался таким образом. О, и вы, кажется, пропустили точку с запятой после печати. Кроме того, не возможно использовать System.out.printfкак-то вместо System.out.println(String.format(? И вы можете изменить ()->на o->с помощью неиспользуемого пустого параметра .
Кевин Круйссен

@KevinCruijssen Исправлено, спасибо!
Застенчивая Белуга

6

BrainFuck , 355 байт

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

Возможности BrainFuck довольно ограничены, поэтому вывод выводится в терминале, а экран «очищается» с помощью 20 новых строк. Ввод должен состоять из символов ASCII, разделенных символами новой строки.

Попробуйте онлайн!

Отформатировано и задокументировано

Это отладочные заметки, которые я использовал для написания программы. Я использовал мой интерпретатор, который может дополнительно печатать состояние ленты на каждом символе '~' для отладки.

[
    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 байт

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

Попробуйте это онлайн на https://sandbox.open.wolframcloud.com/

Когда вы вставляете код и нажимаете Shift+Enter, появляется диалоговое окно, вы вводите, "a"например, для символаa . Программа работает вечно.

Примечание. В песочнице Wolfram шрифт отформатирован не так, как в Mathematica на моем компьютере. Так что интервал между строками и столбцами может выглядеть странно.


Это постоянно отображает каждого персонажа? Т.е. вам нужно запустить его несколько раз, чтобы увидеть желаемый результат?
MD XF

Вы запускаете его один раз, и каждый раз, когда вы нажимаете OKна поле ввода, появляется другое поле ввода для ввода ввода.
user202729

Звучит правильно, спасибо. Хорошая работа!
MD XF

Я думаю, что i = ToString @ Input []] будет более удобным. Пользователям следует просто ввести a, а не «a»
J42161217

или лучше я = InputString []
J42161217

5

Python 2 , 115 байт

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

Попробуйте онлайн!

Требуются кавычки (одинарные или двойные) вокруг введенных символов (версия TIO этого не делает).


1
Вы можете изменить raw_inputэто, inputпоскольку это перепись сообщества, и вы можете предположить, что входные данные содержат кавычки, если это необходимо.
Caird Coneheringaahing

1
Звучит хорошо! Когда я тестировал, я просто вводил ключи, и было неприятно, что я вводил {без соответствия }.
musicman523

4

ул , неконкурентный, 18 байт

Представляю мой новый полуэзотерический язык.

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

Анимированный 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

Я не вижу пробелов между персонажами ...
MD XF

2
@MDXF В спецификации ничего не говорится о пробелах между символами. Не говоря уже о том, что есть много ответов, которые не используют пробелы.
Конор О'Брайен

3

Haskell, 133 байта

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

Требуется терминал, который понимает escape-последовательности ANSI.

Короче держать список всех нажатых клавиш и очищать экран перед печатью всех из них каждый раунд, чем отключать эхо в терминальной сессии. Последний нуждается import System.IOи hSetEcho stdin(2<1)который стоит слишком много байтов.


3

C 101 байт

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

Это была программа, которую я использовал для создания графики. Вывод, как показано в GIF. ;)


3

QBasic, 62 58 байт

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

Протестировано с QB64 . Должно работать и на обычном QBasic, хотя вы можете изменить его, чтобы сделатьCLS при первом запуске.

Похоже на ответ Стинберга , но использует INPUT$(1)для чтения символов по одному. Этот подход короче и также не отображает подсказку. Он также используется RUNдля бесконечного цикла, так как нам не нужно хранить какое-либо состояние между итерациями, кроме состояния экрана.


Вау круто. Не знал о input$(). Мне тоже нравится TIPS-тема.
Стинберг

1

Паскаль, 112 символов

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.

Поскольку мое решение Mathematica занимает много байтов div, modи ToCharacterCode[Input[]]я пытаюсь найти другой ответ с помощью Паскаля. Но без ClrScrмоего компилятора (FPC) на экране остались некоторые сведения о компиляции. ClrScr;занимает 7 байтов.

*2Используется для правильного расстояния занимает еще 2 байта.


1

LOGO, 90 байт

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

Попробуйте это на FMSLogo.

В конце концов, мое решение с логотипом является самым коротким по сравнению с моими ответами Mathematica и Pascal.

Добавьте 3 байта, если черепаха должна быть скрыта.


1

6502 машинный код + Apple // e ROM, 31 байт

Шестнадцатеричный дамп:

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

Комментируемая сборка:

 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 демо

Если курсор делает его недействительным, вот 36-байтовая версия без курсора:

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 байта

+13 байт за -rio/consoleфлаг.

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 байта

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

В наборе символов SmileBASIC ¥находится там, где \обычно будет; надеюсь, это не лишит законной силы этот ответ полностью.


0

Applesoft BASIC , 134 байта

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

Это гольф-версия Apple] [тест клавиатуры, программа, которая вдохновила вызов.


Это на самом деле 134 байта, поскольку Applesoft BASIC является токенизированным.
insert_name_here

@insert_name_here Ах, да. Спасибо.
MD XF
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.