8進数、10進数、または16進数?


11

文字と数字のみを含む入力文字列が与えられた場合、基数8、10、および16(可能な場合)の文字列値に対応する印刷可能なASCII文字(Hex 20-7E)を印刷するプログラムまたは関数を記述します。文字は、対応するベースの観点から昇順で記述する必要があります(ベース8が最初など)。出力は[& . F]、サンプルのように配列形式(など)にすることも、スペースまたは改行(末尾の改行はオプションです)で区切ることもできます。

形成可能な印刷可能なASCII文字が存在しない場合、プログラムに出力があってはなりません。

サンプル

31
==> 1

47
==> ' / G

69
==> E i

7A
==> z

100
==> @ d

156
==> n

189
==> <empty>

potaTO
==> <empty>

5G
==> <empty>

19
==> <empty>

これはであるため、バイト数が最も少ない答えが優先されます。標準ルールが適用されます。

回答:


6

JavaScript(SpiderMonkey 30 +)、74バイト

s=>[for(b of'o0x')if((c=+(0+b+s))>31&c<127)String.fromCharCode(c)].join` `

あなたとあなたのES7はmah ES6を殺していますo_o
コナーオブライエン

2
@CᴏɴᴏʀO'Bʀɪᴇɴ mapとの両方を使用している場合filter、配列内包表記は非常に便利です。
ニール

@Neilいつ文字列になるのかを使用'0'+b+...する理由はb何ですか?0+b+...
andlrc

@ dev-null Bah、私はcodegolf.stackexchange.com/a/73323/17602で修正しましたが、ここでもそれを忘れていました。
ニール

4

MATL、23 24 28バイト

@Davidのおかげで1バイトオフ

8H6hhYs"G@ZA32:126m?6Mc

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

8H6hhYs         % array [8,10,16]
"               % for each base
  G             %   push input. Do nothing the first time
  @             %   push base (8, 10 or 16)
  ZA            %   convert from base to decimal. Takes implicit input the first time
  32:126m       %   is result in acceptable range?
  ?             %   if so
    6M          %     push result of base conversion again
    c           %     convert to char
                %   implicitly end if
                % implicitly end for each
                % implicitly display stack contents

Dが必要かどうかわかりません が、そうですか?ベクトルの作成に関する素晴らしい作業、私はあなたとほぼ同じことをしましたが、からベクトルを短縮できませんでした[8,10,16]
デビッド

@Davidありがとう!Dこの場合、スタックを空にする必要があると思いました。しかし、あなたは正しいです、そうではありません!ありがとう!
ルイスメンドー

1
@David ' ':'~'次のリリースの定義済みリテラルとして含める必要があります!
ルイスメンドー

1
32:126m良いアイデアです!!
デビッド


3

Pyth、23 21 20 18バイト

@rd\m.xCizd0[8T16

配列として出力します。\x80バックスラッシュとCの間にはリテラルがありますが、これをに置き換えました

@rd\•m.xCizd0[8T16    Implicit: z=input
     m     d [8T16    Map the following lambda d over [8, 10, 16]:
      .x                try:
         izd              convert z from that base
        C                                          and convert to char
            0           except: return the number 0
@                     Filter that on presence in
 rd\•                   strings from space to \x80 (the printable ASCII characters).

ここで試してみてください



1

Bash + GNUユーティリティ+ ascii、36

asciiユーティリティの使用が許可されているかどうかはわかりません。入力はコマンドラインパラメータとして取得されます。

ascii $1|tac|grep -Po '(?<=s as `).'

asciiを使用してUbuntuにインストールできますsudo apt-get install ascii


1

Javascript ES6、89文字

s=>'0o,,0x'.split`,`.map(x=>(x+=s)>31&x<128&&String.fromCharCode(x)).filter(x=>x).join` `

テスト:

f=s=>'0o,,0x'.split`,`.map(x=>(x+=s)>31&x<128&&String.fromCharCode(x)).filter(x=>x).join` `
"31,47,69,7A,100,156,189,potaTo,5G,19".split`,`.map(f) == "1,' / G,E i,z,@ d,n,,,,"

1

Lua、147バイト

これ以上ゴルフをすることはできないと思うし、それをするための多くの方法を試してきたが、ここで最短になる。非推奨の関数を含む古いコンパイラを使用しても、table.foreach(table,function)一部のバイトは削られません。

このプログラムは引数として文字列を取り、スペースで区切られたテーブル値の連結を出力します。

t={}for _,i in pairs({8,10,16})do x=tonumber(arg[1],i)x=x and x or 0 t[#t+1]=127>x and 19<x and string.char(x)or nil end print(table.concat(t," "))

非ゴルフと説明

t={}                        -- Initalise the array containing the chars to print
for _,i in pairs({8,10,16}) -- Iterate over the array {8,10,16}
do
  x=tonumber(arg[1],i)      -- convert the input in base i to a number in base 10
  x=x and x or 0            -- if the input wasn't a number, x is nil
                            -- use a ternary operator to set x in this case
  t[#t+1]=127>x and 19<x    -- if x is the bytecode of a printable character
    and string.char(x)or nil-- insert this character into t
end
print(table.concat(t," "))  -- concatenate the values in t with " " as separator
                            -- and print it

変数セットがあるのにゴルフ用コードでは使用されない理由(_forループ内の変数)をさまよう場合、その理由は次のとおりです。

forスタイルのいずれかで、Luaの配列を反復処理する2つの方法があります。

for i=1,#table do --[[code here, use table[i] ]] end

またはforeachスタイル:

for key,value do pairs(table) do --[[code here]] end

テーブルに含まれる値{8,10,16}は、繰り返し処理する必要があるさまざまなベースであるため、必要でした。ただし、複数の戻り値を持つ関数では、実際に返すものを選択することはできません。それらは順序に従います。変数をvalue設定するには、の値keyもキャッチする必要があり_ます。これをダミーと呼びます。


1

C(関数)、76

  • @anatolygのおかげで2バイト節約されました。
  • @luserdroogのおかげで5バイトが節約されました。
j,c;f(char*s){for(j=8;c=strtol(s,0,j);j=j*j/6)isprint(c)?printf("%c ",c):0;}

イデオネ。


ループの「インクリメント」ステートメントは素晴らしいです!ただし、短縮することもできます。
アナトリグ

j*=j,j/=6としてより明確に書かれていますj=j*j/6
アナトリグ

@anatolygもちろん-ありがとう!以下のようなものを-私は、演算子を組み合わせると巧妙なことをしようとしていたj*=j/6が、原因整数の除算時の精度の損失に仕事をしなかったこと
デジタルトラウマ

j<20,コンマ演算子は、この効果全体を破棄します。
luserはドローグ

@luserdroogはい-ありがとう!
デジタル外傷

0

JavaScriptのES6、89の 88バイト

ニールのおかげで1バイト節約できました!

n=>[..."0x+"].map(t=>String.fromCharCode(eval(`0${t+n}`))).filter(k=>~k.search(/[ -~]/))

配列を返します。それがうまくいかない場合、これは余分な8バイトで動作し、可能な一致を表示します。

n=>[..."0x+"].map(t=>String.fromCharCode(eval(`0${t+n}`))).filter(k=>~k.search(/[ -~]/)).join` `


うーん、0から始まる数字は8進数として解析するのにJavaScriptは何歳必要ですか?
ニール

@Neil Firefoxは問題なく動作するようです。
コナーオブライエン

では動作しないようです47
ニール

evalのに戻すを元に戻すことによって、再び@Neil作品...
コナー・オブライエン

ああ、Number()必要です0oeval、ちょうど満足してい0ます。混乱させて申し訳ありません。
ニール

0

R、84バイト

function(x){s=sapply;y=s(c(8,10,16),strtoi,x=x);cat(s(y[y%in%c(32:126)],intToUtf8))}

strtoi各ベースに変換し、適切な範囲内にある場合は文字に変換するために使用します。cat文字のデフォルトの印刷を許可している場合は削除して、さらに4バイトを節約できます(ラップ""

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