입력 한 ASCII 문자 맵


32

다른 도전 과제 인 ASCII 문자 반전 을 참조하십시오 !

ASCII 문자 집합 (정보 교환을위한 미국 표준 코드)은 가장 널리 사용되는 문자 인코딩 표준입니다. ASCII 코드는 컴퓨터, 통신 장비 및 기타 장치의 텍스트를 나타냅니다.

도전

사용자가 입력 할 때 ASCII 문자 집합의 매핑을 인쇄해야합니다. GIF :

gif

사용자가 모든 ASCII 문자를 입력 한 후 출력은 다음과 같아야합니다.

표

매핑

각 문자는 16x6 논리 그리드에서 할당 된 위치를 갖습니다. 왼쪽 위의 공백 문자부터 시작하여 숫자 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-매번 다시 그리기가 허용됩니다-샌드 박스 포스트에서 요청했습니다
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

자바 스크립트 (ES6) + HTML, 114 + 16 = 130 바이트

@Shaggy 덕분에 16 바이트 절약

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에서 당신을 구할 것입니다. OP가 허용하는 것 같습니다. Mathematica 포스트의 의견을 참조하십시오.
Arjun

인쇄 가능한 ASCII 만 처리합니다. 인쇄 가능한 ASCII 만 제공한다고 가정 할 수 있으면 7 바이트를 빼십시오 . 인쇄 가능한 ASCII 만 처리하는 경우 인쇄 가능한 ASCII를 가정하면 바이트를 저장할 수 있다고 가정 할 수 있습니까?
Arjun

당신은 태그 onkeypress를 떨어 뜨릴 수 있도록 스스로 사용할 수 있어야합니다 body. 또한 pre태그를 just로 단축 할 수 있습니다 <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

그리고 출력은 다음과 같습니다 (참고 : 이전 스크린 샷, 이제 모든 문자가 공백으로 구분됨).enter image description here

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이 모든 사람을 이깁니다! 와우!
Arjun

5
@Arjun 당신과 당신의 자바 ...
steenbergh

8

자바 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()사용 된 적이 없습니다 . 아, 그리고 println 후에 세미콜론이 빠져있는 것 같습니다. 또한 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하면 입력 상자 를 누를 때마다 입력을 입력 할 수있는 다른 입력 상자가 나타납니다.
user202729

유효한 것 같습니다. 감사합니다. 좋은 작업!
MD XF

나는 i = ToString @ Input []]이 더 편리하다고 생각합니다. 사용자는 "a"가 아닌 a를 입력해야합니다.
J42161217

또는 더 나은 i = InputString []
J42161217

5

파이썬 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_inputinput필요한 경우 입력이 따옴표를 가지고 가정 할 수 있다는 그대로 지역 사회의 인구 조사.
caird coinheringaahing

1
잘 들린다! 테스트 할 때 키를 입력하기 만했지만 {일치하지 않고 입력 한 것이 마음에 들지 않았습니다 }.
musicman523 2016 년

4

str , 비경쟁, 18 바이트

나의 새로운 반비 언어 표현.

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

Animated 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

하스켈, 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

Q 기본, 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$(). TIPS 주제도 너무 좋아합니다.
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.

내 티카 솔루션은 많은 바이트를 필요로 div, mod그리고 ToCharacterCode[Input[]], 나는 파스칼과 다른 답변을하려고합니다. 그러나 ClrScr내 컴파일러 (FPC)가 없으면 컴파일 정보가 화면에 남았습니다.ClrScr;7 바이트가 걸립니다.

*2적절한 간격 사용될 다른 2 바이트 걸린다.


1

로고, 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 바이트

-rio/console플래그의 경우 +13 바이트

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] [키보드 테스트의 골프 버전입니다.


Applesoft BASIC이 토큰 화되어 있기 때문에 실제로는 134 바이트입니다.
insert_name_here 23

@insert_name_here 아, 그렇습니다. 감사.
MD XF
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.