Peta yang dimasukkan karakter ASCII


32

Pastikan untuk melihat tantangan lain, peta karakter Reverse ASCII !

Charset ASCII (Kode Standar Amerika untuk Pertukaran Informasi) adalah standar pengkodean karakter yang paling banyak digunakan. Kode ASCII mewakili teks dalam komputer, peralatan telekomunikasi, dan perangkat lainnya.

Tantangan

Tantangan Anda adalah mencetak pemetaan karakter ASCII yang ditetapkan oleh pengguna. GIF:

gif

Setelah pengguna memasukkan setiap karakter ASCII, hasilnya akan terlihat seperti ini:

meja

Pemetaan

Setiap karakter memiliki posisi yang ditetapkan pada kisi logis 16x6, dimulai dengan karakter spasi di posisi kiri atas, dan membungkus sedemikian rupa sehingga angka 0 muncul di bawahnya.

Ketika input ASCII yang dapat dicetak diterima, cetak karakter ASCII itu di lokasi layar yang ditetapkan tanpa menghapus karakter apa pun yang ada di layar.

Aturan

  • Program Anda hanya perlu memetakan karakter ASCII yang dapat dicetak, 0x20untuk 0x7E.
  • Program Anda tidak boleh berhenti dan terus memetakan karakter ke layar sampai semua karakter ASCII yang dapat dicetak dimasukkan. Dari sini, program Anda bisa berakhir atau lari ke Neverland.
  • Program Anda dapat memetakan karakter dengan cara apa pun yang Anda suka, misalnya ke spreadsheet, tabel, jendela konsol, atau jendela grafis.
  • Tidak peduli bagaimana Anda menampilkan pemetaan, itu harus diperbarui dalam 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.

Membantu

Berikut adalah algoritma pseudocode yang saya gunakan untuk menghasilkan 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

Mungkin ada cara lain untuk mencapai output yang dibutuhkan. Anda dapat memilih untuk menggunakan algoritme saya atau algoritme Anda, tetapi hasilnya harus tetap sama.

Inilah referensi tabel ASCII yang berguna.

Mencetak gol

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


Apakah kita perlu memiliki spasi di antara karakter?
musicman523

@ musicman523 Ya, itu perlu. Outputnya harus terlihat persis seperti yang ditunjukkan pada tangkapan layar.
MD XF

Apakah kita boleh menganggap warna latar belakang terminal?
totallyhuman

Apakah membersihkan terminal, lalu menggambar ulang tabel yang diperbarui untuk setiap karakter dapat diterima?
Digital Trauma

@DigitalTrauma - Menggambar ulang setiap waktu dapat diterima - Saya bertanya di posting Sandbox
musicman523

Jawaban:


3

QBIC , 53 57 byte

Menambahkan 4 byte untuk spasi.

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

QBIC memulai pengembangan sebagai singkatan untuk QBasic, jadi saya pikir menerjemahkan jawaban QBasic saya akan menunjukkan hal ini dengan baik. Kami telah menyimpan sekitar 40% dalam byte-count untuk program fungsional identik - dan itu bahkan ketika LOCATE, ASC, dan CHRtidak memiliki Qbic-fungsi belum. Untungnya, QBIC dapat mengirimkan kode langsung ke QBasic untuk mengkompensasi hal ini. Berdampingan:

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

Disimpan 16 byte berkat @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>

Sangat luar biasa memuaskan hanya dengan menumbuk keyboard ...


9
"Sangat memuaskan hanya dengan menumbuk keyboard" mungkin atau mungkin tidak sesuai dengan yang saya inginkan. +1
MD XF

Dan ya, Anda dapat mengasumsikan hanya ASCII yang dapat dicetak yang diberikan. Saya cukup yakin itu aturan # 1.
MD XF

Tidak bisakah Anda menggunakan prompt()dalam satu lingkaran? Ini akan menyelamatkan Anda dari semua penanganan acara dan HTML. OP tampaknya mengizinkannya. Lihat komentar posting Mathematica.
Arjun

Hanya menangani ASCII yang dapat dicetak; kurangi 7 byte jika kita dapat menganggap hanya ASCII yang dapat dicetak yang diberikan. Itu tampaknya tidak masuk akal. Jika hanya menangani ASCII yang dapat dicetak, lalu bagaimana bisa dengan asumsi ASCII yang dapat dicetak menghemat byte?
Arjun

Anda harus bisa menggunakan onkeypresssendiri, memungkinkan Anda untuk melepaskan bodytag. Juga, pretag dapat disingkat menjadi adil <pre id=O. Meskipun demikian, Anda harus menyertakan penutup >agar bisa berfungsi dalam Cuplikan.
Shaggy

15

QBasic 4.5, 81 85 byte

Menambahkan 4 byte untuk mematuhi aturan spasi.

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

Dan hasilnya akan terlihat seperti ini (CATATAN: Screenshot lama, sekarang setiap karakter dipisahkan oleh spasi):masukkan deskripsi gambar di sini

QBasic memiliki LOCATEperintah, yang berguna di sini. Rincian kode ini:

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 mengalahkan semua orang! Wow!
Arjun

5
@Arjun Anda anak-anak dan Java Anda ...
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));}}

Menggunakan kode kontrol ANSI CSI n ; m f untuk mengatur posisi kursor dan Console.readPassword()membaca input pengguna secara diam-diam. Output dari beberapa karakter:

sscreenshot


1
Pertama kali saya melihat bahwa Java memiliki peluang dalam kode golf juga! Bagus!
LMD

1
+1, tidak pernah terlihat readPassword()digunakan seperti itu. Oh, dan Anda tampaknya kehilangan titik koma setelah println. Juga, bukankah mungkin untuk menggunakan System.out.printfentah bagaimana, bukan System.out.println(String.format(? Dan Anda dapat mengubah ()->ke o->dengan menggunakan parameter kosong yang tidak terpakai .
Kevin Cruijssen

@KevinCruijssen Tetap, terima kasih!
Bashful Beluga

6

BrainFuck , 355 Bytes

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

Opsi BrainFuck sangat terbatas, sehingga output ada di terminal dan layar "dihapus" dengan 20 baris baru. Input harus berupa karakter ASCII, dipisahkan oleh baris baru.

Cobalah online!

Diformat dan Didokumentasikan

Ini adalah catatan debug yang saya gunakan untuk menulis program. Saya menggunakan juru bahasa saya yang secara opsional dapat mencetak keadaan rekaman di setiap karakter '~' untuk debugging.

[
    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

Mathematica, 108 byte

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

Cobalah online di https://sandbox.open.wolframcloud.com/

Ketika Anda menempelkan kode dan menekan Shift+Enter, kotak dialog akan muncul, Anda masuk"a" misalnya untuk karaktera . Program berjalan selamanya.

Catatan: Di kotak pasir Wolfram, font diformat berbeda dari yang ada di Mathematica di komputer saya. Jadi spasi baris / kolom mungkin terlihat aneh.


Apakah ini terus memetakan setiap karakter? Yaitu apakah Anda harus menjalankannya lebih dari sekali untuk melihat output yang diinginkan?
MD XF

Anda menjalankannya sekali, dan setiap kali Anda menekan OKkotak input, kotak input lain muncul untuk Anda masukkan input.
user202729

Kedengarannya valid, terima kasih. Pekerjaan yang baik!
MD XF

Saya pikir saya = ToString @ Input []] akan lebih nyaman.
Pengguna

atau lebih baik saya = 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

Cobalah online!

Membutuhkan tanda kutip (tunggal atau ganda) di sekitar karakter yang dimasukkan (versi TIO tidak).


1
Anda dapat mengubah raw_inputke inputkarena sensus masyarakat yang Anda dapat mengasumsikan input memiliki tanda kutip jika diperlukan.
caird coinheringaahing

1
Kedengarannya bagus! Ketika saya menguji saya baru saja memasukkan kunci, dan itu tidak bahagia bahwa saya masuk {tanpa pencocokan }.
musicman523

4

str , tidak bersaing, 18 byte

Mempresentasikan bahasa semi-esoterik baru saya.

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

GIF animasi

#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

Saya tidak melihat spasi di antara karakter ...
MD XF

2
@ MDXF Spec tidak mengatakan apa-apa tentang spasi di antara karakter. Belum lagi ada banyak jawaban yang tidak menggunakan spasi.
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[]

Membutuhkan terminal yang memahami urutan pelarian ANSI.

Lebih pendek untuk membuat daftar semua tombol ditekan sejauh ini dan membersihkan layar sebelum mencetak semuanya masing-masing daripada mematikan gema di sesi terminal. Yang terakhir membutuhkan import System.IOdan hSetEcho stdin(2<1)yang biaya byte terlalu banyak.


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

Ini adalah program yang saya gunakan untuk membuat grafik. Output seperti yang ditunjukkan dalam GIF. ;)


3

QBasic, 62 58 byte

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

Diuji dengan QB64 . Seharusnya berfungsi dengan baik pada QBasic biasa, juga, meskipun Anda mungkin ingin memodifikasinya untuk melakukanCLS yang pertama kali dijalankan.

Mirip dengan jawaban steenbergh , tetapi digunakan INPUT$(1)untuk membaca karakter satu per satu. Pendekatan ini lebih pendek dan juga tidak menampilkan prompt. Ini juga digunakan RUNuntuk infinite loop, karena kita tidak harus menyimpan keadaan apa pun di antara iterasi kecuali keadaan layar.


Wow bagus. Tidak tahu input$(). Saya suka topik TIPS juga btw.
steenbergh

1

Pascal, 112 karakter

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.

Karena solusi Mathematica saya membutuhkan banyak byte div, moddan ToCharacterCode[Input[]], saya mencoba membuat jawaban lain dengan Pascal. Tapi tanpaClrScr kompiler saya (FPC) meninggalkan beberapa informasi kompilasi di layar. ClrScr;membutuhkan 7 byte.

The *2digunakan untuk jarak yang tepat memakan waktu 2 bytes.


1

LOGO, 90 byte

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

Cobalah di FMSLogo.

Bagaimanapun, solusi Logo saya adalah yang terpendek, dibandingkan dengan jawaban Mathematica dan Pascal saya.

Tambahkan 3 byte jika kura-kura harus disembunyikan.


1

6502 kode mesin + Apple // e ROM, 31 byte

Hex dump:

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

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

Demo GIF

Jika kursor membatalkannya, inilah versi 36 byte tanpa kursor:

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 untuk -rio/consolebendera.

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

Tidak disatukan

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

Dalam rangkaian karakter SmileBASIC, ¥terletak di tempat yang \biasanya; semoga ini tidak membatalkan jawaban ini sepenuhnya.


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

Ini adalah versi golf dari Apple] [tes keyboard, program yang menginspirasi tantangan.


Ini sebenarnya 134 byte, karena Applesoft BASIC adalah tokenized.
insert_name_here

@insert_name_here Ah, ya. Terima kasih.
MD XF
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.