파워 트레인을 찾으십시오!


29

당첨자는 10 바이트로 Jelly를 사용한 Dennis ♦입니다!

이 도전은 여전히 ​​여기에 있지만 결과는 더 이상 얻지 않을 것입니다.


숫자의 파워 트레인은 John Conway (Conway의 Game of Life 제작에도 주목할 만하지 만 요점이 아닙니다)의 개념입니다. 다음과 같이 정의됩니다.

모든 숫자에 대해 숫자 여기에 이미지 설명을 입력하십시오의 파워 트레인은 여기에 이미지 설명을 입력하십시오...입니다 (즉, 왼쪽에서 오른쪽으로 두 번째 숫자마다 그 전의 숫자의 거듭 제곱입니다). 결과가 한 자리가 될 때까지이 프로세스가 반복됩니다.

예 :

2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed 135 => (1^3)5 = 5 1234 => (1^2)(3^4) = 81 => (8^1) = 8 1100 => (1^1)(0^0) = 1 # (0^0) = 1 -42 => -42 # Negative numbers output the input

n입력의 숫자 에 상관없이 출력으로 출력을 반환해야합니다 powertrain(n)(즉 n, 파워 트레인 분해가 완료된 후).

이것은 코드 골프이므로 가장 짧은 바이트 수가 이깁니다.

면책 조항 :

  • 입력에 홀수의 자릿수를 가질 수 있으며 마지막 자릿수에는 전력이 없습니다.
  • 0 ^ 0은 1이므로 0이면 많은 숫자가 즉시 0 또는 1로 축소됩니다.
  • 계산 프로세스의 어느 부분에서든 숫자를 파괴 할 수없는 경우 (예 :로 끝나는 경우 2592) 숫자 만 출력하면됩니다.
  • 입력이 < 10(즉, 모든 한 자리 숫자 및 음수)이면 입력을 출력하십시오.

아마 몇 시간 후에 승자를 발표 할 것입니다 .

현재 리더 보드 :

  1. 젤리 ( 데니스 ♦ ) : 10
  2. 피스 ( DenkerAffe ) : 16
  3. MATL ( 돈 뮤 즐리 ) : 21
  4. 펄 ( 톤 호스 ) : 42
  5. 하스켈 ( 다미 엔 ) : 64
  6. 자바 스크립트 ES6 ( edc65 ) : 71
  7. 매스 매 티카 ( 머피 ) : 74
  8. Mathematica ( LegionMammal978 ) 및 Haskell ( Renzeee ) : 77
  9. 파이썬 2 ( mathmandan ) : 111
  10. 파이썬 3 ( Erwan ) : 161
  11. 자바 8 ( 블루 ) : 229
  12. Oracle SQL 11.2 ( Jeto ) : 456
  13. Befunge '93 ( Lex ) : 490

더 많은 테스트 사례가 감사하겠습니다.
— Mego

입력은 최대 4 자리입니까?
— Denker

7
사이클에 도달했지만 사이클주기가 1이 아니거나 입력 번호가 사이클의 일부가 아닌 경우 어떻게해야합니까?
— feersum

1
"타당성 영역에는 존재하지 않을 것"이라고 말했다. 우리는 그것이 결코 일어나지 않을 것이라고 생각할 수 있습니까? 즉,주기> 1의주기에 도달하면 루프가 영원히 계속되도록 허용합니까?
— Stewie Griffin

6
테스트 케이스를 제안 : 1100과 -42(가) 테스트 케이스에 표시되지 않는 경우는 에지의 경우 약 미스 규칙 쉽습니다.
— Dennis

답변:


4

젤리, 15 14 12 10 바이트

Ds2*/€Pµ³¡

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

작동 원리

Ds2*/€Pµ³¡  Main link. Argument: n

D           Convert n into the array of its decimal digits.
 s2         Split into pairs of digits.
   */€      Reduce each pair by exponentiation.
      P     Take the product of the resulting powers.
       µ    Push the preceding chain as a link, and start a new one.
        ³¡  Execute the link n times and return the last result.

이것은 단순히 반복 n시간 으로 짧아 질 수 있지만 가능한 모든 입력에 대해 작동한다는 증거는 없습니다.
— Dennis

1
당신은 어떤 합리적인 숫자를 위해 괜찮을 것입니다. 실제로 당신은 16 번의 반복을 사용 하는 어떤 숫자 라도 거의 괜찮습니다 : oeis.org/A133503
— Ton Hospel

@Dennis Hm, 이것이 제 대답에서하는 것입니다
— Luis Mendo

1
@DonMuesli 그리고 지금 그것에 대해 생각해 보았을 것입니다. 0과 홀수 지수를 얻는 확률은 압도적입니다 ...
— Dennis

현대의 젤리에서 이것은 7 바이트로 이루어질 수 있습니다 :D*2/Pµ¡
— Dennis

5

하스켈, 67 64 바이트

(>> = (==)) >> = until $ p.show 는 정수를 입력으로 받아 파워 트레인을 반환하는 명명되지 않은 함수입니다.

Zgarb 덕분에 3 바이트 절약

p(x:y:r)=p[x]^p[y]*p r;p[]=1;p x=read x
(>>=(==))>>=until$p.show

1
((==)=<<g)에 2 바이트를 절약합니다 (\n->g n==n).
— Zgarb

와우, 나는 Monad의 ((->) r) 인스턴스에 익숙하지 않습니다. 트릭 주셔서 감사합니다.
— Damien

이 구두점 표시는 (>>=(==))>>=실제로 기차처럼 보입니다!
— Andreï Kostyrka

4

펄, 42 48 바이트

에 +2 포함 -lp( -l너무 떨어 뜨릴 수 있지만 줄 바꿈이 마음에 듭니다)

STDIN에서 입력으로 실행

perl -lp powertrain.pl <<< 1234

powertrain.pl:

s/\B/1&pos?"**":"*"/eg until++$.>($_=eval)

(오래된 perls에서는 정규 표현식과 사이에 공백을 넣을 수도 있습니다)

이것은 고정 소수점을 처리 할 수 24547284284866560000000000는 없지만 그 시간이 지나면 perl이 지수 표기법으로 전환 되었기 때문에 큰 값은 작동하지 않습니다.

위의 버전은 실제로 2592perl이 지수 표기법을 사용하지 않고 나타낼 수있는 모든 숫자에 대해 (최대 루프에서) 빠르게 작동합니다 ( 2592와 https 사이에 고정 소수점이 없다는 것이 입증되었으므로 24547284284866560000000000( https://oeis.org/A135385 )

그러나 이것은 아직 입증되지 않은 것으로 가정합니다. 원칙적 으로 값이 아래로 떨어지고 (그러나 위 ) 올라가는 X=10^7단계 보다 더 많은 감소가있을 수 있습니다 (고정되지 않은 점은 16 단계를 넘지 않아야합니다 ( https://oeis.org/A133503 )). 다시. 그럴 경우에는 다음으로 넘어 가야합니다.X10^7

s/\B/1&pos?"**":"*"/eg until$s{$_=eval}++||/-/

설명

코드 는 숫자 사이 에 **및 *(대체) 하여 작동합니다.

s/\B/1&pos?"**":"*"/eg

그래서 2592하게 2**5*9**2및 12345된다 1**2*3**4*5. 이것들은 다음과 같이 평가 할 수있는 유효한 펄 표현식입니다

$_ = eval

( 0**0인 1펄). 그런 다음 카운터를 사용하여 루프를 끝내십시오. 고정 점을 제외하고 값이 매우 빠르게 내려 가기 때문에 파워 트레인 시리즈는 카운터가 실제로 이동하기 전에 수렴합니다.


3

Pyth, 25 18 11 16 바이트

?<Q0Qu*F^McjGT2Q

여기 사용해보십시오!

@Jakube의 도움으로 7 14 바이트 저장

설명

? <Q0Qu * F ^ McjGT2Q # Q = 평가 (입력)

? <Q0Q # 입력이 음수이면 Q
     u Q # 사이클에 도달 할 때까지 다음 기능을 적용합니다               
                   # 시작 값은 Q이고 현재 값은 G입니다
           jGT # 입력을 숫자 목록으로 분할
          c 2 # 2의 쌍으로 분할
        ^ M # 모든 쌍의 검정력을 계산합니다
      * F # 모든 거듭 제곱의 곱을 계산합니다


1
Pyth는 기본적으로 사소한 변경을 제외하고는 골프 버전의 Python입니까?
— clismique

1
@Jakube 힌트를 주셔서 감사합니다! :) 아직도 아침 일찍 나를 위해 ...
— Denker

@DerpfacePython Yea, 다소. 그것에 대해 배우고 싶다면 문서를 살펴보십시오 .
— Denker

문제 없어. ;-)
— Jakube

4
@DerpfacePython Pyth는 "단축 된 Python"으로 시작했지만 지금은 불분명합니다. Pyth는 Python과 크게 다릅니다.
— Mego

3

파이썬 2, 111 바이트

def p(n,b=0,o=''):
 if n<1:return n
 for c in str(n):o+=c+'**'[b:];b=~b
 j=eval(o+'1');return p(j)if j-n else j

아이디어의 숫자가 문자열을 확인하는 것입니다 n사이의 대체 작업으로 분리 *하고 **, 다음 eval문자열이 있습니다. (다른 솔루션도 같은 아이디어를 사용합니다 (예 : Ton Hospel 's Perl answer ) 참조)

따라서, 동작은 다시 전환 전후 사이 '**'[0:]인 **및 '**'[-1:]막 인 *.

그러나 for-loop 의 끝 에서 문자열은 연산 (하나 또는 다른 것)으로 끝나므로 문자열을 이해하기 위해 마지막 연산을 삭제하거나 다른 숫자를 추가해야합니다.

운 좋게 1끝에 끝에 추가하면 어떤 작업이 마지막에 관계없이 작동합니다. (원하는 경우 1곱셈과 지수에 대한 오른쪽의 일방적 인 정체성입니다. 이것을 말하는 또 다른 방법은 powertrain(n) == powertrain(10*n + 1)모두 를 위한 것 n>0입니다.)

마지막으로, 결과가 eval입력과 동일한 경우 (길이 1주기 에서와 같이 ) 기능이 종료됩니다. 그렇지 않으면 함수가 결과를 호출합니다. (길이가 길면 영원히 멈추지 > 1만 OP의 의견에 따르면 그러한주기가 없다고 가정 할 수 있습니다.)

(참고 : 위의 설명은 한 자릿수 입력 n이 완료되어- 사이클 n**1이 발생 하기 때문에 한 자릿수 양의 정수 에 적용됩니다 1. 그러나 우리는 또한 양수가 아닌 입력도 허용해야합니다. 입력이보다 작 으면 단락을 시작합니다 1. 입력이 음이 아닌 것으로 보장되면 해당 라인을 제거하고 17 바이트를 절약 할 수 있습니다.)


이것은 편견처럼 들리지만 ... Python 2이기 때문에 공감합니다. 그리고 그것은 설명이 있습니다.
— clismique

@DerpfacePython 감사합니다! (이것은 파이썬 3에서도 잘 작동 할 것 같습니다 ...)
— mathmandan

3

자바 (8), 265 (244) 229 바이트

이것이 나의 첫 번째 대답이지만, 나는이 사이트를 잠시 동안 읽었으며 내가하고있는 일을 알고 있다고 생각합니다. 적어도 그것은 befunge와 SQL을 능가합니다 ...

불행히도 다른 답변과 마찬가지로이 정수는 큰 정수를 얻을 수있는 방법에 대한 내장 제한으로 인해 24547284284866560000000000에서 작동하지 않습니다.

@JackAmmo 덕분에 36 바이트 절약

public int p(int n){if(n<10)return n;int i=1,t=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){int a=(int)Math.pow(10,i);r[s-i++]=n%a/(a/10);}for(i=0;i<s-1;i++)t*=Math.pow(r[i],r[++i]);if(s%2==1)t*=r[s-1];return n==t?n:p(t);}

풀리지 않은 설명

public int powertrain(int input){
    //handles negative and 1-digit cases
    if(input<10)return input;
    //initialize output variable       
    int total=1;
    // get "length" of number. Shorter than getting length of string representation
    int size=(int)Math.log10(input)+1;
    //initialize array to store digits
    int[] array=new int[size];
    //Now, because Java doesn't have support
    // for the "**" operation, and the way of turning
    // an integer into a string takes too many bytes,
    // I decided just to put every digit into an array with
    // math and iterate from there
    for(int i=1;i<=size;){
        int place=(int)Math.pow(10,i);
        //crazy math. Saved 1 byte by incrementing i when accessed
        array[size-i++]=input%place/(place/10);
    }
    for(int i=0;i<size-1;i++)
        //This is where the train happens.
        //Saved 1 byte by incrementing while accessing 
        //again, instead of i+=2 and i+1
        total*=Math.pow(array[i],array[++i]);
    //Make sure last number isn't left out if size is odd
    if(size%2==1)
        total*=array[size-1];
    //if we end up with same number, stop.
    //otherwise, keep recurring
    return input==total?input:powertrain(total);
}

첫 번째 if ... else if(n<10)return n;else{...}에서는 n <10이 false 일 때 else 블록의 모든 것이 논리적으로 만 실행되므로 else는 필요하지 않습니다. else와 2 개의 일치하는 중괄호를 제거하면 6 바이트가 절약됩니다. 마지막 if ... else와 비슷한 상황이 발생 if(n==t)return n;else return p(t);하면 else와 그 뒤에 공백을 제거하여 다른 5 바이트를 저장하십시오. 실제로 if ... else 대신에 3 인 연산자를 사용하면 훨씬 더 단축 할 수 있습니다return n==t?n:p(t);
— Jack Ammo

당신이 t, S, R을 선언하여 몇 바이트를 (17 내 생각) 저장할 수 있으며, for 루프 함께 내가있어int t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
— 잭 탄약

@ JackAmmo 변수가 그렇게 선언 될 수 있다는 것을 알지 못했지만 시도해야합니다. 당신의 도움을 주셔서 감사합니다!
— Blue

예, 하나를 사용하여 다른 것을 초기화하는 경우 (r이 s를 사용하여 길이를 정의하는 방법과 같이) 선언하는 순서에주의해야합니다.
— Jack Ammo

임의의 수의 경우 java의 BigInteger 클래스 docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html
— Jack Ammo를

2

자바 스크립트 (ES6) 71

반복이 발견되면 중지되는 재귀 함수입니다. 이것은 더 긴 루프 (2 개 이상의 값 반복)에는 작동하지 않지만 적어도 자바 스크립트 숫자 정밀도 (17 자리)의 제한된 범위에서는 발생할 수없는 것 같습니다

f=n=>[...n+'1'].map((c,i)=>i&1?r*=Math.pow(d,c):d=c,r=1)&&n-r?f(r):n

테스트

f=n=>[...n+'1'].map((c,i)=>i&1?r*=Math.pow(d,c):d=c,r=1)&&n-r?f(r):n

function go()
{
  v=+I.value
  R.textContent=f(v)
}  

go()
<input id=I value="1234"><button onclick="go()">Go</button>
<span id=R></span>


그 니스 +'1'일석이조입니다!
— Neil

나는 당신이 이미 그것을 조사했는지 알지 못하지만 내가 할 수있는 최선 replace은 1 바이트 더 길었습니다 :f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
— Neil

@Neil 나도 열심히 노력했지만 그 템플릿 문자열은 새로운 아이디어입니다.
— edc65

1

수학, 77 바이트

Times@@(If[#2<1,1,#^#2]&)@@@Partition[IntegerDigits@#,2,2,1,1]&~FixedPoint~#&

익명의 기능. 너무 복잡하지 않습니다.


그럼에도 불구하고 여전히 설명을 할 수 있습니까?
— clismique

1

비 펀지 (720) 490 바이트

절대 나에게 가능성을 말하지 말고 한 번 더 저항하지 못했습니다 . 그래서 이전의 "ASCII-fier"를 최적화했습니다. 이 경우 명령 포인터가 숫자를 읽도록 지시하지 않아도되므로 사람이 읽을 수 있도록 노력하지 않았습니다. 자 이제 더 많은 디지타이저입니다.

다시 한 번 설명을 원한다면 의견으로 알려주세요. 유용한 설명을 만들어 보겠습니다. 코드를 복사 하여 인터프리터에 붙여 넣을 수 있습니다 . 예제 24547284284866560000000000이 0을 출력한다는 것을 알았지 만 최종 단계에서 올바른 값이 저장되어 있음을 분명히 알 수 있으므로 그리드의 한 지점에서 큰 값을 얻는 데 문제가있는 것 같습니다.

v                                                    //top row is used for "variables"
>&:0`#v_.@                                           //initialize the counter                          
v     <                           g01_v#-p01:  <     //on our way back to the digitifier, check if we're done
>::>210p>55+%:10g0p-55+/:v            >10g.@         //digitifier, creates a series of ASCII characters at the top line, one for each digit in the source
        ^p01+1g01    _v#:<
v1$$                  <                              //forget some remainders of the digitifier, put 1 on the stack as a base of calculation
                      v p0-1g01-1g0-1g01*g0g01<      //taking powers of each pair of digit
>10g2-!#v_10g1-!#v_  1>                10g1-0g|
^                                  p01-2g01  *<
        >10g0g*  >                             ^     //extra multiplication with last digit if the number of digits was odd

이 버전은 음수 입력도 지원합니다. 내가 직접 말하면 이전 버전에서 크게 개선되었습니다. 최소 1 개의 버그가 수정되었으며 크기가 크게 줄었습니다.


음수를 입력하는 데 몇 바이트가 더 필요합니까?
— clismique

나는 정직하지 않다. 음수에 문제가 있었고 그리드 어딘가에 썼습니다. 다시 시도하겠습니다.
— rael_kid

방금 다른 버그도 발견했습니다. 음수에 대한 지원을 추가했습니다. 곧 업데이트를 게시하겠습니다! 전체 그리드를 계산하기 때문에 아마도 같은 양의 바이트 일 것입니다.
— rael_kid

1

하스켈, 100 79 77 바이트

g x|x==h x=x|1<2=g$h x;h=i.map(read.(:[])).show;i[]=1;i[a]=a;i(a:b:c)=a^b*i c

골프하지 않음 :

g x|x==h x=x|1<2=g$h x
h=i.map(read.(:[])).show
i[]=1
i[a]=a
i(a:b:c)=a^b*i c

이 함수는 입력을 숫자로 나누고를 통해 트릭을 수행 i합니다.

편집 : 몇 가지 팁을 주셔서 감사합니다.


몇 가지 팁 : A) i(a:[])=a이며 i[a]=a, B)에 대한 필요 max 1때문에 0^0 = 1하스켈, C) 대신에 (:[])와 pured를,)를 이동 let내에서 g별도의 함수로와 교체 if ... then ... else가드 :h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
— nimi

purePrelude에는 없지만 나머지 팁은 효과가 있습니다. 나는 경비원과 함께하려고했지만 경비원 ;보다 먼저 사용 했고 작동하지 않았지만 이제는 어떻게 작동하는지 알고 있습니다.
— Renzeee

purebase-4.8.2.0과 함께 제공되는 Prelude에 있습니다. 언제 소개되었는지 모릅니다. 당신은 필요가 없습니다 ( )에를 i([a])=a.
— nimi

1

Mathematica, 74 바이트

0~f~0=f[]=1
f@n_=n
f[a_,b_,c___]:=f[c]a^b
#//.i_/;i>0:>f@@IntegerDigits@i&

설명

이 솔루션은 f숫자의 숫자를 인수로 사용하고 파워 트레인 작업의 한 번의 반복을 적용 하는 도우미 함수를 사용 합니다. 마지막 줄은 더 이상 변경되지 않을 때까지 표현식 (이 경우 순수한 함수 의 인수) 에 규칙을 적용하는 ReplaceRepeated함수 (또는 //.짧게) 를 활용하도록 만들어진 #순수한 함수입니다. 이 규칙 i_/;i>0:>f@@IntegerDigits@i은 음수가 아닌 것을 f10 진수에 적용된 함수로 대체합니다 .


2 호선이 작동하지 않음 (사용 :=)
— CalculatorFeline

설명 해주세요
— clismique

@ CatsAreFluffy 나는 라인 2에 문제가 보이지 않습니다. 그것은 나를 위해 잘 작동합니다!
— murphy

SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>, vs를 Set::write: Tag Times in 1 f[n_] is Protected. >>사용하면 두 번째 오류가 사라집니다 . :==
— CalculatorFeline

죄송합니다. 해당 오류를 재현 할 수 없습니다. 그러나 출력은 줄 바꿈이 문제의 일부라는 것을 나타냅니다. ;줄 바꿈 대신 s로 버전을 사용해보십시오 .0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
— murphy

1

MATL , 21 바이트

tt0>*:"V!UtQgv9L2#)^p

출력을 생성하는 데 몇 초가 걸릴 수 있습니다.

편집 (2016 년 7 월 30 일) : 연결된 코드는 다음 9L으로 대체 됩니다.1L 언어의 최근 변화에 적응합니다.

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

코드 효율성을 희생하면서 바이트 수를 줄이기 위해 다음 두 가지 트릭을 사용합니다.

  • n주기가 발견 될 때까지 기다리지 않고 시간을 반복하십시오 . 이것은 OP의 의견에 따라 허용됩니다.
  • 홀수 자릿수의 1경우 최종 전력 작업을 완료하려면 최종 전력을 추가해야합니다. 그 대신에1 된 숫자는 자릿수입니다. 이렇게하면 짝수가 보장되므로 모든 전원 작업을 수행 할 수 있습니다 (마지막 1^1작업 이 불필요한 작업 인 경우에도 ).

암호:

t         % implicitly take input x. Duplicate
t0>*      % duplicate. Is it greater than 0? Multiply. This gives 0 if input is negative,
          % or leaves the input unchanged otherwise
:         % Generate array [1,2,...,x]
"         % for each (repeat x times)
  V       %   convert x to string
  !       %   transpose into column char array
  U       %   convert each char into number
  tQg     %   duplicate. Add 1 so that no entry is zero. Convert to logical: gives ones
  v       %   concatenate vertically
  9L2#)   %   separate odd-indexed and even-indexed entries
  ^       %   element-wise power
  p       %   product of all entries
          % implicitly end for each
          % implicitly display

어 .. 허허 .. 내가 "숫자 루프"라고 말했을 때, 나는 이런 식으로 숫자를 의미했습니다 a, b, a, b. 한 항이 반복되면 해당 숫자를 출력해야합니다. 확실하지 않은 경우 죄송합니다.
— clismique

한 용어가 반복되면 해당 숫자를 출력합니다. 많은 반복 후 결과를 출력했습니다
— Luis Mendo

아, 이제 이해합니다 ... 그냥 묻는 질문은 몇 번입니까 (약)? 내가 입력하면2592 입력에, 그것은 아주 잠시 동안 출력 아무것도하지 않는 것 같습니다.
— clismique

반복 횟수는 입력 번호이므로이 경우 2592입니다. 네, 시간이 좀 걸립니다
— Luis Mendo

0

Python 3, 169161 바이트

def f(s):
 o=[['1',s]['-'in s]]
 while s not in o:
  o+=[s];s+='1'*(len(s)%2==1);r=1;
  for i,j in zip(s[::2],s[1::2]):r*=int(i)**int(j);s=str(r);
 return o[-1]

금잔화

def f(s):
 o=[['1',s]['-'in s]]
 while s not in o:
  o+=[s]
  s+='1'*(len(s)%2==1)
  r=1
  for i,j in zip(s[::2],s[1::2]):
   r*=int(i)**int(j)
  s=str(r)
 return o[-1]

결과

>>> [f(i) for i in ['135', '1234', '642', '2592', '-15']]
['5', '8', '2592', '2592', '-15']

@PeterTaylor 수정되었습니다!
— Erwan

;이 방법으로 공백을 줄이면 여러 줄을 한 줄에 넣을 수 있습니다 . 또한 for 루프의 본문을 같은 줄에 넣을 수 있습니다.
— Denker

추천 골프 :def f(s,o=[['1',s]["-"in s]],n=int): while s not in o: o+=[s];s+=1*(len(s)%2<1);r=1 for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j) s=str(r) return o[-1]
— CalculatorFeline

@CatsAreFluffy o=[['1',s]["-"in s]]기본 인수에서 작동하지 않습니다 's not defined'오류가 발생합니다
— Erwan

죄송합니다, 다음 줄로 이동하십시오.
— CalculatorFeline

0

Oracle SQL 11.2, 456 바이트

WITH v(n,c,i,f,t)AS(SELECT:1+0,CEIL(LENGTH(:1)/2),1,'1',0 FROM DUAL UNION ALL SELECT DECODE(SIGN(c-i+1),-1,t,n),DECODE(SIGN(c-i+1),-1,CEIL(LENGTH(t)/2),c),DECODE(SIGN(c-i+1),-1,1,i+1),DECODE(SIGN(c-i+1),-1,'1',RTRIM(f||'*'||NVL(POWER(SUBSTR(n,i*2-1,1),SUBSTR(n,i*2,1)),SUBSTR(n,i*2-1,1)),'*')),DECODE(SIGN(c-i+1),-1,0,TO_NUMBER(column_value))FROM v,XMLTABLE(f)WHERE i<=c+2 AND:1>9)CYCLE n,c,i,f,t SET s TO 1 DEFAULT 0SELECT NVL(SUM(n),:1) FROM v WHERE s=1;

언 골프

WITH v(n,c,i,f,t) AS
(
  SELECT :1+0,CEIL(LENGTH(:1)/2),1,'1',0 FROM DUAL
  UNION ALL
  SELECT DECODE(SIGN(c-i+1),-1,t,n),
         DECODE(SIGN(c-i+1),-1,CEIL(LENGTH(t)/2),c),
         DECODE(SIGN(c-i+1),-1,1,i+1),
         DECODE(SIGN(c-i+1),-1,'1',RTRIM(f||'*'||NVL(POWER(SUBSTR(n,i*2-1,1),SUBSTR(n,i*2,1)),SUBSTR(n,i*2-1,1)),'*')),
         DECODE(SIGN(c-i+1),-1,0,TO_NUMBER(column_value))
  FROM v,XMLTABLE(f) WHERE i<=c+2 AND :1>9 
)  
CYCLE n,c,i,f,t SET s TO 1 DEFAULT 0
SELECT NVL(SUM(n),:1) FROM v WHERE s=1;

v는 재귀 뷰이며 매개 변수는

n : 2 자리 숫자로 나눌 숫자

c : 2 자리수

i : 계산할 현재 2 자리 부분

f : *를 분리 자로 사용하여 전력을 연결하는 문자열

t : f의 평가

DECODE는 다음 숫자로 전환되어 현재 숫자의 모든 부분이 완료되면 분할하고 계산합니다.

XMLTABLE (f)는 표현식을 평가하여 의사 열 "column_value"에 결과를 넣습니다. http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.html 의 골프 버전입니다.

CYCLE은주기 감지시 Oracle 빌드이며 종료 조건으로 사용됩니다.

: 1 <10의 결과는 : 1이고 v는 이러한 경우 행을 리턴하지 않으므로 SUM은 NULL을 값으로 사용하여 행을 강제 실행합니다. 행이 null 인 경우 NVL은 결과로 : 1을 반환합니다.


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