숫자를 대표 숫자로 분해


9

Repdigits 폼의 숫자 a * (10^n - 1)/9와 함께 a in [-9,9]\{0}(즉 111 -3333 66 만 한 디지트를 반복함으로써 이루어진다 번호)

목표 : 단일 양의 정수를 취하고 N인쇄 하는 프로그램이나 함수를 작성하십시오 N = s_1 + s_2 + ... + s_k. 한 줄에 하나의 숫자가 있어야하며 숫자를 오른쪽 정렬해야합니다. 두 개의 summand는 동일한 자릿수를 가져서는 안되며 0을 추가 할 수 없습니다. 출력은 오름차순 또는 내림차순으로 정렬되어야합니다 (숫자 수).

예 :

in:
24192
out:
24192 =
22222 +
 2222 -
  222 -
   33 +
    3

in:
24192
out:
    -7
   -22
  +888
 +1111
+22222
=24192

in:
113
out:
113=    NOT  111+  no empty lines  111+
111+          00+                    
  2            2                     2

보시다시피 여러 솔루션이있을 수 있으며 예술적 자유가 허용됩니다. 각 줄의 선행 및 후행 공백이 허용됩니다.

최단 바이트 수 승리


예를 들어 그냥 인쇄 N하는 것을 막기 위해 몇 가지 규칙을 선언해야합니까 ?
PurkkaKoodari

3
이것은 이미
다뤄졌다

이 숫자를 담당자 번호라고도합니다.
Ypnypn

답변:


6

펄 5-97 92 93 86

$x=$_=pop;{printf"%15s
",$_;$_=$x,s!\d!//,$&!eg,$x-=$_,$i++?s/^\b/+/:s/^/=/;/0/||redo}

매개 변수로 제공된 입력 :

$perl a.pl 2224192
     2224192
    =2222222
       +1111
        +888
         -22
          -7

숫자에 0이 있으면 아무 것도 인쇄하지 않습니다. 어쩌면 /0/루핑 조건 일 수도 있습니다.
feersum

고마워, 사실이다. 나는 펄 단축키 루프와 혼동했다. 그들은 끝에 조건이 있지만 여전히 첫 번째 반복에서 확인합니다. 그런 다음 "+0"을 찾아야합니다.
nutki

실제로 나는 하나의 추가 문자를 사용하여 do ... while ()을 시뮬레이션 할 수 있습니다 redo.
nutki

2

CJam, 55 50 바이트

'=l:L+Li{_W>"-+"=1$zs(\,)*+:Ii-L,_S*I+\~>\}h;]W%N*

여기에서 테스트하십시오.

출력 형식을 사용합니다

      -7
     -22
    +888
   +1111
+2222222
=2224192

구타를 당하면 더 골프를 칠 수도 있습니다.

설명:

'=l:L+Li{_W>"-+"=1$zs(\,)*+:Ii-L,_S*I+\~>\}h;]W%N*
'=                                                 "Push = character.";
  l:L                                              "Read STDIN and store in L.";
     +L                                            "Concatenate, push new copy of L.";
       i                                           "Convert to integer.";
        {                                 }h       "Do-while loop. Leaves the condition on the
                                                    stack. I will use the remainder for that.";
         _W>                                       "Duplicate remainder, compare with -1.";
            "-+"=                                  "Select appropriate sign character.";
                 1$                                "Copy remainder again.";
                   zs                              "Take abs() and convert to string.";
                     (                             "Shift off first digit.";
                      \                            "Swap with string.";
                       ,                           "Get length.";
                        )                          "Increment.";
                         *                         "Repeat digit that often.";
                          +                        "Concatenate with sign.";
                           :I                      "Store in I.";
                             i-                    "Convert to integer. Subtract from remainder.";
                                                   "Now we'll right-justify I.";
                               L,                  "Load input, get length.";
                                 _                 "Duplicate.";
                                  S*               "Repeat space that often.";
                                    I+             "Load string and concatenate.";
                                      \~           "Swap with length. Bitwise complement.";
                                        >          "Take that many characters from the right.";
                                         \         "Swap with remainder.";
                                            ;      "Discard final remainder (0).";
                                             ]     "Wrap in array.";
                                              W%   "Reverse.";
                                                N* "Join with line feeds.";

결과 배열은 프로그램 끝에서 자동으로 인쇄됩니다.


0

자바 스크립트 ES6-145

i=0;f=n=>{return g=n<0,n=Math.abs(n)+'',l=n.length,r=l-1?n[0].repeat(l):n,(i>0?g?'-':'+':n+'=')+'\n'+' '.repeat(i++)+(l-1?r+f((+n-r)*(g?-1:1)):r)}

Firefox 콘솔에 붙여 넣습니다. 로 실행하십시오 f(24192).

에 대한 출력 f(24192):

24192=
22222+
 1111+
  888-
   22-
    7

입력 55하면 합계에 0이 포함됩니다 (버그).
feersum

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.