이진 단순화


20

도전

어떤 방법 으로든 이진수를 입력하면 전체 프로그램이나 함수를 사용하여 숫자를 "단순화"합니다.

입력

[binary]
  • binary 이진수로 0보다 큰 숫자입니다.

산출

입력을 가져 와서 내장을 사용하지 않고 10 진수로 변환 한 다음 해당 숫자에 1과 0 만 포함되어 있으면 다른 이진수 인 것처럼 10 진수로 변환하십시오. 이진수로 숫자를 읽을 수 없을 때까지 프로세스를 반복하고 해당 숫자를 출력하십시오.

기타 정보

  • 입력이 1이면 간단히 출력하십시오 1. 프로그램이 무한대로 단순화되어서는 안됩니다.

  • 이것은 코드 골프이므로 화요일 (11 월 17 일)까지 바이트 단위의 최단 답변이 승리합니다.

  • 혼란스러운 점이 있으면 정리해야 할 내용을 설명으로 남겨 주면 적절하게 편집하겠습니다.

  • 기본 변환을위한 내장은 허용되지 않습니다.

     Input | Output

         1 | 1
      1010 | 2
      1011 | 3
   1100100 | 4
   1100101 | 5
1111110011 | 3

4
몇 가지 테스트 사례를 사용할 수 있습니다.
isaacg

입력이 ASCII 문자열입니까, 아니면 실제로 1과 0입니까?
톰 카펜터

@TomCarpenter 1과 0.
The_Basset_Hound

@isaacg 1-5를 출력으로 얻는 방법을 추가했습니다.
The_Basset_Hound

문자열을 주어진 기본으로 변환하는 함수가 허용됩니까?
isaacg

답변:


14

Pyth, 20 16 바이트

u?-GTG`u+yNsTG0z

Jakube 덕분에 4 바이트

코드의 절반 ( u+yNsTG0)은 기본 변환 코드입니다.

테스트 스위트

u?-GTG`u+yNsTG0z
                    z = input() (The string of 1s and 0s)
                    T = 10
u              z    Apply until the value stops changing, starting with z
                    G is the current value, a string of 0s and 1s.
 ?-GT               If G - T, e.g., G with the digits 1 and 0 removed is not empty,
     G              Return G, to end the iteration.
       u     G0     Else, reduce over G with initial value 0.
         yN         Double the running total
        +  sT       and add the next digit, cast to an int.
      `             Convert to string.

입력은 1사실에 의해 처리되는 u변화 정지 한 값을 통지.


4
축하합니다. 데니스를 능가했습니다! 지금은 ...
코너 오브라이언

9
@ CᴏɴᴏʀO'Bʀɪᴇɴ 비밀은 Pyth입니다.
isaacg

8

CJam, 24 23 바이트

q{:~{1$++}*s__,(As*-!}g

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

q                        Read all input.
 {                   }g  Do:
  :~                       Evaluate each character. Maps '0' -> 0 and '1' -> 1.
    {    }*                Fold; for each integer but the first:
     1$                      Copy the second-topmost integer.
       ++                    Add all three integers on the stack.
           s__             Cast to string and push two copies.
              ,(           Calculate string length and subtract 1.
                As         Push the string "10".
                  *        Repeat the string length-1 times.
                   -       Remove its elements from the string representation
                           of the integer.
                    !      Apply logical NOT.
                         If `!' pushed 1, repeat the loop.

"10"문자열 length-1시간 을 반복해야합니까 , 아니면 감소를 건너 뛸 수 있습니까?
DLosc

길이에서 1을 빼면 온 "10"으로 ""정수가 한 자리가있는 경우. 이렇게하면 코드가 무한 루프에 빠지지 않습니다.
Dennis

2
매혹적인 선장. } : ^ |
DLosc

7

핍, 28 27 바이트

Ta=1|aRMta:$+(^a)*2**RV,#aa

입력을 명령 행 인수로 사용합니다. 우리는 0과 1 이외의 문자를 포함 a=1하거나 a포함 할 때까지 반복하려고합니다 . 후자의 조건은 RM모든 문자를 't = 10에서a . 남은 것이 있으면 상태는 진실입니다.

루프 내에서 변환은 다음과 같이 작동합니다.

a:$+(^a)*2**RV,#a

              ,#a  range(len(a))
            RV     reversed
         2**       2 to the power of each element
    (^a)*          multiplied item-wise with each digit in split(a)
  $+               Sum
a:                 and assign back to a

퍼팅 a마지막에 자동 인쇄됩니다.

28 바이트의 재귀 솔루션 :

a<2|aRMt?a(f$+(^a)*2**RV,#a)

6

파이썬 2, 52

f=lambda n:n>1<'2'>max(`n`)and f(n%10+2*f(n/10))or n

이것을 두 개의 재귀 함수로 생각하는 것이 더 쉽습니다.

g=lambda n:n and n%10+2*g(n/10)
f=lambda n:n>1<'2'>max(`n`)and f(g(n))or n

이 함수 g는 10 진수 값을 이진수로 변환하며 인수가 숫자 0과 1 ( )로 구성되고 그렇지 않은 f경우 g반복적으로 적용됩니다.'2'>max(`n`)1 . golfed 코드의 정의를 삽입하여 하나의 함수로를 축소 g(n)를 들어 f(n), 상기 재귀 호출 교체 gf. 의 기본 케이스 n=0의는 g자동으로 검사에 의해 처리됩니다 n>1.


니스 : 유일한 것은 보통 문제가 적용된다 - 성가신을 L에서 repr...
SP3000

4

도입부 (220) 212 바이트

:-use_module(library(clpfd)).
x(B,N):-reverse(B,C),foldl(y,C,0-0,_-N).
y(B,J-M,I-N):-B in 0..1,N#=M+B*2^J,I#=J+1.
b(N,I):-N>47,N<50,I is(N-48).
p(N):-N>1,number_codes(N,L),maplist(b,L,Y),x(Y,B),p(B);write(N).

설명
P는 기본 기능을 수행한다 (B, X, Y의 도움으로) 다음 단계이다 :

  • 현재 숫자가 1보다 큰지 확인
  • 정수를 숫자의 ASCII 표현 목록으로 변환
  • 모든 숫자가 0 또는 1인지 확인
  • ASCII 목록을 이진 정수 목록으로 변환
  • 이진 정수 목록을 십진수로 변환
  • 되풀이
  • 술어가 실패하면 인쇄합니다.

편집 : OR로 p 절을 통합하여 8 바이트를 절약했습니다.


3

매쓰 107 106

DLosc에 의해 저장된 바이트.

j@d_:=(p=0;v=IntegerDigits@d;
Which[d<2,1,Complement[v,{0,1}]=={},j@Fold[#+#2 2^p++&,0,Reverse@v],1<2,d])

입력을 숫자로 분리하십시오. 입력이 1이면 1을 출력하십시오.

입력이 0과 1로 구성된 숫자 인 경우 10 진수로 변환 한 후 다시 실행하십시오.

그렇지 않으면 입력을 반환하십시오.


j[1]

1


j[11010001]

209


j[1111110001]

1009


j[1111110011]

첫 번째 단계는 1011을 생성하고 결과적으로 3을 생성합니다.


여기서는 1011부터 테스트합니다.

j[1011]


3

자바 스크립트, 132 , 123 바이트

가장 좋은 대답은 아니지만 ..

참고로, 유효하지 않은 입력이 제공되면 사용자에게 동일하게 표시됩니다.

function c(x){while(x!=0&&!/[2-9]/.test(x)){for(i=r=0;x;i++)r+=x%10*Math.pow(2,i),x=parseInt(x/10);x=r}alert(x)}c(prompt())


1
ES6 함수 설명, 인라인 증가를 사용하여 일부를 버리고 명령문에서 직접 값을 설정하고 대신 값을 설정하여 일부를 줄임으로써 19 바이트절약 할 수 있습니다 . 다음과 같이 보일 것입니다 : . forwhile{};ic=x=>{for(r=0;x&&!/[2-9]/.test(x);x=r)for(i=0;x>0;r+=x%10*Math.pow(2,i++),x=parseInt(x/10));alert(x)};c(prompt())
insertusername 여기

1
114 :function c(x){while(x^0&&!/[2-9]/.test(x)){for(i=r=0;x;i++)r+=x%10*Math.pow(2,i),x=0|x/10;x=r}alert(x)}c(prompt())
Mama Fun Roll

@insertusername 여기, 제안 해 주셔서 감사하지만 처음에는 이해 c=x=>하지 못했지만 Chrome 또는 Firefox 콘솔에서 작동하지 않았습니다. :( @ ן nɟuɐɯɹɐ ן oɯ, XOR 조건으로 머리를 감쌀 수 없으며 x=0|x/10‌대신에 parseInt나머지 변경 사항을 통합했습니다.
LearningDeveloper

@GauthamPJ 죄송합니다. 복사하는 동안 코드가 손상되어 인쇄 할 수없는 문자가 포함되어 있습니다. 올바른 버전은 다음과 같습니다 c=x=>{for(r=0;x!=0&&!/[2-9]/.test(x);x=r)for(i=r=0;x;)r+=x%10*Math.pow(2,i++),x=parseInt(x/10);alert(x)};c(prompt()).. Firefox 42에서 확실히 실행됩니다 . 이 바이올린을 사용해보십시오 . 이 골프 버전과 원본 코드는 작동하지 않으며 1무한 루프에 빠질 수 있습니다 . c=x=>처럼 function c(x){}"을 참조 화살표 기능을 ".
insertusername 여기

2

자바 스크립트 ES6, 52

기능으로서. 함수 인수는 2 진수 문자열이거나 10 진수 표시에 1과 0 만 포함 된 숫자 여야합니다.

EcmaScript 6 호환 브라우저에서 아래 스 니펫 실행 테스트-화살표 기능, 템플릿 문자열 및 스프레드 연산자 구현 (Firefox 사용)

f=s=>s<2|[...s+''].some(c=>(n+=+c+n,c>1),n=0)?s:f(n)

// To test
console.log=(...x)=>O.innerHTML+=x+'\n';

// Basic test cases
;[[1,1],[1010,2],[1011,3],[1100100,4],[1100101,5],[1111110011,3]]
.forEach(t=>console.log(t[0]+' -> '+f(t[0])+' expected '+t[1]))

function longtest() {
  var o=[],i;
  for (i=1;i<1e6;i++)
    b=i.toString(2),v=f(b),v!=i?o.push(b+' '+v):0;
  O.innerHTML=o.join`\n`
}
Click to run the long test <button onclick="longtest()">go</button>
<pre id=O></pre>


1
n+=+c+n이진 변환을 정말로 좋아 합니다. 너무 우아한 ...
nderscore

2

매스 매 티카, 62 59 55 48 바이트

Martin Büttner 덕분에 7 바이트가 절약되었습니다.

#//.a_/;Max[b=IntegerDigits@a]<2:>Fold[#+##&,b]&

1

자바 스크립트 (ES7) 87 80 78 77 74 바이트

브라우저 지원을위한 스 니펫 데모 (현재는 Firefox 야간에만 지수 연산자를 지원함)

f=x=>[...x].reverse(i=y=j=0).map(z=>(j|=z,y+=z*2**i++))&&j<2&y>1?f(y+[]):x
<input type="text" id="x" value="1111110011"><button onclick="o.innerHTML=f(x.value)">Run</button><div id="o"></div>

f=x=>
[...x].reverse(i=y=j=0) // reverse string as array, initialize vars
.map(z=>( // iterate over the all chatacters
    j|=z, // keep track of whether a digit higher than 1 is encountered
    y+=z*2**i++ // build decimal result from binary
))&&
j<2&y>1? // if we encountered only 1's and 0's and result > 1
    f(y+[]) // then call recursively and cast to a string
    :x // else return x

자바 스크립트 (ES6) 81 바이트

브라우저 지원을위한 스 니펫 데모

f=x=>[...x].reverse(i=y=j=0).map(z=>y+=z*Math.pow(2,i++,j|=z))&&j<2&y>1?f(y+[]):x
<input type="text" id="x" value="1111110011"><button onclick="o.innerHTML=f(x.value)">Run</button><div id="o"></div>


1

𝔼𝕊𝕄𝕚𝕟, 37 자 / 54 바이트

↺;ï>1⅋(⬯+ï)ĉ/^[01]+$⌿);)ï=+('ᶀ'+ï);ôï

Try it here (Firefox only).

+연산자가 이진 변환을위한 내장 함수로 계산 되는지 확실하지 않습니다 ...



1

PHP, 210 204 바이트

여기에 처음으로 게시하므로 여러분들이 좋아할 수 있기를 바랍니다! 비록 그것을 작성하는 가장 좋은 방법은 아니지만, 나는 여기에 그것을 보여주는 것이 여전히 기쁘다!

코드

<?function j($a){$c=0;if($a==1){return 1;}else{if(preg_match("#^[01]+$#",$a)){$b=strlen($a);$a=str_split($a);foreach($a as$d){$c+=($d==0?0:2**($b-1));$b--;}return j($c);}else{return$a;}}}echo j($_GET[0]);

입력이 1과 같은지 먼저 확인하는 재귀 함수 "j"를 만들었습니다. 그렇다면 함수가 예상대로 1을 반환하고 그렇지 않으면 10 진수 값을 계산하기 위해 배열의 숫자를 나눕니다. 숫자가 이진수이면 그렇지 않으면 숫자를 그대로 반환합니다.

Ungolfed 코드

<?
function j($a) {
  $c = 0;
  if ($a == 1) {
    return 1;
  }
  else {
    if (preg_match("#^[01]+$#", $a) {
      $b = strlen($a);
      $a = str_split($a);
      foreach ($a as $d) {
        $c += ($d == 0 ? 0 : 2 ** ($b - 1));
        $b--;
      }
      return j($c);
    }
    else {
      return $a;
    }
  }
}
echo j($_GET[0]);

초기 "for"문 대신 "foreach"문을 사용하여 6 바이트를 얻었지만 더 많은 작업이있을 것입니다.


1

PHP, 114112 바이트

또한 작동합니다 0. 로 실행하십시오 -r.

for($n=$argv[1];count_chars($s="$n",3)<2&$s>1;)for($i=$n=0;""<$c=$s[$i++];)$n+=$n+$c;echo$s;

count_chars($s,3)array_unique배열에서 와 같이 문자열에서 모든 문자를 포함하는 문자열을 반환합니다 . 이진수를 들어,이 것 0, 1또는 01. 다른 숫자의 경우 이보다 큰 숫자가 포함 1되므로 <2이진수의 경우에만 true를 반환합니다.

&$s>1특별한 경우에 필요합니다 1.

나머지는 간단합니다. 값을 이동하고 현재 비트를 추가하여 비트를 반복하고 마지막으로 외부 루프 테스트를 위해 숫자 (캐스팅 된 문자열)를 $ s에 복사합니다.


0

CoffeeScript, 92 89 바이트

f=(x)->x>1&/^[01]+$/.test(x)&&f(''+x.split('').reverse().reduce ((p,v,i)->p+v*2**i),0)||x

자바 스크립트 (ES6), 105 (101) 90 바이트

f=y=>y>1&/^[01]+$/.test(y)?f(''+[...y].reverse().reduce(((p,v,i)=>p+v*Math.pow(2,i)),0)):y

데모

Firefox 및 Microsoft Edge와 같은 ES6 호환 브라우저에서만 작동

f=y=>y>1&/^[01]+$/.test(y)?f(''+[...y].reverse().reduce(((p,v,i)=>p+v*Math.pow(2,i)),0)):y

// Snippet stuff
$(`form`).submit((e) => {
  document.getElementById(`y`).textContent = f(document.getElementById(`x`).value);
  e.preventDefault()
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <label>Input:
    <input pattern=^[01]+$ required id=x>
  </label>
  <button type=submit>Go</button>
  <p>Output:
    <output id=y></output>
  </p>
</form>


eval을 사용하면 암시 적 수익을 얻을 수 있습니다.
Mama Fun Roll 5

eval 및 anonymous 함수로 5 바이트 더 짧음
Downgoat

@ ן nɟuɐɯɹɐ ן oɯ 어떤 이유로 eval'd 함수가 작동하지 않습니다 1. 루프에 들어 가지 않기 때문에
rink.attendant.6

1
@nderscore 감사하지만 재귀는 4 바이트 짧았습니다 :-)
rink.attendant.6

0

스칼라, 128 바이트

def b(s:String):String=if(s.matches("[10]{2,}"))b(""+s.reverse.zipWithIndex.collect{case('1',i)=>Math.pow(2,i)}.sum.toInt)else s

0

MATLAB (115)

@(a)num2str(sum((fliplr(a)-48).*arrayfun(@(x)2^x,0:nnz(a)-1)));a=ans(input('','s'));while(find(a<50))a=ans(a);end,a

  • 익명 함수는 숫자 유형 변환 ( bin2dec)입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.