1에서 정수까지의 세기… 이진수


13

소개 :

어렸을 때 계산기를 들고 계속 +버튼 을 누르고 계산할 수있는 높이를 기억합니다. 이제 프로그래밍하고 iOS 용으로 개발하고 있습니다.

카운팅은 인간과 컴퓨터 모두에게 기본적인 기술입니다. 그것 없이는, 나머지 수학은 할 수 없습니다. 시작 1하고 반복적으로 추가 1하여 간단하게 수행 됩니다.

도전 과제 :

이것은 단순한 도전이다. 프로그램에서 1원하는 것은 무엇이든 인쇄 하는 Integer것입니다. 그러나 십진법 계산은 다소 지루하기 때문에 조금 틀립니다.

카운팅은 기본 10에있을 수 없으며 이진으로 카운팅해야합니다.

따라서 32 비트 정수를 사용하여 5를 세면 다음과 같습니다.

0000 0000 0000 0000 0000 0000 0000 0001 ..... 1
0000 0000 0000 0000 0000 0000 0000 0010 ..... 2
0000 0000 0000 0000 0000 0000 0000 0011 ..... 3
0000 0000 0000 0000 0000 0000 0000 0100 ..... 4
0000 0000 0000 0000 0000 0000 0000 0101 ..... 5

컴퓨터입니다. 그들은 바이너리를 가장 잘 알고 있습니다. 입력은 32 비트 또는 64 비트 정수일 수 있습니다. 그것은 당신에게 달려 있습니다. 그러나 32 비트 정수를 사용하는 경우, 귀하의 출력이 있어야합니다 32 비트 정수가 될 바이너리를 , 그리고 64 비트 정수를 사용하는 경우, 귀하의 출력이 있어야합니다 64 비트 정수가 될 이진 .

샘플 입력 :

32 비트 정수 5

샘플 출력 :

0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0101

채점 :

점수는 코드가 많은 바이트와 같습니다. 이것이 코드 골프이므로 최저 점수가 이깁니다.

보너스 포인트 :

출력에서 10 진수로 표시되는 숫자 (예 : 0000 0000 0000 0000 0000 0000 0000 00012 진수는 10 진수와 동일 1)를 표시하면 점수에을 곱하십시오 0.8.

내가했던 것처럼 4 자리수의 출력을 그룹화하면 점수에 0.8(다시) 를 곱하십시오 . 필요하지 않습니다.

반올림하지 말고 반올림하지 마십시오. 당신의 점수는 부동 소수점 숫자입니다.

행운을 빕니다!


공백으로 구분 된 네 개의 청크로 숫자를 입력해야합니까?
xnor

@xnor 아니요. 가독성을 높이기 위해 그랬지만 보너스 기회도 포함시킬 것입니다.
DDPWNAGE

무제한 크기의 데이터 유형 (예 : Python 3 int)을 사용하면 어떻게됩니까?
isaacg

@isaacg 프로그램이 32 비트 또는 64 비트 정수를 사용할지 지정하십시오. 범위를 벗어난 정수를 수용 할 필요는 없습니다. 입력 한 내용 만 출력하면됩니다. 다시 말해, 선택은 당신입니다.
DDPWNAGE

4
우리의 언어가 30 비트 정수 (Haskell) 또는 임의의 정밀 정수 (J)와 같은 다른 것을 사용한다면 어떨까요?
FUZxxl

답변:


14

APL, 10 자

APL의 다른 하나. ⎕IO←1(기본값)을 가정 합니다. 보너스 포인트가 없습니다. 입력 장치에서 숫자를 읽습니다. APL이 32 비트 정수 대신 64 비트 정수를 사용하는 경우 필요에 따라 64를 32로 대체하십시오.

정수의 범위를 초과하면 APL이 부동 소수점 숫자로 투명하게 변환됩니다. 따라서 정수 크기 APL이 작동하는 것을 정확하게 말하기는 어렵습니다.

⍉(32⍴2)⊤⍳⎕

설명

2          ⍝ the number 2
32⍴2       ⍝ a vector of 32 twos.
(32⍴2)⊤X   ⍝ X represented as base 2 to 32 digits precision
⍳X         ⍝ a vector of the integers from 1 to X
⎕          ⍝ a number queried from the terminal
(32⍴2)⊤⍳⎕  ⍝ the output we want, flipped by 90°
⍉(32⍴2)⊤⍳⎕ ⍝ the output we want in correct orientation (⍉ is transpose)

내가 4 그룹을 얻기 위해 그렇게 열심히 시도해서는 안되는 것처럼 보인다 haha
protist

@protist 구현하기 어려운 보너스 포인트를 얻으려고하지 마십시오. 노력할 가치가 거의 없습니다.
FUZxxl

질문은 문자가 아닌 바이트 수를 구체적으로 요구했기 때문에 점수는 20 바이트 여야합니다.
ankh-morpork

@ dohaqatar7 전체 APL 문자 세트를 1 바이트로 맞추는 APL 인코딩 (예 : 코드 페이지 907 )이 있습니다. 전통적인 APL 코드 페이지로 인코딩 할 수없는 APL 확장이 있지만 그중 하나를 사용하지는 않습니다.
FUZxxl

7

자바 스크립트 ( ES6 ) 56.8 (71 * 0.8)

JavaScript가 64 비트 정밀도를 처리 할 수 ​​없으므로 32 비트 버전 (부동 소수점 배가를 사용하는 최대 53 비트)

그룹화하지 않고

f=n=>{for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).slice(1),i)} 

그룹화-60.16 점 (94 * .64)

f=n=>{for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).slice(1).match(/..../g).join` `,i)}

모든 브라우저에서 테스트 (ES5)

function f(n)
{
  for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).substr(1).match(/..../g).join(' '),i)
}

// Test
console.log = function(x,y) { O.innerHTML += x+' '+y+'\n' }
Count to: <input id=I><button onclick="O.innerHTML='';f(+I.value)">-></button>
<pre id=O></pre>


6

Pyth, 18 * 0.8 * 0.8 = 11.52 바이트

VSQjd+c.[64.BN\04N

출력 예 :

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1001 9
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1010 10

2
@DDPWNAGE 다른 사람들이 대답을 수락하기 전에 경쟁 할 시간을주십시오 :)
orlp

좋아, 나는 그것을 일시적으로 받아들이는 것에 대해 생각하고 있었기 때문에 사람들은 무엇을 이길 지 알고있다.
DDPWNAGE

2
@DDPWNAGE 답변을 수락하고 몇 시간 동안 기다린 후에는 답변을 쉽게 수락 할 수 없습니다.
FUZxxl

4

Pyth, 19 * 0.8 * 0.8 = 12.16 바이트

VSQjd+cjk.[032.BN4N

입력 5의 ​​출력 예 :

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5

데모.


4

파이썬 2, 48 * 0.8 = 38.4

i=0;exec"i+=1;print format(i,'032b'),i;"*input()

숫자를 이진수로 변환하고 문자열 형식을 사용하여 32 자리의 이진수로 변환 한 다음 10 진수를 보너스로 인쇄합니다. exec루프를 사용 1하여 입력 값 에서 증가 합니다.


좋은 해결책! 나는 그것이 지정되었다고 생각하지 않지만 32 비트 범위의 큰 숫자에서는 실패합니다 : OverflowError: repeated string is too long. 그래도 내 컴퓨터의 한계인지 확실하지 않습니다.
Kade


4

APL, 23.68 (37 × .8 × .8)

{⎕←(⍕⍵),⍨⊃,/,/' ',⍨⍕¨8 4⍴(32⍴2)⊤⍵}¨⍳⎕

3

KDB (Q), 50 * 0.8 * 0.8 = 32

제출 내용이 약간 슬프다 고 생각합니다. (이 작업을 수행하는 더 좋은 방법이 있어야합니다!

{-1{" "sv raze@'string(0N 4#0b vs x),x}@'1+til x;}

설명

                                         1+til x     / counting
   {                                  }@'            / lambda each
                      (0N 4#0b vs x),x               / convert to binary and join with input
    " "sv raze@'string                               / convert to string, concatenate each string and join with space
{-1                                             ;}   / print and surpress output in lambda

테스트

q){-1{" "sv raze@'string(0N 4#0b vs x),x}@'1+til x;}5
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 5

2
잘 당신은 K로 떨어질 수 있습니다;)k){-1{" "/:,/'$:(0N 4#0b\:x),x}@'1+!x}
protist

3

커먼 리스프, 96.0

점수: (* 150 .8 .8)

(lambda(y)(flet((p(n &aux(x(format()"~39,'0b ~:*~d"n)))(dolist(p'(4 9 14 19 24 29 34))(setf(aref x p)#\ ))(princ x)(terpri)))(dotimes(i y)(p(1+ i)))))

10으로 함수 호출 :

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 1001 9
0000 0000 0000 0000 0000 0000 0000 1010 10

설명

(format()"~39,'0b ~:*~d" #b101010101010) 제공합니다 :

"000000000000000000000000000101010101010 2730"

중간 문자열 (배열)은 다음과 같은 0부터 시작하는 인덱스에 공백 문자를 넣도록 수정됩니다. 4 9 14 19 24 29 34. 그런 다음 인쇄됩니다.

명백한 (format t"~39,'0,' ,4:b ~:*~d" #b101010101010)형식은 원하는 것을 수행하지 않습니다. 다음을 인쇄합니다.

00000000000000000000000001010 1010 1010 2730

(패딩은 4로 그룹화되지 않습니다)



3

C, 97 * 0.8 * 0.8 = 62.08

a,x;main(b){for(scanf("%u",&b);a++<b;printf("%d\n",a))for(x=32;x--;)printf("%*d",x%-4-2,a>>x&1);}

입력 "5"의 출력 예 :

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 1001 9

십진수를 이진수와 분리하기 위해 공백 문자를 하나 더 추가 할 수 있지만 기술적으로 문제는 필요하지 않습니다. 편집 : 감사합니다, CL!


1
그런데 당신은 대체 할 수 x%-4-1와 함께 x%-4-2별도의 바이트 비용 바이너리와 소수 사이의 공간을 추가 할 수 있습니다. (이것은 또한 각 줄의 시작 부분에 여분의 공간을 제거합니다.)
CL-

2

옥타브, 23 자

dec2bin(1:input(""),32)

입력 5의 ​​출력 예 :

ans =
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

2

MatLab, 19 바이트

@(x)dec2bin(1:x,32)

MatLab은 10 진 대 이진 변환기를 내장하고 있으며 결과를 자동으로 인쇄합니다.


1
32 비트 / 64 비트 정수는 인쇄하지 않습니다.
user0815

죄송합니다. 감사합니다. 이에 따라 코드를 변경했습니다.
Robby

이 답변은 Octave 답변 과 거의 동일합니다 .
Alex A.

2

줄리아, 42 바이트

보너스가 없으면 조금 더 짧습니다.

n->for i=1:n println(lpad(bin(i),64,0))end

이것은 정수를 취하고 1에서 n 까지의 각 숫자의 이진 표현을 인쇄하는 명명되지 않은 함수를 작성하며 , 각 왼쪽은 0에서 64 자로 채워집니다.


보너스 포함, 78 바이트 * 0.8 * 0.8 = 49.92

n->for i=1:n for j=1:4:64 print(lpad(bin(i),64,0)[j:j+3]*" ")end;println(i)end

이것은 정수를 취하고 이전과 같이 이진 표현을 인쇄하는 명명되지 않은 함수를 생성합니다. 이번에는 마지막 10의 숫자로 4의 그룹으로 나뉩니다.


2

공통 리스프, 점수 : 64.0

100 바이트 * 0.8 * 0.8

나는 내 점수에 만족하지만 여전히 코드를 조금 단순화 할 가능성이 있다고 생각합니다.

산출

0000 0000 0000 0000 0000 0000 0000 0001  1
0000 0000 0000 0000 0000 0000 0000 0010  2
0000 0000 0000 0000 0000 0000 0000 0011  3
0000 0000 0000 0000 0000 0000 0000 0100  4
0000 0000 0000 0000 0000 0000 0000 0101  5
0000 0000 0000 0000 0000 0000 0000 0110  6
0000 0000 0000 0000 0000 0000 0000 0111  7
0000 0000 0000 0000 0000 0000 0000 1000  8
0000 0000 0000 0000 0000 0000 0000 1001  9
0000 0000 0000 0000 0000 0000 0000 1010  10

암호

(defun r(n)(dotimes(i n)(format t"~{~a~a~a~a ~}~a~%"(coerce(format()"~32,'0B"(1+ i))'list)(1+ i))))

설명

coredump의 답변에 설명 된 것처럼 형식 문자열

"~32,'0B"

base2 숫자를 출력하지만 그룹화를 올바르게 수행 할 가능성이없는 것 같습니다. 따라서 문자열을 목록으로 강제 하고이 형식 문자열로 4 그룹을 선택하여 반복합니다.

"~ {~ a ~ a ~ a ~ a ~} ~ a ~ %"

4의 각 그룹 뒤에는 공백이 있고 마지막 그룹 뒤에는 base10 번호가 인쇄됩니다.

그룹화하지 않음 (60x0.8 => 48.0)

(defun r(n)(dotimes(i n)(format t"~32,'0B ~:*~a~%"(1+ i))))

~ : *를 사용하여 (단일) 형식 인수를 다시 처리합니다.


1

PHP, 51.84 (81 × .8 × .8)

OS가 64 비트인지 여부에 관계없이 Windows에서는 PHP가 32 비트로 제한되므로 32 비트 버전.

하나의 명령 행 인수를 사용합니다.

for($i=0;$i++<$argv[1];)echo chunk_split(str_pad(decbin($i),32,0,0),4," ")."$i\n";

1

CoffeeScript, 60.8 (76 × .8)

CoffeeScript가 JavaScript로 컴파일되므로 위에서 언급 한 이유로 32 비트 버전 .

f=(x)->console.log(("0".repeat(32)+i.toString 2).slice(-32),i)for i in[1..x]

그룹화하면 약간 길어집니다 : 64.64 (101 × .8 × .8)

f=(x)->console.log(("0".repeat(32)+i.toString 2).slice(-32).match(/.{4}/g).join(" "),i)for i in[1..x]

1

하스켈, 56 바이트

f n=putStr$unlines$take n$tail$sequence$replicate 32"01"

용법:

*Main> f 5 
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

64 비트의 경우, 교체 32와 함께 64. 다른 모든 숫자도 작동합니다.


1

J, 20 바이트

(32#2)#:>:i.".1!:1<1

샘플 입력 및 출력 :

3
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1

1

스위프트 : 98.56 (154 * 0.8 * 0.8)

for x in 1...Int(Process.arguments[1].toInt()!){var p=String(x,radix:2)
let q=count(p)
for i in 0..<32-q{p=(((q+i)%4==0) ?"0 ":"0")+p}
println("\(p) \(x)")}

1

루비, 64 비트

70 * 0.8 * 0.8 = 44.8 바이트 (분할, 소수점)

1.upto(gets.to_i){|i|puts ("%064d"%i.to_s 2).scan(/.{4}/)*?\s+" #{i}"}

51 * 0.8 = 40.8 바이트 (10 진수)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2)+" #{i}"}

67 * 0.8 = 53.6 바이트 (분할)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2).scan/.{4}/}

44 바이트 (보너스 없음)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2)}

1

05AB1E , 13 11 바이트

Lb32jsäð0:»

@ Mr.Xcoder 덕분에 -2 바이트 .

공백 문자 나 시퀀스 번호가없는 출력.

온라인으로 사용해보십시오.

설명:

L              # List of range [1,input]
               #  i.e. 5 → [1,2,3,4,5]
 b             # Convert each to a binary string
               #  i.e. [1,2,3,4,5] → ['1','10','11','100','101']
  32j          # Join everything together with a minimum length per item of 32,
               # which basically prepends spaces to make it length 32
               #  i.e. ['1','10','11','100','101'] → '                               1                              10                              11                             100                             101'
     sä        # Split it into the input amount of parts
               #  i.e. 5 → ['                               1','                              10','                              11','                             100','                             101']
       ð0:     # Replace every space with a 0
               #  i.e. '                             101' → '00000000000000000000000000000101'
          »    # Join everything together by newlines (and output implicitly)

1
Lb32jsäð0:»11 바이트에서 작동
Mr. Xcoder

@ Mr.Xcoder 감사 j합니다. 올바른 길이가되도록 접두어 를 사용 하는 것을 완전히 잊었습니다 .
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.