Bản đồ nhập các ký tự ASCII


32

Hãy chắc chắn để xem thử thách khác, đảo ngược bản đồ nhân vật ASCII !

Bộ ký tự ASCII (Mã tiêu chuẩn Mỹ để trao đổi thông tin) là tiêu chuẩn mã hóa ký tự được sử dụng rộng rãi nhất. Mã ASCII thể hiện văn bản trong máy tính, thiết bị viễn thông và các thiết bị khác.

Thử thách

Thách thức của bạn là in một ánh xạ của bộ ký tự ASCII khi người dùng nhập chúng. QUÀ TẶNG:

gif

Sau khi người dùng nhập mọi ký tự ASCII, đầu ra sẽ như thế này:

bàn

Lập bản đồ

Mỗi ký tự có một vị trí được gán trên lưới logic 16x6, bắt đầu bằng ký tự khoảng trắng ở vị trí trên cùng bên trái và gói sao cho chữ số 0 xuất hiện bên dưới nó.

Khi nhận được đầu vào ASCII có thể in, hãy in ký tự ASCII đó tại vị trí màn hình được chỉ định mà không xóa bất kỳ ký tự nào hiện trên màn hình.

Quy tắc

  • Chương trình của bạn chỉ cần vạch ra các ký tự ASCII in được, 0x20để 0x7E.
  • Chương trình của bạn không được chấm dứt và tiếp tục ánh xạ các ký tự lên màn hình cho đến khi tất cả các ký tự ASCII có thể in được nhập vào. Từ đây, chương trình của bạn có thể chấm dứt hoặc chạy vào Neverland.
  • Chương trình của bạn có thể ánh xạ các ký tự theo bất kỳ cách nào bạn thích, ví dụ như bảng tính, bảng, cửa sổ bảng điều khiển hoặc cửa sổ đồ họa.
  • Bất kể bạn hiển thị ánh xạ như thế nào, nó phải được cập nhật trong thời gian thực (ngay khi nhận được đầu vào của người dùng).
  • Nếu chương trình của bạn không đọc đầu vào một cách im lặng, nó phải đặt con trỏ ra khỏi đường đi, vì vậy văn bản sẽ không cản trở bản đồ.

Cứu giúp

Đây là thuật toán mã giả mà tôi đã sử dụng để tạo 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

Có thể có một cách khác để đạt được đầu ra cần thiết. Bạn có thể chọn sử dụng thuật toán của tôi hoặc của riêng bạn, nhưng đầu ra phải giống nhau bất kể.

Đây là một tài liệu tham khảo bảng ASCII hữu ích.

Chấm điểm

Câu trả lời có ít byte nhất trong mỗi ngôn ngữ sẽ thắng. Chúc vui vẻ!


Chúng ta có cần phải có khoảng cách giữa các nhân vật không?
sĩ523

@ musicman523 Đúng, những thứ đó là cần thiết. Đầu ra phải trông chính xác như được hiển thị trong ảnh chụp màn hình.
MD XF

Chúng ta có được phép giả sử màu nền của thiết bị đầu cuối không?
hoàn toàn là

Việc xóa thiết bị đầu cuối, sau đó vẽ lại bảng cập nhật cho mỗi char có được chấp nhận không?
Chấn thương kỹ thuật số

@DigitalTrauma - Vẽ lại mỗi lần là chấp nhận được - Tôi đã hỏi trong bài Sandbox
musicman523

Câu trả lời:


3

QBIC , 53 57 byte

Đã thêm 4 byte cho khoảng cách.

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

QBIC bắt đầu phát triển như một cách viết tắt cho QBasic, vì vậy tôi nghĩ rằng việc dịch câu trả lời QBasic của tôi sẽ chứng minh điều này một cách độc đáo. Chúng tôi đã lưu khoảng 40% trong byte-count cho một chương trình về mặt chức năng giống hệt nhau - và đó là ngay cả khi LOCATE, ASCCHRkhông có QBIC chức năng nêu ra. May mắn thay, QBIC có thể chuyển mã trực tiếp đến QBasic để bù đắp cho điều này. Một bên:

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

Đã lưu 16 byte nhờ @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>

Thật là thỏa mãn đến khó tin khi chỉ cần nghiền bàn phím ...


9
"Thật không thể tin được thỏa mãn khi chỉ cần nghiền bàn phím" có thể hoặc không thể là những gì tôi sẽ làm. +1
MD XF

Và có, bạn chỉ có thể giả sử ASCII có thể in được đưa ra. Tôi khá chắc chắn đó là quy tắc số 1.
MD XF

Bạn có thể chỉ sử dụng prompt()trong một vòng lặp? Nó sẽ cứu bạn khỏi tất cả các xử lý sự kiện và HTML. OP dường như cho phép nó. Xem bình luận của Mathicala.
Arjun

Chỉ xử lý ASCII có thể in; trừ 7 byte nếu chúng ta chỉ có thể giả sử ASCII có thể in được đưa ra Điều đó dường như không có ý nghĩa. Nếu nó chỉ xử lý ASCII có thể in được, thì làm sao giả sử ASCII có thể in có thể lưu bất kỳ byte nào?
Arjun

Bạn chỉ có thể sử dụng một onkeypressmình, cho phép bạn bỏ bodythẻ. Ngoài ra, prethẻ có thể được rút ngắn để chỉ <pre id=O. Mặc dù, bạn sẽ cần bao gồm việc đóng >để nó hoạt động trong Đoạn trích.
Xù xì

15

QBasic 4.5, 81 85 byte

Đã thêm 4 byte để tuân thủ quy tắc giãn cách.

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

Và đầu ra sẽ như thế này (LƯU Ý: Ảnh chụp màn hình cũ, bây giờ mọi ký tự được phân tách bằng khoảng trắng):nhập mô tả hình ảnh ở đây

QBasic có LOCATElệnh, có ích ở đây. Bảng phân tích mã này:

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 đánh bại tất cả mọi người! Ồ
Arjun

5
@Arjun Bạn trẻ em và Java của bạn ...
steenbergh

8

Java 8 , 143 byte

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

Sử dụng mã điều khiển ANSI CSI n ; m f để đặt vị trí con trỏ và Console.readPassword()đọc âm thanh đầu vào của người dùng. Đầu ra của một số ký tự:

ssc mãi


1
Lần đầu tiên tôi thấy rằng Java cũng có cơ hội chơi golf mã! Tốt đẹp !
LMD

1
+1, chưa từng thấy readPassword()sử dụng như thế. Ồ, và bạn dường như đang thiếu một dấu chấm phẩy sau println. Ngoài ra, không thể sử dụng System.out.printfbằng cách nào đó thay vì System.out.println(String.format(? Và bạn có thể thay đổi ()->để o->bằng cách sử dụng một tham số trống chưa sử dụng .
Kevin Cruijssen

@KevinCruijssen Đã sửa, cảm ơn!
Bashful Beluga

6

BrainFuck , 355 byte

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

Các tùy chọn của BrainFuck khá hạn chế, do đó, đầu ra nằm trong thiết bị đầu cuối và màn hình bị "xóa" với 20 dòng mới. Đầu vào phải là các ký tự ASCII, được phân tách bằng các dòng mới.

Hãy thử trực tuyến!

Định dạng và tài liệu

Đây là những ghi chú gỡ lỗi tôi đã sử dụng để viết chương trình. Tôi đã sử dụng trình thông dịch của mình để có thể tùy ý in trạng thái của băng ở mọi ký tự '~' để gỡ lỗi.

[
    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

Toán học, 108 byte

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

Dùng thử trực tuyến tại https://sandbox.open.wolframcloud.com/

Khi bạn dán mã và nhấn Shift+Enter, một hộp thoại sẽ bật lên, bạn nhập "a"ví dụ cho ký tựa . Chương trình chạy mãi mãi.

Lưu ý: Trên hộp cát Wolfram, phông chữ được định dạng khác với phông chữ trong Mathicala trong máy tính của tôi. Vì vậy, khoảng cách dòng / cột có thể trông lạ.


Điều này liên tục vạch ra mỗi nhân vật? Tức là bạn phải chạy nó nhiều lần để thấy đầu ra mong muốn?
MD XF

Bạn chạy nó một lần và mỗi lần bạn nhấn OKmột hộp đầu vào, một hộp đầu vào khác xuất hiện để bạn nhập dữ liệu nhập.
dùng202729

Âm thanh hợp lệ rồi, cảm ơn. Công việc tốt!
MD XF

Tôi nghĩ rằng i = ToString @ Input []] sẽ thuận tiện hơn. Người dùng chỉ nên gõ a chứ không phải "a"
J42161217

hoặc tốt hơn i = InputString []
J42161217

5

Python 2 , 115 byte

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

Hãy thử trực tuyến!

Yêu cầu dấu ngoặc kép (đơn hoặc kép) xung quanh các ký tự được nhập (phiên bản TIO không).


1
Bạn có thể thay đổi raw_inputthành inputđiều tra dân số cộng đồng mà bạn có thể giả sử đầu vào có dấu ngoặc kép xung quanh nó nếu cần.
caird coinheringaahing

1
Nghe hay đấy! Khi tôi đang kiểm tra tôi chỉ nhập các khóa, và thật không vui khi tôi nhập {mà không khớp }.
sĩ523

4

str , không biên dịch, 18 byte

Trình bày ngôn ngữ bán bí truyền mới của tôi.

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

GIF hoạt hình

#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

Tôi không thấy khoảng trắng giữa các nhân vật ...
MD XF

2
@MDXF Thông số kỹ thuật không nói gì về khoảng trắng ở giữa các ký tự. Chưa kể có rất nhiều câu trả lời không sử dụng khoảng trắng.
Conor O'Brien

3

Haskell, 133 byte

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

Yêu cầu một thiết bị đầu cuối hiểu các chuỗi thoát ANSI.

Sẽ ngắn hơn để giữ một danh sách tất cả các phím được nhấn cho đến nay và xóa màn hình trước khi in tất cả các phím đó mỗi lần thay vì tắt tiếng vang trong phiên cuối. Cái sau cần import System.IOhSetEcho stdin(2<1)có giá quá nhiều byte.


3

C, 101 byte

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

Đây là chương trình tôi sử dụng để làm đồ họa. Đầu ra như thể hiện trong GIF. ;)


3

QBasic, 62 58 byte

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

Đã thử nghiệm với QB64 . Cũng nên hoạt động tốt trên QBasic thường xuyên, mặc dù bạn có thể muốn sửa đổi nó để thực hiệnCLS lần chạy đầu tiên.

Tương tự như câu trả lời của steenbergh , nhưng sử dụng INPUT$(1)để đọc từng ký tự một. Cách tiếp cận này ngắn hơn và cũng không hiển thị kịp thời. Nó cũng sử dụng RUNcho vòng lặp vô hạn, vì chúng ta không phải lưu trữ bất kỳ trạng thái nào giữa các lần lặp ngoại trừ trạng thái của màn hình.


Ồ, thật tuyệt Không biết về input$(). Tôi thích chủ đề TIPS quá btw.
steenbergh

1

Pascal, 112 ký tự

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.

Vì giải pháp Mathicala của tôi cần nhiều byte div, modToCharacterCode[Input[]], tôi thử thực hiện một câu trả lời khác với Pascal. Nhưng không có ClrScrtrình biên dịch (FPC) của tôi để lại một số thông tin biên dịch trên màn hình. ClrScr;mất 7 byte.

Việc *2sử dụng cho khoảng cách thích hợp mất thêm 2 byte.


1

LOGO, 90 byte

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

Hãy thử nó trên FMSLogo.

Rốt cuộc, giải pháp Logo của tôi là ngắn nhất, so với câu trả lời Mathicala và Pascal của tôi.

Thêm 3 byte nếu rùa được yêu cầu ẩn.


1

Mã máy 6502 + Apple // e ROM, 31 byte

Đổ lục giác:

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

Nhận xét lắp ráp:

 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

Bản demo GIF

Nếu con trỏ làm mất hiệu lực nó, đây là phiên bản 36 byte không có con trỏ:

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 byte

+13 byte cho -rio/consolecờ.

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

Ung dung

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

1

SmileBASIC 3, 82 byte

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

Trong bộ ký tự SmileBASIC, ¥được đặt ở nơi \bình thường; hy vọng điều này không làm mất hiệu lực câu trả lời này hoàn toàn.


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

Đây là phiên bản chơi gôn của Apple] [kiểm tra bàn phím, chương trình truyền cảm hứng cho thử thách.


Đây thực sự là 134 byte, vì Applesoft BASIC được mã hóa.
insert_name_here

@insert_name_here À, vâng. Cảm ơn.
MD XF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.