Символи ASCII, введені на карті


32

Не забудьте побачити інший виклик, Зворотну карту символів ASCII !

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

Виклик

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

gif

Після введення користувачем кожного символу ASCII, вихід повинен виглядати так:

стіл

Картографування

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

Коли надходить вхід ASCII для друку, надрукуйте цей символ ASCII у призначеному для нього екрані, не видаляючи жодного із символів, що перебувають на екрані.

Правила

  • Вашій програмі потрібно лише відобразити ASCII символи 0x20для друку для 0x7E.
  • Ваша програма не повинна завершуватись і продовжувати відображати символи на екрані, поки не будуть введені всі друковані символи ASCII. З цього моменту ваша програма може або припинити роботу, або перебігти в Neverland.
  • Програма може відображати символи будь-яким способом, наприклад, електронною таблицею, таблицею, вікном консолі або графічним вікном.
  • Незалежно від того, як ви відображаєте відображення, воно повинно бути оновлене в режимі реального часу (як тільки воно отримає введення користувача).
  • Якщо ваша програма не читає введення мовчки, вона повинна вивести курсор з шляху, щоб текст не заважав карті.

Довідка

Ось алгоритм псевдокоду, який я використовував для створення 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 - Перемальовування кожного разу є прийнятним - я запитав у повідомленні Sandbox
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
@ Арджун Діти та ваша 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()для беззвучного читання вводу користувача. Виведення деяких символів:

знімок екрана


1
Перший раз, коли я бачу, що у Java є шанс і в коді гольфу! Приємно!
LMD

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

@KevinCruijssen Виправлено, дякую!
Bashful Beluga

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

Математика, 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поле для введення, для вас вводиться інше поле для введення.
користувач202729

Тоді звучить дійсно, дякую. Хороша робота!
MD XF

Я думаю, що i = ToString @ Input []] буде більш
зручним. Користувачі

або краще i = 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 coinheringaahing

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

4

str , неконкурентоспроможний, 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 Специфікація нічого не говорить про пробіли між символами. Не кажучи вже про те, що є безліч відповідей, які не використовують пробіли.
Conor O'Brien

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

Потрібен термінал, який розуміє послідовності виходу 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під час першого запуску.

Схожі на відповідь steenbergh в , але використовує INPUT$(1)для читання символів по одному за раз. Цей підхід коротший і також не відображає підказки. Він також використовується RUNдля нескінченного циклу, оскільки нам не потрібно зберігати будь-який стан між ітераціями, крім стану екрана.


Вау приємно. Не знав про input$(). Мені подобається ТІВ-ТЕПИ занадто btw.
steenbergh

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

Рубі, 79 75 71 + 13 = 84 байт

+13 байт для -rio/consoleпрапора.

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

Безумовно

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.