Membalikkan peta karakter ASCII

8

Dalam Peta yang dimasukkan karakter ASCII , saya meminta Anda untuk .. memetakan karakter ASCII yang dimasukkan. Kali ini, Anda akan melakukan yang sebaliknya, dengan segera memetakan semua karakter ASCII, dan kemudian memetakan spasi di atasnya.

Program ini akan memiliki kegunaan praktis, seperti melihat karakter apa yang tersisa dalam pengajuan tantangan .

Tantangan

Tugas Anda adalah menulis program yang membatalkan pemetaan karakter ASCII yang dimasukkan. Segera setelah program dijalankan, ia akan menampilkan peta yang tepat ini (kecuali warna, font, ukuran, dll.):

Langkah 1

Setiap kali pengguna memasukkan karakter ASCII yang dapat dicetak, Anda akan mencetak spasi di atasnya.

gif

Aturan

  • Output awal harus persis seperti yang ditunjukkan pada gambar pertama di atas: kisi 6x16 dengan karakter ASCII di posisi masing-masing, dengan spasi (32) di kiri atas dan tilde (126) di satu karakter kiri dari kanan bawah.
  • Program Anda hanya perlu menampilkan karakter ASCII yang dapat dicetak, 0x20untuk 0x7E.
  • Program Anda tidak boleh berhenti dan terus mencetak spasi di atas karakter sampai semua karakter ASCII yang dapat dicetak telah ditimpa. Dari sini, program Anda dapat berakhir atau lari ke Neverland.
  • Peta terbalik Anda harus diperbarui secara waktu nyata (segera setelah menerima input pengguna).
  • Jika program Anda tidak membaca input secara diam-diam, ia harus mengeluarkan kursor, sehingga teks tidak akan menghalangi peta.

Ini tabel ASCII yang berguna untuk referensi.

Mencetak gol

Jawaban dengan byte terkecil di setiap bahasa menang. Selamat bersenang-senang!

MD XF
sumber
Catatan untuk calon DV-ers atau pemilih ganda - akan lebih sulit untuk mengirim jawaban pada codegolf.stackexchange.com/q/124306/61563 ke sini daripada menulis jawaban Anda sendiri. Jawaban di sana membaca input dan kemudian menggunakan input untuk mencetak ke layar. Jawaban di sini harus mencetak ke layar tanpa input (menggunakan mekanisme putaran yang berbeda) dan kemudian menguji setiap karakter yang dimasukkan untuk lokasinya, lalu mencetak karakter yang berbeda.
MD XF
Bisakah kita berasumsi bahwa pengguna menekan masuk setelah dia memasukkan 1 karakter?
Tn. Xcoder
@ Mr.Xcoder Ya, itu bagus untuk bahasa yang tidak dapat menerima input secara realtime.
MD XF
@ Mr.Xcoder Lihat aturan 1 -Your program only needs to display the printable ASCII characters, 0x20 to 0x7E
MD XF
3
@ MDXF Ini masih sangat mirip dengan tantangan aslinya. Saya hanya perlu mencetak karakter ascii ke posisi yang benar, kemudian, alih-alih menempatkan input pengguna di tempat yang benar, saya hanya menggunakan spasi sebagai gantinya.
Conor O'Brien

Jawaban:

2

SOGL V0.12 , 23 byte

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

Coba Di Sini!

Mengambil input dalam kotak input. Saya harap ini bukan masalah besar yang bisa dihapus oleh karakter: hlm

Penjelasan:

]                   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)
dzaima
sumber
6

x86-16 Kode Mesin, 62 byte

Hex dump:

BC0100B101B07EBAFE0581EAE00080EA02B402CD1085E4750830E439C5750A30C0B40ACD1084C074094884D275E085D275D831C031E4CD1630E489C5EBC7

Majelis:

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

masukkan deskripsi gambar di sini


sumber
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]=' ';}}
Rob Gates
sumber
Selamat datang di PPCG! Saya percaya Anda dapat menghapus spasi setelah #includes, serta i + 0x20-> i+0x20. Saya bisa saja salah.
Stephen
1

Python 3 , 116 byte

o='\n'.join(''.join(map(chr,range(i,16+i)))for i in range(32,124,16))[:-1]
while 1:print(o);o=o.replace(input()," ")

Cobalah online!

C McAvoy
sumber
1

Python 2 , 132 byte

Disimpan 4 byte berkat @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:]

Cobalah online!

musicman523
sumber
Ini mencetak 0x7f setelah tilde, hanya fyi
Conor O'Brien
@ ConorO'Brien Ups, diperbaiki
musicman523
1
Apa alasan Anda tidak bisa menambahkan [:-2]setelahnya print ssaja?
alleks
@alleks itu terlalu masuk akal karena itu
musicman523
1

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

-3 byte terima kasih kepada @Shaggy.
-14 byte terinspirasi oleh @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>

preTag penutup diperlukan dalam kasus ini, karena kita membutuhkan innerTextnilai untuk memulai benar-benar kosong.

Justin Mariner
sumber
Simpan 2 byte dengan O[h="innerHTML"]=a=[...Array(95)].map().
Shaggy
Dan saya pikir Anda dapat menyimpan byte lain dengan menyingkirkan asepenuhnya.
Shaggy
1
@Shaggy Terima kasih, saya menggunakan avariabel tambahan karena innerHTMLberubah &menjadi &amp;, bersama dengan beberapa yang lain. Beralih ke innerTextperbaikan itu.
Justin Mariner
Anda dapat pindah ike ruang lingkup global untuk menghemat 2 byte:map(_=>String.fromCharCode(i++)+(i%16?...),i=32)
Arnauld
@Arnauld Menggunakan ide itu, saya bisa menghapus seluruh pemetaan array dan menggunakan untuk loop sebagai gantinya. Terima kasih!
Justin Mariner
1

QBasic , 107 byte

Fungsi anonim yang mengambil penekanan tombol, dan menghapus tabel 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 berkat @DLosc

Taylor Scott
sumber
@Dosc - Saya bahkan tidak mempertimbangkan menggunakan Subsana - Solusi hebat. Sayangnya, kami harus menghitung End Subkarena komunitas telah memutuskan bahwa pelengkapan otomatis tidak valid (setidaknya dengan VBA, tapi saya yakin itu berlaku di sini juga)
Taylor Scott
Huh, itu menarik - saya tidak menyadari ada perbedaan antara autoformatting dan pelengkapan otomatis. Senang mendengarnya.
DLosc
0

C # (.NET Core) , (138 + menggunakan Sistem;) 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()," ");}}

Cobalah online!

jkelm
sumber
130 bytes
TheLethalCoder
Oh, tetapi Anda harus memasukkan using System;ke dalam jumlah byte Anda jika Anda belum (saya lupa menambahkannya ke dalam hitungan di atas).
TheLethalCoder
@TheLethalCoder Itu sebabnya katanya 138 + menggunakan Sistem;
jkelm
Saya terutama bersungguh-sungguh karena saya lupa menambahkan penggunaan ke dalam byte saya di atas.
TheLethalCoder
Oh Tidak melihat komentar pertama Anda di sana. Saya suka penyalahgunaan infinite untuk loop di sana :)
jkelm
0

Node.js 233 212 byte

Disimpan 21 byte berkat @thePirateBay

Ini berfungsi, saya masih mencoba menemukan opsi online karena semua replet yang saya temukan membajak 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())

Cobalah online

Jared Smith
sumber
Versi online dapat ditemukan di TIO . Hanya beberapa catatan: Anda dapat menyimpan lebih dari 30 byte dengan mengatur ulang pengidentifikasi Anda dan menghapus bagian yang tidak perlu. Anda tidak perlu variabel bsama sekali, dan Anda juga menggunakan pengidentifikasi yang readlinetidak diinisialisasi (tidak yakin apakah itu kompatibel dengan versi di TIO). Anda juga tidak perlu variabel rsama sekali, alih-alih &&pada akhirnya, Anda bisa menggunakan ,dan mengatur ulang tanda kurung. Sama dengan &&di awal. Juga, tidak perlu process.stdoutdi readlineantarmuka, dll ...........
@ThePirateBay tanpa process.stdoutitu melempar (setidaknya pada versi node saya). Masalah readline adalah salah ketik (tekan ctrl-z terlalu banyak kali). Saya akan mengubah &&s.
Jared Smith
Modul Readline tidak perlu process.stdout. Anda dapat membaca spesifikasinya . Mungkin terjadi kesalahan jika Anda mengacaukan sesuatu dengan sisa kode Anda atau jika Anda menggunakan Node.js. versi lama / tidak konsisten
@ thePirateBay Pasti simpul saya, saya 6.9.1 di MacOS ... coba saja lagi dan createInterfaceternyata kembali undefinedjika Anda menghilangkan param kedua. Saya melanjutkan dan menghapusnya menurut dokumen yang Anda tautkan. Sejauh TIO berjalan, bagaimana Anda membuatnya interaktif?
Jared Smith
Di sini hanya menggunakan 191 byte, tetapi saya yakin setidaknya 10 byte lagi dapat disimpan. Maaf, saya terlalu bosan sekarang untuk melanjutkan bermain golf ini: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

Kode mesin 65c02 + Apple // e ROM, 52 (47?) Byte

Hex dump:

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

Majelis yang dikomentari:

 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

Ini tidak memiliki kursor sama sekali. Saya juga memiliki versi 47 byte yang mungkin valid, tergantung pada apa yang dimaksud dengan "singkirkan kursor, sehingga teks tidak akan menghalangi peta":

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

Ini menempatkan kursor pada karakter setelah karakter yang Anda ketikkan (yang merupakan spasi di antara karakter), sehingga tidak akan menimpa karakter aktual apa pun di peta. Apakah ini valid atau tidak, tergantung pada pencipta tantangan.

masukkan_name_di sini
sumber
0

Python 2 , 96 byte

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

Cobalah online! Output terlihat rapuh pada TIO (karena input dilewatkan dari file), tetapi itu baik-baik saja secara interaktif. Saya harap 'A'\n, 'B'\ndll adalah format input yang oke.

Lynn
sumber