พิมพ์ตารางตัวเลขทศนิยมและ 2 ** i เบส


9

คอมพิวเตอร์อยู่ด้วยเลขฐานสอง โปรแกรมเมอร์ทุกคนรู้ไบนารี

แต่2**xฐานมักถูกมองข้ามว่าไม่สามารถปฏิบัติได้ในขณะที่มีความสัมพันธ์ที่สวยงามกับระบบเลขฐานสอง

เพื่อแสดงตัวอย่างหนึ่งของความสัมพันธ์ที่สวยงามเช่นนี้ 19 จะเป็นคำรับรองของฉัน

19 10011 103 23 13 j
  • 19 คือทศนิยมรวมอยู่ในความชัดเจน

  • 10011 คือ 19 เป็นเลขฐานสอง

  • 103 ในฐาน 4 สร้างจากฐานสองด้วยวิธีนี้:

    • log2 (4) == 2 ให้เราจำไว้สองข้อ
    • Pad 10011 เพื่อให้มันมีความยาวหลายเท่า -> 010011
    • ใช้ตัวเลข 2 คูณ 2 จากซ้ายไปขวาและถือเป็นเลขฐานสอง 2 หลัก:

      • 01 -> 1
      • 00 -> 0
      • 11 -> 3

    เสร็จสิ้น 10011 ในฐาน 4 คือ 103

สำหรับฐาน 8 ให้ทำเช่นเดียวกัน แต่ 3-by-3 กับ log2 (8) = 3

  • แผ่น 010011
  • 010 -> 2
  • 011 -> 3

    23 เสร็จสิ้น

สำหรับฐาน 16 ให้ทำเช่นเดียวกัน แต่ 4-by-4 เหมือนกับ log2 (16) = 4

  • แผ่น 00010011
  • 0001 -> 1
  • 0011 -> 3

    13, เสร็จแล้ว

งาน

เมื่อกำหนดจำนวนสูงสุดเป็นอินพุตคุณจะต้องส่งออกตาราง

base-ten-i base-two-i base-four-i base-eight-i base-sixteen-i base-thirtytwo-i

สำหรับฉันที่ไปจาก 0 ถึง n รวม หมายเลขไบนารีเป็นสิ่งที่ดีเลิศของจำนวนขั้นต่ำที่จำเป็นในการทำงานดังนั้นรหัสของคุณควรสั้นที่สุด

ข้อ จำกัด และโบนัส

  • Base-ten -> ไบนารีและไบนารี -> บิวด์อินฐานสิบถูกพิจารณาว่าเป็นช่องโหว่ตาม Base-a -> Base-b

  • หากคุณสร้างฐาน2**i(สำหรับ i> 2) ทั้งหมดโดยใช้ความสัมพันธ์มากกว่าที่กล่าวถึงคุณจะได้รับ*0.6โบนัส แต่อนุญาตให้ทำการแปลงฐานทั่วไป (เขียนด้วยตัวเอง) ได้

ตารางตัวอย่าง

> 32
0 0 0 0 0 0
1 1 1 1 1 1
2 10 2 2 2 2
3 11 3 3 3 3
4 100 10 4 4 4
5 101 11 5 5 5
6 110 12 6 6 6
7 111 13 7 7 7
8 1000 20 10 8 8
9 1001 21 11 9 9
10 1010 22 12 a a
11 1011 23 13 b b
12 1100 30 14 c c
13 1101 31 15 d d
14 1110 32 16 e e
15 1111 33 17 f f
16 10000 100 20 10 g
17 10001 101 21 11 h
18 10010 102 22 12 i
19 10011 103 23 13 j
20 10100 110 24 14 k
21 10101 111 25 15 l
22 10110 112 26 16 m
23 10111 113 27 17 n
24 11000 120 30 18 o
25 11001 121 31 19 p
26 11010 122 32 1a q
27 11011 123 33 1b r
28 11100 130 34 1c s
29 11101 131 35 1d t
30 11110 132 36 1e u
31 11111 133 37 1f v
32 100000 200 40 20 10

4
ลงเนื่องจาก "คุณต้องสร้างฐาน 2 ** i (สำหรับ i> 2) ทั้งหมดโดยใช้ความสัมพันธ์มากกว่าที่กล่าวถึง" การกำหนดอัลกอริทึมที่เฉพาะเจาะจงจะกำจัดสิ่งที่ทำให้โค้ดกอล์ฟน่าสนใจมาก คุณสามารถแบนฟังก์ชั่นการแปลงฐานในตัวในขณะที่ยังอนุญาตให้เลือกอัลกอริทึม
xnor

@xnor ตอนนี้ใช้วิธีการของฉันเพียงให้โบนัสเพื่อให้อิสระแก่นักกอล์ฟมากขึ้น
Caridorc

1
ฉันไม่ได้เป็นแฟนของโบนัสเช่นกัน มันมีประสิทธิภาพหมายความว่าคุณต้องใช้ทั้งในตัวหรืออัลกอริทึมของคุณและอัลกอริทึมอื่น ๆ ไม่สามารถทำงานได้
xnor

ไม่อนุญาตให้สร้างบิวด์อิน @xnor ตัวแปลงทั่วไปจะสั้นกว่าดังนั้นฉันจะให้โบนัสถ้าคุณใช้กฎการแปลงที่วางแผนไว้
Caridorc

คำตอบ:


2

CJam, 54 * 0.6 = 32.4 ไบต์

q~){_5,f{)L@{2md@+\}h(%/Wf%W%{{\2*+}*_9>{'W+}&}%S\}N}/

ทดสอบที่นี่

สำหรับการอ้างอิงต่อไปนี้เป็นวิธีแก้ปัญหาที่สั้นกว่าซึ่งไม่ผ่านเกณฑ์โบนัส (ที่ 39 ไบต์):

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/

ฉันอัปเดต challange แล้วคุณอาจขอรับโบนัส 0.6 * ถ้าคุณใช้วิธีการของฉัน
Caridorc


0

PHP, 232 230 233 217 * 0.6 = 130.2

ไม่มีโอกาสเต้นภาษากอล์ฟ แต่ฉันชอบความท้าทาย

for(;$d<=$n;$d++){echo'
',$d|0;for($k=$d,$b='';$k;$k>>=1)$b=($k&1).$b;for($w=1;$w<6;$w++,print" $z"|' 0')for($z='',$k=strlen($b);-$w<$k-=$w;$z=($e>9?chr($e+87):$e).$z)for($e=0,$y=1,$j=$w;$j--;$y*=2) $e+=$y*$b[$j+$k];}
  • การใช้งาน: เพิ่ม$n=32;หรือแทนที่$nด้วย32(หรือจำนวนเต็มอื่นที่ไม่ใช่ลบ); โทรผ่าน cli
  • หากไม่ได้รับการยอมรับให้แทนที่$nด้วย$_GET[n](+ 6 / + 3.6) และโทรในเบราว์เซอร์
    หรือบน cli ด้วยphp-cgi -f bases.php -n=32
  • แทนที่ตัวแบ่งบรรทัดด้วย<br>หรือเติม<pre>เพื่อทดสอบในเบราว์เซอร์
  • อาจส่งประกาศเกี่ยวกับตัวแปรที่ไม่ได้กำหนดและการชดเชยสตริงที่ไม่ได้กำหนดในเวอร์ชัน PHP รุ่นใหม่
    ลบ E_NOTICE ออกจาก error_reporting (prepend error_reporting(0);) เพื่อระงับ
  • ทดสอบใน 5.6

ทำให้พังถล่ม:

for(;$d<=$n;$d++) // loop decimal $d from 0 to $n
{
    echo'
',$d|0; // print line break and decimal
    for($k=$d,$b='';$k;$k>>=1)$b=($k&1).$b; // convert $d to binary
    for($w=1;$w<6;$w++,
        print" $z"|' 0' // print number generated in inner loop (echo doesn´t work here)
    )
        for($z='',$k=strlen($b);-$w<$k-=$w; // loop from end by $w
            $z=($e>9?chr($e+87):$e).$z // prepend digit created in body
        )
            for($e=0,$y=1,$j=$w;$j--;$y*=2) $e+=$y*$b[$j+$k]; // convert chunk to 2**$w
}

การแก้ไขที่สำคัญ:

  • ใช้เวทมนต์ดัชนีเพื่อปรับปรุงลูปด้านใน -> ตอนนี้ทำงานย้อนหลังบนสตริงทั้งหมด (ไม่มีการขยายเพิ่มเติมไม่มีการแยกหรือคัดลอกไบนารีอีกต่อไป)
  • ย้ายส่วนต่าง ๆ ของร่างกายวนไปที่หัวเพื่อกำจัดการจัดฟัน
  • ต้องเพิ่ม7 4 ไบต์เพื่อแก้ไขผลลัพธ์ทศนิยม 0 หลังจากการปรับปรุง

รุ่นที่ไม่ใช่โบนัส 142 ไบต์

for(;$d<=$n;$d++,print'
',$d|0)for($w=1;$w<6;$w++,print" $z"|' 0')for($k=$d,$y=1,$z='';$k&&$y<<=$w;$k>>=$w)$z=(9<($e=$k%$y)?chr($e+87):$e).$z;

PHP ชนะ Python หรือไม่
แม้ว่าฉันจะเพิ่ม 6 (3.6) ไบต์เพื่อสร้างตัวอย่างโปรแกรมฉันยังคงเอาชนะ Python (223 * 0.6 = 133.8 หรือ 148 ที่ไม่ใช่โบนัสเทียบกับ 158) น่าอัศจรรย์


ฉันได้รับข้อผิดพลาด 'ตัวแปรที่ไม่ได้กำหนด: n: 1' และฉันคิดว่าคุณสามารถบันทึก 1 ไบต์ได้โดยลบช่องว่างหลังจากforคำหลักในวงนอกสุดสำหรับลูป
Yytsi

@TuukkaX: ดูการใช้งาน: $ n ต้องถูกกำหนดไว้ก่อนหน้าตัวอย่าง ฉันพบว่าไบต์ แต่ขอบคุณ และอีกหนึ่ง: "\n"-> ตัวแบ่งบรรทัดทางกายภาพ
ติตัส

แต่ฉันต้องเพิ่ม 3 ไบต์เพื่อพิมพ์ 0 แรก (นั่นหรือ 5 ไบต์เพื่อเริ่มต้นตัวแปร)
ติตัส


0

Python3 - 189, 167, 166 150 ไบต์

for i in range(int(input())+1):f=lambda b,n=i,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(b,n//b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))

บันทึก 16 ไบต์ด้วยความช่วยเหลือของ @ LeakyNun !

รุ่นโบนัส - 296 * 0.6 = 177.6 279 * 0.6 = 167.4 ไบต์

p=lambda b,c:"".join(str(int(b[i:i+c],2))for i in range(0,len(b),c))
z=lambda s:len(s)%2 and s or "0"+s
for i in range(int(input())+1):f=lambda n,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];v=f(i,2);d=z(v);print(i,v,p(d,2),p(d,3),p(d,4),p(d,5),f(i,32))

เวอร์ชันโบนัสที่อ่านได้ง่ายขึ้นเล็กน้อย

p=lambda b,c:"".join(str(int(b[i:i+c],2))for i in range(0,len(b),c))
z=lambda s:len(s)%2 and s or "0"+s
for i in range(int(input())+1):
    f=lambda n,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n] or f(n//b,b) + c[n%b]
    v=f(i,2)
    d=z(v)
    print(i,v,p(d,2),p(d,3),p(d,4),p(d,5),f(i,32))

ฉันค่อนข้างมั่นใจว่าโบนัสจะไม่สามารถใช้ได้ คุณไม่ได้ใช้เลขฐานสองในการสร้างตัวเลขฐาน 2 ** x
ติตัส

@Tios โอ้ฉันเข้าใจโบนัสผิดแล้ว ฉันจะแก้ไขจำนวนไบต์ ขอบคุณ!
Yytsi

"0123456789abcdefghijklmnopqrstuv"ค่อนข้างแน่ใจว่าสั้นกว่าfrom string import* digits+ascii_lowercase
Leaky Nun

@LeakyNun โอ๊ะโอ คุณถูก. ฉันแค่คิดถึงว่าจะเขียนสั้นแค่ไหนdigits+ascii_lowercase: D ขอบคุณ!
Yytsi

150 ไบต์: for i in range(int(input())+1):f=lambda n=i,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))(หนึ่งบรรทัด)
Leun Nun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.