逆ASCII文字マップ


8

[ 入力されたASCII文字をマップする]で、..入力されたASCII文字をマップするように求めました。今回は、すべてのASCII文字をすぐにマッピングしてから、その上にスペースをマッピングすることで、反対のことを行います。

このプログラムには、チャレンジ残したキャラクターを確認するなど、実用的な用途があります。

チャレンジ

あなたの仕事は、入力されたASCII文字をアンマップするプログラムを書くことです。プログラムが実行されるとすぐに、正確なマップ(色、フォント、サイズなどを除く)が表示されます。

ステップ1

ユーザーが印刷可能なASCII文字を入力するたびに、その上にスペースを印刷します。

gif

ルール

  • 最初の出力は、上記の最初の画像に示すとおりである必要があります。それぞれの位置にASCII文字があり、スペース(32)が左上にあり、チルダ(126)が右下から1文字左にある6x16グリッドです。
  • あなたのプログラムは、印刷可能なASCII文字を表示する必要がある0x200x7E
  • プログラムは終了し、すべての印刷可能なASCII文字が上書きされるまで、文字の上にスペースを印刷し続けてはなりません。ここから、プログラムは終了するか、Neverlandに実行されます。
  • リバースマップはリアルタイムで更新する必要があります(ユーザー入力を受け取ったらすぐに)。
  • プログラムが入力をサイレントで読み取らない場合は、カーソルを邪魔にならないように配置する必要があるため、テキストがマップの邪魔になりません。

参考のために役立つASCIIテーブルを以下に示します。

得点

各言語でバイト数が最も少ない答えが優先されます。楽しんで!


潜在的なDV-erまたは投票者の重複に注意してください- 独自の回答を書くよりも、codegolf.stackexchange.com / q / 124306/61563への回答をここに移植することは困難です。そこにある答えは入力を読み取り、その入力を使用して画面に出力します。ここでの回答は、入力なしで(異なるループメカニズムを使用して)画面に出力し、入力された各文字の位置をテストしてから、別の文字を出力する必要があります。
MD XF 2017

ユーザーが1文字入力した後にEnterキーを押すと想定できますか?
Xcoder氏2017

@ Mr.Xcoderはい、リアルタイムで入力を受け取ることができない言語では問題ありません。
MD XF 2017

@ Mr.Xcoderルール1を参照Your program only needs to display the printable ASCII characters, 0x20 to 0x7E
MD XF

3
@MDXFそれはまだ元の課題に驚くほど似ています。ASCII文字を正しい位置に印刷する必要があるだけなので、ユーザーの入力を正しい場所に配置する代わりに、スペースを使用します。
Conor O'Brien

回答:


2

SOGL V0.12、23のバイト

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

ここでお試しください!

入力ボックスに入力を受け取ります。文字が削除されることはそれほど大きな問題ではないと思います:p

説明:

]                   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

x86-16マシンコード、62バイト

16進ダンプ:

BC0100B101B07EBAFE0581EAE00080EA02B402CD1085E4750830E439C5750A30C0B40ACD1084C074094884D275E085D275D831C031E4CD1630E489C5EBC7

アセンブリ:

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

ここに画像の説明を入力してください


2

C ++(Visual C ++)、253(@Step Hen)261バイト

#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]=' ';}}

PPCGへようこそ!私は信じてあなたが後にスペースを削除することができます#includeとしてだけでなく、S i + 0x20- > i+0x20。私は間違っているかもしれません。
スティーブン


1

Python 2、132バイト

@alleksのおかげで4バイトが節約されました!

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

オンラインでお試しください!


これはチルドの後ろに0x7fを表示し、ちょうどfyiです
Conor O'Brien

@ ConorO'Brien Oops、修正済み
musicman523

1
あなただけ追加できませんでした何らかの理由で[:-2]print s代わりに?
alleks 2017

@alleksそれが理にかなっている理由
musicman523

1

JavaScript(ES6)+ HTML、139 136 116 + 10 16 = 132バイト

@Shaggyのおかげで-3バイト。
@Arnauldに触発された-14バイト。

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>

preこの場合、innerText値を完全に空にする必要があるため、終了タグが必要です。


で2バイトを節約しますO[h="innerHTML"]=a=[...Array(95)].map()
シャギー2017

そして、a完全に取り除くことで別のバイトを節約できると思います。
シャギー2017

1
@Shaggyありがとう、他のいくつかと一緒にに変わっていたaので、追加の変数を使用していました。切り替え固定という。innerHTML&&amp;innerText
ジャスティンマリナー

あなたが移動することができますi2つのバイトを保存するために、グローバルスコープに:map(_=>String.fromCharCode(i++)+(i%16?...),i=32)
アルノー

@Arnauldそのアイデアを使用して、配列全体のマッピングを削除し、代わりにforループを使用できます。ありがとう!
ジャスティンマリナー2017

1

QBasic、107バイト

キーストロークとして受け取り、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

@DLoscのおかげで-8バイト


@DLosc-私はSubそこにいることさえ考えていませんでした-素晴らしい解決策。残念ながら、我々はカウントしなければならないのEnd Subコミュニティがあることを決定したとして、自動補完が有効ではありません(少なくとも、VBAで、私はそれがここにも適用されることを確信している)
テイラー・スコット

面白いですね。オートフォーマットとオートコンプリートに違いがあることに気づきませんでした。知ってよかった。
DLosc

0

C#(.NET Core)、(138 +システムを使用して;)151バイト

()=>{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()," ");}}

オンラインでお試しください!



ああ、でも、using System;まだ持っていない場合はバイト数に含める必要があります(上記の数に追加するのを忘れていました)。
TheLethalCoder 2017

@TheLethalCoderそのため、138 + using Systemと表示されます。
jkelm 2017

上記のバイトカウントにusingを追加するのを忘れたため、主にそれを意味しました。
TheLethalCoder 2017

ああ。そこにあなたの最初のコメントを見ませんでした。私はそこで無限ループの乱用が好きです:)
jkelm

0

Node.js 233 212バイト

@thePirateBayのおかげで21バイト節約

これは機能します。私が見つけたすべてのreplがhijack 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())

オンラインでお試しください


オンライン版はTIOにあります。ほんの少しの注意:識別子を再配置し、不要な部分を削除することで、30バイト以上節約できます。変数はまったく必要なくb、初期化されていない識別子も使用していますreadline(TIOのバージョンと互換性があるかどうかは不明です)。またr、変数をまったく必要とせず&&、最後ではなく、,括弧を使用して再配置できます。&&最初と同じです。またため、不要process.stdoutreadlineインターフェースなど...........

@ThePirateBayがなけれprocess.stdoutば(少なくとも私のバージョンのノードでは)スローされます。readlineはタイプミスでした(ctrl-zを何度も押した)。&&sを変更します。
Jared Smith

Readlineモジュールは必要ありませんprocess.stdout仕様書をご覧いただけます。コードの残りの部分に混乱をきたしたり、Node.jsの古いバージョンや一貫性のないバージョンを使用したりすると、エラーがスローされる可能性があります。

@thePirateBay私のノードでなければなりません、私はMacOSで6.9.1です...もう一度試してみて、2番目のパラメーターを省略した場合はcreateInterface明らかに戻りますundefined。あなたがリンクしたドキュメントごとに私は先に進んでそれを削除しました。TIOに関する限り、それをどのようにインタラクティブにしますか?
Jared Smith

ここでは191バイトしか使用していませんが、少なくともさらに10バイトを節約できると思います。申し訳ありません、今ゴルフを続けるには退屈すぎます: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

65c02マシンコード+ Apple // e ROM、52(47?)バイト

16進ダンプ:

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

コメントされたアセンブリ:

 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

これにはカーソルがありません。また、「カーソルを邪魔にならないようにして、テキストがマップの邪魔にならないようにする」という意味に応じて、有効な47バイトバージョンも用意しています。

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

これにより、入力した文字の後ろの文字(文字間のスペース)にカーソルが置かれるため、マップ内の実際の文字が上書きされることはありません。これが有効かどうかは、チャレンジの作成者次第です。


0

Python 2、96バイト

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

オンラインでお試しください!(入力がファイルから渡されるため)出力はTIOで不明瞭に見えますが、対話的には問題ありません。私は願っています'A'\n'B'\nなど大丈夫入力フォーマットです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.