8 진수, 10 진수 또는 16 진수?


11

문자와 숫자 만 포함하는 입력 문자열이 제공되면 8, 10 및 16 (가능한 경우)의 문자열 값에 해당하는 인쇄 가능한 ASCII 문자 (16 진수 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

자바 스크립트 (SpiderMonkey 30+), 74 바이트

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

당신과 당신의 ES7은 O_O 마작 ES6을 죽이고있다
코너 오브라이언

2
당신이 모두를 사용하는 경우 CᴏɴᴏʀO'Bʀɪᴇɴ @ map하고 filter, 배열 함축 정말 유용합니다.
Neil

@Neil '0'+b+...언제 사용할 b문자열이 항상 문자열입니까? 0+b+...
andlrc

@ dev-null Bah, codegolf.stackexchange.com/a/73323/17602 에서 수정 했지만 여기에서도 잊어 버렸습니다.
Neil

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

@David 감사합니다! D이 경우 스택을 비우는 데 필요 하다고 생각했습니다 . 하지만 당신 말이 맞아요! 감사!
Luis Mendo

1
@David ' ':'~'다음 릴리스를 위해 사전 정의 된 리터럴 로 포함시켜야합니다 !
Luis Mendo

1
32:126m좋은 생각입니다!
David

4

파이썬 3, 84 82 바이트

def a(s):
 for n in 8,10,16:
  try:b=int(s,n);31<b<127and print(chr(b))
  except:0

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

배쉬 + GNU 유틸리티 + ascii , 36

ascii유틸리티 사용이 허용 되는지 확실하지 않습니다. 입력은 명령 행 매개 변수로 사용됩니다.

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

ascii와 함께 우분투에 설치할 수 있습니다 sudo apt-get install ascii.


1

자바 스크립트 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

루아, 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의 배열을 반복하는 두 가지 방법이 있습니다.

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

이데온


루프 "증가"문은 대단합니다! 그래도 단축 될 수 있습니다.
anatolyg

j*=j,j/=6j=j*j/6
명확

물론 @anatolyg-감사합니다! 나는 j*=j/6정수 나누기 동안 정밀도 손실로 인해 작동하지 않는 연산자를 결합하여 영리하려고 노력했습니다.
Digital Trauma

j<20,쉼표 연산자는 이것의 전체 효과를 버립니다.
luser droog

@luserdroog 예-감사합니다!
Digital Trauma

0

자바 스크립트 ES6, 89 88 바이트

Neil 덕분에 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

@Neil Firefox는 잘 작동하는 것 같습니다.
코너 오브라이언

에서 작동하지 않는 것 같습니다 47.
Neil

@Neil 다시 평가로 되돌려 다시 작동합니다 ...
코너 오브라이언

아, Number()필요 0o하지만 eval그냥 만족 0합니다. 혼란을 드려 죄송합니다.
Neil

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하여 각 염기로 변환 한 다음 적절한 범위에있는 경우 문자로 변환합니다. 제거하여 4 바이트 이상을 절약 할 수 cat우리는 문자의 기본 인쇄를 허용하는 경우 (래핑 "")

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.