Sơ đồ ký tự đảo ngược ASCII


8

Trong Bản đồ đã nhập các ký tự ASCII , tôi đã yêu cầu bạn .. ánh xạ các ký tự ASCII đã nhập. Lần này, bạn sẽ làm ngược lại, bằng cách lập tức ánh xạ tất cả các ký tự ASCII và sau đó ánh xạ các không gian trên chúng.

Chương trình này sẽ có những ứng dụng thực tế, chẳng hạn như xem những nhân vật bạn còn lại trong bản đệ trình thử thách .

Thử thách

Công việc của bạn là viết một chương trình bỏ các ký tự ASCII. Ngay khi chương trình được chạy, nó sẽ hiển thị bản đồ chính xác này (ngoại trừ màu sắc, phông chữ, kích thước, v.v.):

bước 1

Mỗi lần người dùng nhập một ký tự ASCII có thể in, bạn sẽ in một khoảng trắng trên nó.

gif

Quy tắc

  • Đầu ra ban đầu phải chính xác như được hiển thị trong hình ảnh đầu tiên ở trên: lưới 6x16 với các ký tự ASCII ở vị trí tương ứng của chúng, với khoảng trắng (32) ở trên cùng bên trái và dấu ngã (126) ở một ký tự bên trái từ dưới cùng bên phải.
  • Chương trình của bạn chỉ cần để hiển thị 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 in khoảng trắng trên các ký tự cho đến khi tất cả các ký tự ASCII có thể in được ghi đè. Từ đây, chương trình của bạn có thể chấm dứt hoặc chạy vào Neverland.
  • Bản đồ đảo ngược của bạ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 đồ.

Đây là bảng ASCII hữu ích để tham khảo.

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ẻ!


Lưu ý đối với những người bỏ phiếu tiềm năng hoặc những người bỏ phiếu trùng lặp - sẽ khó khăn hơn khi đưa ra câu trả lời trên codegolf.stackexchange.com/q/124306/61563 tới đây hơn là viết câu trả lời của riêng bạn. Các câu trả lời ở đó đọc đầu vào và sau đó sử dụng đầu vào để in ra màn hình. Câu trả lời ở đây phải in ra màn hình mà không cần nhập liệu (sử dụng cơ chế lặp khác nhau) và sau đó kiểm tra từng ký tự được nhập cho vị trí của nó, sau đó in một ký tự khác.
MD XF

Chúng ta có thể giả sử rằng người dùng nhấn enter sau khi anh ta nhập 1 ký tự không?
Ông Xcoder

@ Mr.Xcoder Có, điều đó tốt cho các ngôn ngữ không thể nhận đầu vào trong thời gian thực.
MD XF

@ Mr.Xcoder Xem quy tắc 1 -Your program only needs to display the printable ASCII characters, 0x20 to 0x7E
MD XF

3
@MDXF Nó vẫn rất giống với thử thách ban đầu. Tôi chỉ cần in các ký tự ascii đến đúng vị trí, sau đó, thay vì đặt đầu vào của người dùng vào đúng vị trí, tôi chỉ sử dụng một khoảng trắng để thay thế.
Conor O'Brien

Câu trả lời:


2

SOGL V0.12 , 23 byte

] ~Δ8«n"5αx2⁰³⁄¹‘→č@ŗ░T

Hãy thử nó ở đây!

Lấy đầu vào trong hộp đầu vào. Tôi hy vọng rằng vấn đề không phải là quá lớn mà các nhân vật có thể bị xóa: p

Giải trình:

]                   do.. while (popping (which makes the stack not blow up luckily :D))
  ~Δ                push the ascii characters (range("~"))
    8«n             split into lines of length 16
       "...‘        push "inputs.value" (could be 2 bytes less if my dictionary contained the word "inputs". I even added "input", but only now realise that the input box is id=inputs :/)
            →       evaluate as JavaScript, then push the result
             č      chop into characters
              @ŗ    replace each of the characters in the array with space
                ░   clear the output
                 T  output without popping (so do..while continues looping)

6

Mã máy x86-16, 62 byte

Đổ lục giác:

BC0100B101B07EBAFE0581EAE00080EA02B402CD1085E4750830E439C5750A30C0B40ACD1084C074094884D275E085D275D831C031E4CD1630E489C5EBC7

Hội,, tổ hợp:

mov sp, 0x0001           ; Stack pointer is used as a flag; 0 - Print all characters, 1 - Delete specific character
mov cl, 0x01             ; Number of characters to print per interrupt call

printString:
  mov al, 0x7E           ; Last character to print
  mov dx, 0x05FE         ; Row: 0x05, Collumn: 0xFE
  printRow:
    sub dx, 0x00E0       ; Decrement row number + 2 extra characters
    printChar:
      sub dl, 0x02       ; Decrement collumn index + 1 space
      mov ah, 0x02       ; Prepare for interrupt call, 0x02 - Set cursor position
      int 0x10           ; BIOS interrupt

      test sp, sp        ; Are we printing all characters or removing specific character
      jnz print          ; In first case just print it and go on
      xor ah, ah         ; Otherwise reset the upper byte of ax (shorter than "and ax, 0x00FF")
      cmp bp, ax         ; Is the current character same as the input character
      jne after          ; If no, continue searching
      xor al, al         ; If yes, remove it

      print:
        mov ah, 0x0A     ; Prepare for print
        int 0x10         ; Print

      test al, al        ; If we found target character
      jz loop            ; then stop searching

      after:
        dec ax           ; Shorter than "dec, al"
        test dl, dl      ; Is it the last character in the row
        jnz printChar    ; If no, continue searching
    test dx, dx          ; Is it last char
    jnz printRow         ; If no, go to next row

loop:
  xor ax, ax             ; Remove "ah" cache
  xor sp, sp             ; Reset sp (it will never become 1 again)
  int 0x16               ; BIOS interrupt for reading keyboard input
  xor ah, ah             ; Again reset "ah", because BIOS may change it
  mov bp, ax             ; Save it in stack base pointer
  jmp printString        ; Remove the character from the list

nhập mô tả hình ảnh ở đây


2

C ++ (Visual C ++) , 253 (@Step Hen) 261 byte

#include<cstdlib>
#include<iostream>
#include<conio.h>
int main(){char a[0x5E];for(int i=0;i<0x5E;i++)a[i]=(char)(i+0x20);while(true){system("cls");for(int i=0;i<0x5E;i++)if(i&&!(i%16))printf("\n%c ",a[i]);else printf("%c ",a[i]);a[_getch()-0x20]=' ';}}

Chào mừng đến với PPCG! Tôi tin rằng bạn có thể xóa các khoảng trắng sau #includes, cũng như i + 0x20-> i+0x20. Tôi có thể sai mặc dù.
Stephen


1

Python 2 , 132 byte

Đã lưu 4 byte nhờ @alleks!

s=''
for i in range(32,128,16):s+=' '.join(map(chr,range(i,i+16)))+'\n'
while 1:print s[:-2];i=2*ord(input())-64;s=s[:i]+' '+s[i+1:]

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


Cái này in 0x7f sau dấu ngã, chỉ fyi
Conor O'Brien

@ ConorO'Brien Rất tiếc, đã sửa
Musicman523

1
Bất kỳ lý do nào bạn không thể chỉ cần thêm [:-2]sau print sđó?
alleks

@alleks có quá nhiều ý nghĩa đó là lý do tại sao
Musicman523

1

JavaScript (ES6) + HTML, 139 136 116 + 10 16 = 132 byte

-3 byte nhờ @Shaggy.
-14 byte lấy cảm hứng từ @Arnauld.

for(i=32;i<127;)O[h="innerText"]+=String.fromCharCode(i++)+(i%16?" ":`
`);onkeypress=e=>O[h]=O[h].replace(e.key," ")
<pre id=O></pre>

preThẻ đóng là bắt buộc trong trường hợp này, vì chúng ta cần innerTextgiá trị để bắt đầu trống hoàn toàn.


Lưu 2 byte với O[h="innerHTML"]=a=[...Array(95)].map().
Xù xì

Và tôi nghĩ bạn có thể lưu một byte khác bằng cách loại bỏ ahoàn toàn.
Xù xì

1
@Shaggy Cảm ơn, tôi đã sử dụng abiến phụ vì innerHTMLđang chuyển &sang &amp;, cùng với một số biến khác. Chuyển sang innerTextcố định mà.
Justin Mariner

Bạn có thể di chuyển iđến phạm vi toàn cầu để lưu 2 byte:map(_=>String.fromCharCode(i++)+(i%16?...),i=32)
Arnauld

@Arnauld Sử dụng ý tưởng đó, tôi chỉ có thể xóa toàn bộ ánh xạ mảng và sử dụng vòng lặp for. Cảm ơn!
Justin Mariner

1

QBasic , 107 byte

Một hàm ẩn danh dùng làm tổ hợp phím và xóa bảng ASCII

FOR x=32TO 126
L x
?CHR$(x)
NEXT
DO
L ASC(Input$(1))
?" "'<- `"` included for highlighting only
LOOP
SUB L(x)
LOCATE x\16-1,2*(x MOD 16)+1
END SUB

-8 byte nhờ @DLosc


@DLosc - Tôi thậm chí đã không cân nhắc sử dụng một Subgiải pháp tuyệt vời ở đó. Thật không may, chúng tôi phải tính End Sublà cộng đồng đã quyết định rằng tự động hoàn thành không hợp lệ (ít nhất là với VBA, nhưng tôi chắc chắn rằng nó cũng áp dụng ở đây)
Taylor Scott

Huh, điều đó thật thú vị - Tôi đã không nhận ra có sự khác biệt giữa tự động định dạng và tự động hoàn thành. Tốt để biết.
DLosc

0

C # (.NET Core) , (138 + sử dụng System;) 151 byte

()=>{var j="";for(int i=32;i<127;i++){if(i%16<1)j+='\n';j+=(char)i+" ";}while(1>0){Console.Write(j);j=j.Replace(Console.ReadLine()," ");}}

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



Ồ nhưng bạn cần đưa using System;vào số byte của mình nếu bạn chưa có (Tôi quên thêm nó vào số đếm ở trên).
TheLethalCoder

@TheLethalCoder Đó là lý do tại sao nó nói 138 + sử dụng Hệ thống;
jkelm

Tôi chủ yếu có nghĩa là vì tôi quên thêm vào việc sử dụng vào số byte của tôi ở trên.
TheLethalCoder

Oh. Không thấy bình luận đầu tiên của bạn ở đó. Tôi thích việc lạm dụng vòng lặp vô hạn ở đó :)
jkelm

0

Node.js 233 212 byte

Đã lưu 21 byte nhờ @thePirateBay

Điều này hoạt động, tôi vẫn đang cố gắng tìm một tùy chọn trực tuyến vì tất cả các thay thế tôi đã tìm thấy không tặc stdin.

a=[];l=_=>console.log(a.join``);for(i=32;i<127;i++)(x=String.fromCharCode(i)),a.push(i%16?x:x+'\n');l();b=require('readline');b.createInterface(process.stdin).on('line',c=>(a=a.join``.replace(c,' ').split``),l())

Dùng thử trực tuyến


Phiên bản trực tuyến có thể được tìm thấy trên TIO . Chỉ cần một vài lưu ý: bạn có thể lưu hơn 30 byte bằng cách sắp xếp lại các định danh của bạn và loại bỏ các phần không cần thiết. Bạn hoàn toàn không cần biến bvà bạn cũng đang sử dụng mã định danh chưa được khởi tạo readline(không chắc nó có tương thích với phiên bản trên TIO không). Bạn cũng không cần biến r, thay vì &&ở cuối, bạn có thể sử dụng ,và sắp xếp lại dấu ngoặc đơn. Tương tự với &&lúc đầu. Ngoài ra, không có nhu cầu process.stdouttrong readlinegiao diện, vv ...........

@ThePirateBay không có process.stdoutnó ném (ít nhất là trên phiên bản nút của tôi). Điều đọc là một lỗi đánh máy (nhấn ctrl-z quá nhiều lần). Tôi sẽ thay đổi &&s.
Jared Smith

Mô-đun đọc không yêu cầu process.stdout. Bạn có thể đọc các đặc điểm kỹ thuật . Nó có thể gây ra lỗi nếu bạn làm hỏng thứ gì đó với phần còn lại của mã hoặc nếu bạn đang sử dụng phiên bản cũ / không nhất quán của Node.js.

@thePirateBay Phải là nút của tôi, tôi là 6.9.1 trên MacOS ... chỉ cần thử lại và createInterfacedường như trả về undefinednếu bạn bỏ qua thông số thứ hai. Tôi đã tiếp tục và loại bỏ nó mặc dù theo các tài liệu bạn liên kết. Theo TIO, làm thế nào để bạn tương tác?
Jared Smith

Ở đây chỉ sử dụng 191 byte, nhưng tôi chắc chắn có thể lưu ít nhất 10 byte nữa. Xin lỗi, tôi quá chán bây giờ để tiếp tục chơi gôn này:for(a=[],l=_=>console.log(a.join``),i=32;i<127;x=String.fromCharCode(i++),a.push(i&15?x:x+'\n'));l();require('readline').createInterface(process.stdin).on('line',c=>(a[a.indexOf(c)]=' ',l)())

0

Mã máy 65c02 + Apple // e ROM, byte 52 (47?)

Đổ lục giác:

8000- 20 58 FC A9 A0 20 20 80
8008- 20 ED FD 1A C9 FF D0 F5
8010- AD 00 C0 10 FB 8D 10 C0
8018- 20 20 80 20 57 DB 80 F0
8020- 48 38 E9 A0 48 29 0F 0A
8028- 85 24 68 4A 4A 4A 4A 20
8030- 5B FB 68 60

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 OUTSP    =     $DB57      ; APPLESOFT ROUTINE THAT OUTPUTS A SPACE
 6 KBD      =     $C000      ; KEY LAST PRESSED
 7 KBSTROBE =     $C010      ; ACCESS TO RESET "NEW KEY PRESSED" INDICATOR
 8          ORG   $8000
 9          JSR   HOME
10 * PRINT INITIAL CHARACTER MAP
11          LDA   #" "
12 LOOP     JSR   CHARPOS
13          JSR   COUT
14          INC              ; INCREMENT ACCUMULATOR
15          CMP   #"~"+1
16          BNE   LOOP
17 * WAIT FOR KEYPRESS
18 GETCH    LDA   KBD        ; GET LAST KEY PRESSED
19          BPL   GETCH      ; READ AGAIN IF KEYPRESS IS NOT NEW
20          STA   KBSTROBE   ; RESET "NEW KEYPRESS" INDICATOR
21          JSR   CHARPOS
22          JSR   OUTSP
23          BRA   GETCH
24 * SUBROUTINE TO POSITION CURSOR TO PRINT OVER CHARACTER IN ACCUMULATOR
25 CHARPOS  PHA              ; PRESERVE ACC
26          SEC              ; MAKE SURE CARRY IS SET TO SUBTRACT
27          SBC   #" "       ; SUBTRACT CHAR CODE OF SPACE
28          PHA              ; SAVE ACC
29          AND   #$0F       ; GET LOWER 4 BITS TO GET CURSOR X POSITION
30          ASL              ; SHIFT LEFT TO MAKE SPACES BETWEEN CHARS
31          STA   HTAB
32          PLA              ; GET OLD ACC
33          LSR              ; SHIFT HIGH NIBBLE
34          LSR              ; INTO LOW NIBBLE
35          LSR              ; TO GET CURSOR Y POSITION
36          LSR
37          JSR   SETVTAB
38          PLA              ; RESTORE ACC
39          RTS

Điều này không có con trỏ nào. Tôi cũng có một phiên bản 47 byte có thể hợp lệ, tùy thuộc vào ý nghĩa của việc "đặt con trỏ ra khỏi đường đi, vì vậy văn bản sẽ không cản trở bản đồ":

8000- 20 58 FC A9 A0 20 1B 80
8008- 20 ED FD 1A C9 FF D0 F5
8010- 20 0C FD 20 1B 80 20 57
8018- DB 80 F5 48 38 E9 A0 48
8020- 29 0F 0A 85 24 68 4A 4A
8028- 4A 4A 20 5B FB 68 60

Thao tác này đặt con trỏ vào ký tự sau ký tự bạn nhập (là khoảng trắng giữa các ký tự), vì vậy nó sẽ không ghi đè lên bất kỳ ký tự thực tế nào trên bản đồ. Điều này có hợp lệ hay không là tùy thuộc vào người tạo ra thử thách.


0

Python 2 , 96 byte

from textwrap import*
a=fill(str(bytearray(range(32,127))),16)
while 1:a=a.replace(input(a),' ')

Hãy thử trực tuyến! Đầu ra trông iffy trên TIO (vì đầu vào được truyền từ một tệp), nhưng nó tương tác tốt. Tôi hy vọng 'A'\n, 'B'\nvv là một định dạng đầu vào ổn.

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.