ฐานแปดฐานสิบหรือเลขฐานสิบหก?


11

รับสตริงอินพุตที่มีเฉพาะตัวอักษรและตัวเลขเท่านั้นเขียนโปรแกรมหรือฟังก์ชันที่พิมพ์อักขระ ASCII ที่เป็นไปได้ที่พิมพ์ได้ (Hex 20-7E) ที่สอดคล้องกับค่าสตริงในฐาน 8, 10 และ 16 (เท่าที่เป็นไปได้) ตัวละครจะต้องถูกเขียนในลำดับที่เพิ่มขึ้นในแง่ของฐานที่พวกเขาสอดคล้อง (ฐาน 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
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴเมื่อคุณใช้ทั้งสองmapและfilterความเข้าใจของอาร์เรย์มีประโยชน์จริง ๆ
นีล

@ Neil เหตุผลที่จะใช้'0'+b+...เมื่อใดbจะเป็นสตริง? 0+b+...
andlrc

@ dev-null Bah ฉันแก้ไขมันในcodegolf.stackexchange.com/a/73323/17602แต่ลืมที่จะทำที่นี่ด้วย
Neil

4

MATL , 23 24 28ไบต์

ปิด 1 ไบต์ด้วย @David

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


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 Utilities + ascii , 36

ไม่แน่ใจว่าasciiอนุญาตให้ใช้ยูทิลิตี้นี้หรือไม่ อินพุตถูกใช้เป็นพารามิเตอร์ commandline

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," "))

Ungolfed และคำอธิบาย

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

หากคุณกำลังหลงทางว่าทำไมถึงมีชุดตัวแปร แต่ไม่ได้ใช้ในรหัส golfed (ตัวแปร_ใน for for loop) นี่คือสาเหตุ:

คุณมี 2 วิธีในการวนซ้ำอาร์เรย์ใน 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

  • บันทึก 2 ไบต์ด้วย @anatolyg
  • บันทึก 5 ไบต์ด้วย @luserdroog
j,c;f(char*s){for(j=8;c=strtol(s,0,j);j=j*j/6)isprint(c)?printf("%c ",c):0;}

Ideone


ข้อความสั่ง "เพิ่ม" วนซ้ำของคุณยอดเยี่ยมมาก! มันอาจจะสั้นลง
Anatolyg

j*=j,j/=6มีการเขียนอย่างชัดเจนมากขึ้นว่าj=j*j/6
anatolyg

@anatolyg แน่นอน - ขอบคุณ! ฉันพยายามที่จะฉลาดด้วยการรวมโอเปอเรเตอร์ - สิ่งที่ชอบj*=j/6แต่นั่นไม่ได้ผลเนื่องจากการสูญเสียความแม่นยำระหว่างการหารจำนวนเต็ม
Digital Trauma

j<20,ผู้ประกอบการจุลภาคจะทิ้งผลกระทบทั้งหมดนี้
luser droog

@luserdroog ใช่ - ขอบคุณ!
Digital Trauma

0

JavaScript ES6, 89 88 ไบต์

บันทึก 1 ไบต์ขอบคุณ Neil!

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


อืมคุณต้องใช้ JavaScript ในจำนวนที่เริ่มต้นด้วย 0 วิเคราะห์เป็นฐานแปด
Neil

@Nilil Firefox ทำงานได้ดี
Conor O'Brien

47ดูเหมือนจะไม่ทำงานร่วมกับ
นีล

@Neil ทำงานอีกครั้งโดยย้อนกลับไปที่ eval ...
Conor O'Brien

อา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.