10 진수와 2 ** i베이스로 숫자 표를 인쇄합니다


9

컴퓨터는 바이너리로 산다. 모든 프로그래머는 바이너리를 알고 있습니다.

그러나 2**x기본은 종종 비 실용적 인 것으로 무시되지만 이진과 아름다운 관계가 있습니다.

그러한 아름다운 관계의 한 가지 예를 보여 드리기 위해 19는 나의 증언이 될 것입니다.

19 10011 103 23 13 j
  • 19는 명확성을 위해 포함 된 10 진수입니다.

  • 10011은 이진수로 19입니다.

  • 103에서 기본 4의 이진법으로 시작합니다 :

    • log2 (4) == 2, 두 가지를 기억합시다.
    • 10011을 2 길이의 배수가되도록 패드-> 010011
    • 왼쪽에서 오른쪽으로 2에서 2까지의 숫자를 가져 와서 2 자리 2 진수로 처리하십시오.

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

    완료 에 10011,베이스 (4)는 103이다.

8 진의 경우 log2 (8) = 3과 동일하지만 3x3을 수행하십시오.

  • 패드 010011
  • 010-> 2
  • 011-> 3

    23, 완료 .

16 진의 경우 log2 (16) = 4와 동일하지만 4x4를 ​​수행하십시오.

  • 패드 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까지의 i에 해당합니다. 이진수는 작동하는 데 필요한 최소값의 전형이므로 코드는 가능한 짧아야합니다.

제한 및 보너스

  • Base-ten-> 이진 및 이진-> 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 이제 내 방법을 사용하면 골퍼에게 더 많은 자유를 줄 수있는 보너스
만주게됩니다

1
나도 보너스의 팬이 아닙니다. 그것은 효과적으로 당신이 내장 또는 알고리즘을 사용해야한다는 것을 의미하며, 다른 알고리즘은 실행할 수 없습니다.
xnor

@xnor 내장은 허용되지 않습니다. 일반적인 변환기는 더 짧을 것입니다. 그래서 당신이 저의
결정된

답변:



1

Pyth, 52 * 0.6 = 31.2 바이트

L?b+%b2y/b2YVUhQjd+NmjkX|_uL++GGHZ_McyNd]ZUQ+jkUTGS5

온라인 테스트

내 보너스 이외의 대답은 39 바이트입니다.

M?G+g/GHH@+jkUTG%GHkVUhQjd+N|R0gLN^L2S5

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 버전에서는 정의되지 않은 변수 및 초기화되지 않은 문자열 오프셋에 대한 통지를 던질 수 있습니다.
    error_reporting (prepend error_reporting(0);) 에서 E_NOTICE를 제거 하여 억제하십시오.
  • 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
}

주요 편집 :

  • 내부 루프를 개선하기 위해 인덱스 매직을 사용했습니다.-> 이제 전체 문자열에서 역으로 작동합니다 (더 이상 패딩, 바이너리 분할 또는 복사 없음).
  • 중괄호를 제거하기 위해 루프 바디의 일부를 헤드로 이동
  • 개조 후 10 진수 0 결과를 수정하기 위해 7 4 바이트 를 추가해야했습니다.

비 보너스 버전, 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가 파이썬을 이겼습니까?
스 니펫을 프로그램으로 만들기 위해 6 (3.6) 바이트를 추가하더라도 여전히 파이썬을 이길 것입니다 (223 * 0.6 = 133.8 또는 148 비 보너스 대 158). 놀랄 만한.


'정의되지 않은 변수 : n : 1'오류가 발생 for하고 가장 바깥 쪽 for-loop에서 키워드 다음에 공백을 제거하여 1 바이트를 절약 할 수 있다고 생각합니다 .
Yytsi

@TuukkaX : 사용법 참조 : 스 니펫 전에 $ n을 정의해야합니다. 그 바이트를 찾았지만 감사합니다. 그리고 하나 더 : "\n"-> 물리적 줄 바꿈.
Titus

그러나 첫 번째 0을 인쇄하려면 3 바이트를 추가해야했습니다 (변수를 초기화하려면 5 바이트).
Titus

0

루비, 80 바이트 (보너스 이외 버전)

m=ARGV[0].to_i;(0..m).each{|n|puts [10,2,4,8,16,32].map{|b|n.to_s(b)}.join(' ')}

0

Python3-189 , 167, 166150 바이트

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

@ LeakyNun 의 도움으로 16 바이트를 절약했습니다 !

보너스 버전 -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 숫자를 생성하지 않습니다.
Titus

@Titus 아, 그때 보너스를 잘못 이해했습니다. 바이트 수를 편집하겠습니다. 감사!
Yytsi

확신 "0123456789abcdefghijklmnopqrstuv"보다 짧은from string import* digits+ascii_lowercase
새는 수녀

트윗 담아 가기 네가 옳아. 나는 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))(한 줄)
Leaky Nun
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.