'^'를 사용하지 않고 과다 지수화 / 부정법 구현


28

도전

구현 테트 레이션 문자의 최소 금액 (일명 파워 타워 또는 Hyperexponentiation을).

조항들

  • '전력'운영자 또는 그 등가물 (예를 사용하지 않는 pow(x,y), x^y, x**y등)
  • 다음과 같이 입력 : x y(공백으로 구분)
  • x자체적으로 y시간 이 지수화됩니다 .
  • 귀하의 분석법은 최소한 계산할 수 있어야합니다 4 3(4 스스로 3 회 지수화)

득점

  • 최저 점수 당첨 : (문자 수)
  • 곱셈 연산자를 사용하지 않는 경우 보너스 공제 (-5 포인트).
  • 속도 / 메모리 요구 사항 없음. 당신이 원하는만큼 오래 걸릴.

x, 0 -> 1

2, 2 -> 2^2 = 4

2, 4 -> 2^(2^(2^2)) = 65536

4, 3 -> 4^(4^4) = 4^256 = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096

제안 / 변경 / 질문에 개방


4
내가 상당히 중요하다고 생각하는 한 가지 대안은 "* 연산자"를 "곱하기 연산자"로 바꾸는 것입니다. GolfScript *에서 일부 상황에서는 곱셈이지만 간단한 반복 연산자이기도합니다 . {block}N*C 스타일과 같습니다 for(i=0;i<N;i++){block}. 까다로운 가장자리의 경우 문자열 / 배열 곱셈 ( 'a'3*제공 'aaa')이지만 4***3요소 배열이 RAM을 오버플로 한다는 점에서 문제가되지는 않습니다 .
피터 테일러

3
또한 엣지 케이스 x 0=> 1에 대한 테스트를 추가 할 가치가 있습니다 . 내 원래 솔루션은 그 경우를 처리하지 못했습니다.
피터 테일러

3
곱셈 사용에 대한 형벌이 너무 낮습니다. (: = 보너스를 사용하지 않은 경우). 나는 그것을 사용하지 않는 솔루션을 만들었고 스택 오버플로를 피하기 위해 교체해야했으며 5 문자 보너스 손실로 7 문자로 승리했습니다.
사용자가 알 수 없음

2
@EngineerToast 당신이 연결 한 골프 4 년 전에이 골프를 게시했습니다 ...
MrZander

2
조건과 점수는 이상합니다. 전력 사용을 허용하지 않습니까? 아니면 허용하지만 +10 포인트 보너스입니까?
Simply Beautiful Art

답변:


16

J, 점수는 7 점 (12 자-곱셈을 피하기 위해 5 점)

+/@$/@$~/@$~

용법:

   4 +/@$/@$~/@$~ 3
1.34078e154
t=.+/@$/@$~/@$~  NB. define a function
   4 t 3
1.34078e154
   2 t 2
4

중첩 된 주름이 거의 없습니다.

  • 곱셈을 사용하면 */@$~/@$~
  • 전원을 사용 하면 배열을 생성하는 ^/@$~위치 $~/폴드 기능입니다.

잘 했어요 (pad)
Gareth

@Gareth 감사하지만 pad여기서 의미 했습니까? 죄송합니다. 영어는 모국어가 아닙니다.
defhlt

5
내 메시지가 너무 짧아서 채웠습니다. :-)
Gareth

@$~공동으로 하나 더 제공하면 회개를받을 수 있습니까?
요나

@Jonah 당신은 필요 /하지만 그렇습니다. 중첩 된 접기 기능보다 필요한만큼 여러 번 접기 만하면됩니다.
HyperNeutrino

15

하스켈, 87 85-5 == 80 82

import Data.List
t x=genericLength.(iterate(sequence.map(const$replicate x[]))[[]]!!)

지수화, 곱셈 또는 덧셈 (!)을 사용하지 않고 목록 작업 만 수행합니다. 데모:

Prelude> :m +Data.List
Prelude Data.List> let t x=genericLength.(iterate(sequence.map(const$replicate x[]))[[]]!!)
Prelude Data.List> t 2 2
4
Prelude Data.List> t 2 4
65536
Prelude Data.List> t 4 3

... 음
... 당신은 성능이나 메모리에 대해 아무 말도하지 않았습니까? 그러나 충분한 수십억 년과 몇 페타 바이트의 RAM이 주어지면 여전히 올바른 결과를 얻을 수 있습니다 (genericLength는 목록의 길이를 계산하기 위해 bigInt를 사용할 수 있습니다).


1
나는 당신이 3012 년까지 저에게 대답 할 것이라고 믿습니까? ;)
MrZander

6
무어의 법칙에서 도움이 필요하지만 그럴 수도 있습니다.
반 시계 회전 중지

12

GolfScript, 15 18 자

~])*1\+{[]+*{*}*}*

예, *s 중 하나는 곱셈 연산자 (운동 : 어느 것입니까?)이므로 5 문자 보너스를받을 수 없습니다. 여전히 Peter의 솔루션 보다 조금 짧습니다 .

이 초기 15 문자 버전은 달리 동일하지만 두 번째 인수가 0 일 때 출력을 생성하지 않습니다. 버그를 발견 한 res 덕분입니다.

~])*{[]+*{*}*}*

이로 인해 치명적인 오류가 발생합니다 (예 :) "2 3" ~])*{[]+*{*}*}*.
res

@res, 그것은 나를 위해 정답을 만들어냅니다.
피터 테일러

@res : 스택에 입력 외에 다른 것은 없다고 가정합니다. 예제와 같이 입력을 인라인으로 제공하려면 먼저 ;인터프리터가 시작시 스택에 넣는 실제 입력 문자열을 제거하는 데 사용 하십시오. 아니면 그냥 앞에 추가 [코드에 : 모두 ;"2 3" ~])*{[]+*{*}*}*"2 3" [~])*{[]+*{*}*}*잘 작동을 나를 위해.
Ilmari Karonen

(+1) 감사합니다! 이러한 변형은 효과가 있으며 나를 위해 미스터리를 해결합니다. 이 튜토리얼 에서는 "입력을 파이프 할 필요 는 없지만 입력하지 않으면 입력을 요구하지 않고 입력이 없다고 가정합니다 ." 그래서 나는 ruby golfscript.rb my_script.gs스크립트가 실행되기 전에 스택에 무언가 ( "")가 생기는 것을 알지 못하고 명령 줄 에서만 사용 했습니다. 때로는 작동하지 않습니다. (와 함께 echo 2 3 | ruby golfscript.rb my_script.gs프로그램 제공된대로 작동합니다.)
res


10

J, 16 19 12 자

*/@$~/1,~$~/

또는 동사 (17 자)로 :

h=:[:*/@$~/1,~$~/

용법:

   h 2 4
65536

또는 키보드에서 입력 ( 24 27 20 자) :

*/@$~/1,~$~/".1!:1]1

바보 를 지적 해 준 FUZxxl 에게 감사드립니다 . :-)

설명:

J는 오른쪽에서 왼쪽으로 읽으므로 다음을 사용하십시오 2 4.

/$~목록의 각 항목 쌍 사이 에 동사를 삽입하는 데 사용됩니다 . $~왼쪽 항목을 가져 와서 $오른쪽 항목을 사용하여 모양을 지정합니다 ( ~역 인수를 반대로 함)-이것은 4 개의 항목 4 $ 22s 목록을 제공하는 것과 같습니다 2 2 2 2.

이제리스트에 1을 추가 1,~한 다음 같은 일을 다시 수행합니다. 목록의 각 항목 쌍 사이 /에 동사 */@$~를 삽입 하십시오. 이 동사는 같은 방식으로 시작 $~하지만 이번에 는 새로 생성 된 목록의 각 항목 사이 /에을 삽입 *합니다. 은 @단지 확인합니다 그 */@$~하나의 동사 대신에이 같은 작품. 이것에 2만큼 충분한 시간을 곱할 수 있습니다 2^4.

J의 어휘 페이지 -때로는 재미있는 일이 있기 때문에 J 재미 문제를 해결하는 것을 발견했습니다.

*연산자 를 제거하기 위해 반복을 하나 더 추가하면 두 가지 문제가 있습니다.

  • +/@$~/,@$~/1,~$~/-5 보너스로도 너무 긴 17 자 ( )로 나옵니다.
  • 숫자가 너무 커지면 메모리가 부족하여 계산할 수없는 요구 사항을 충족하지 못합니다 4 3

설명해 주시겠습니까? 이것은 흥미로워 보인다.
MrZander

@ MrZander 설명을 추가하기 위해 답변을 편집했습니다.
Gareth

더 나은 이해 또는 혼란이 있는지 확실하지 않지만 하하에게 감사드립니다.
MrZander

설명은 모든 것이 사 분류가 아닌 지수화를하고 있음을 의미합니다. 우리 중 어느 것이 빠진 것이 있습니까?
피터 테일러

@PeterTaylor 설명이 명확하지 않은 것 같습니다. 그것이 정션을하고 있다면 방금 ^/]$[목록을 만들고 2 2 2 2지수 연산자를 고정시키는 것을 사용했을 것입니다. 이것이하는 일은 한 단계 더 나아가 반복 곱셈으로 지수를 수행하는 것입니다.
Gareth

8

GolfScript (24 자-5 = 19 점)

~\1{1{0{+}?}?}{@\+@*}:?~

엄청 느립니다.

(또는 20 자)

~\1{1{*}?}{@\+@*}:?~

훨씬 빠릅니다.


2
GolfScript는 Ruby 프로그램이므로 ideone :) ideone.com/GTIfP 에서 테스트 할 수 있습니다 . 또한 골프 스크립트에 대한 지원을 추가 할 것을 제안하는 아이디어를 이메일로 보냈습니다.
mellamokb

@mellamokb, 추가하면 좋을지 모르겠지만, 언급 된 정책은 배포판에서 지원되는 언어를 추가하는 것이므로 너무 낙관적이지는 않습니다.
피터 테일러

나는 그것을 읽었지만 ... 루비를 지원하기 때문에 GolfScript는 루비 프로그램 일뿐입니다. :) 매개 변수를 전달하는 bash 스크립트를 작성하십시오.
mellamokb


6

파이썬, 70

이것은 중첩 된 eval호출을 사용하여 결국 "a*a*a*a...*a"평가 되는 문자열 을 생성합니다 . 점수의 거의 절반은 인수를 얻는 데 낭비됩니다 ...하지만 다른 몇 가지 솔루션은 그 점을 귀찮게하지 않습니다.

a,b=map(int,raw_input().split())
exec"eval('*'.join('a'*"*b+'1'+'))'*b

인수가 쉼표로 구분되어 있다고 가정하면 Cheersinput()eval(raw_input())
st0le

1
@ st0le, 질문을 읽으십시오
boothby

좋은데 두 번째 줄은 더욱 golfed 할 수 있습니다 : exec"eval('a*'*"*b+'1'+"+'1')"*b
flornquake

@flornquake 좋은 캐치! 감사!
boothby

4

스칼라 : 110

type B=BigInt
def r(a:B,b:B,f:(B,B)=>B):B=if(b>1)f(a,r(a,b-1,f))else a
def h(a:B,b:B)=r(a,b,r(_,_,r(_,_,(_+_))))

언 골프 :

type B=BigInt
def recursive (a:B, b:B, f:(B,B)=>B): B = 
  if (b>1) f (a, recursive (a, b-1, f)) 
  else a
recursive (2, 3, recursive (_, _, recursive (_, _, (_ + _))))

설명:

type B=BigInt
def p (a:B, b:B):B = a+b
def m (a:B, b:B):B = if (b>1) p (a, m (a, b-1)) else a
def h (a:B, b:B):B = if (b>1) m (a, h (a, b-1)) else a
def t (a:B, b:B):B = if (b>1) h (a, t (a, b-1)) else a

더하기, mul, high (: = pow), tetration은 모두 같은 방식으로 작동합니다. 공통 패턴은 재귀 적 방법으로 추출 될 수 있으며 두 가지 BigInts와 기본 기능이 필요합니다.

def r (a:B, b:B, f:(B,B)=>B):B = 
  if (b>1) f(a, r(a, b-1, f)) else a
r (4, 3, r (_,_, r(_,_, (_+_))))

밑줄은이 순서에서 호출되는 항목의 자리 표시 자입니다 (예 : 더하기 plus (a, b) = (a + b); 따라서 ( + )는 두 개의 인수를 사용하여 추가하는 함수입니다 (a + b).

불행히도 스택 크기에 문제가 있습니다. 4의 작은 값 (예 : 2) 또는 한 단계의 깊이를 줄이면 작동합니다.

def h(a:B,b:B)=r(a,b,r(_,_,(_*_))) // size -7, penalty + 5
def h(a:B,b:B)=r(a,b,r(_,_,r(_,_,(_+_)))) 

원래 코드는 112 자이며 유효한 경우 점수가 107입니다. 스택을 늘리는 방법을 찾을 수 있습니다.

확장 된 알고리즘은 tailrecursive 호출로 변환 될 수 있습니다.

type B=BigInt
def p(a:B,b:B):B=a+b
import annotation._
@tailrec
def m(a:B,b:B,c:B=0):B=if(b>0)m(a,b-1,p(a,c))else c
@tailrec
def h(a:B,b:B,c:B=1):B=if(b>0)h(a,b-1,m(a,c))else c
@tailrec
def t(a:B,b:B,c:B=1):B=if(b>0)t(a,b-1,h(a,c))else c

tailrecursive 호출은 원래 방법보다 길지만 긴 버전에서는 스택 오버플로를 발생시키지 않았지만 적절한 시간 내에 결과를 얻지 못합니다. t (2,4)는 괜찮지 만 5 분 후에 이미 t (3,3)이 중지되었습니다. 그러나 매우 우아하지 않습니까?

// 124 = 119-5 bonus
type B=BigInt
def r(a:B,b:B,c:B,f:(B,B)=>B):B=if(b>0)r(a,b-1,f(a,c),f)else c
def t(a:B,b:B)=r(a,b,1,r(_,_,1,r(_,_,0,(_+_))))

그리고 이제는 위와 동일합니다 : 냄새 나는 곱셈을 사용하십시오 (우리는 7 개의 문자를 저장하기 때문에 5의 보너스를 거부하면서도 이익을 얻습니다 : win = 4 문자 :)

// 115 without bonus
type B=BigInt
def r(a:B,b:B,c:B,f:(B,B)=>B):B=if(b>0)r(a,b-1,f(a,c),f)else c
def t(a:B,b:B)=r(a,b,1,r(_,_,1,(_*_)))

기도:

timed ("t(4,3)")(t(4,3)) 
t(4,3): 1
scala> t(4,3)
res89: B = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096

런타임 : 1ms


4

Br ** nfuck, 128-5 = 123 바이트

+<<+<<,<,[>[>+>>+<<<-]>[<+>-]>[>[>>+>+<<<-]>>>[<<<+>>>-]<<[>[>+>+<<-]>>[<<+>>-]<<<-]>[-]>[<<+>>-]<<<<-]>>[<<+>>-]+<[-]<<<<-]>>>.

입력은 입력으로 원하는 숫자의 코드 포인트가있는 문자 형식입니다. 출력은 동일합니다.

아래 시간이 있으면 설명이옵니다 . 지수, 곱셈 또는 덧셈을 사용하지 않으면 보너스 포인트를받을 수 있습니까?

Cell 3 (0-indexed) is the running total x.
This calculates the nth tetration of a.

+<<+<<,<,                                       Initialize tape with [n, a, 0, 1, 0, 1]
[                                               While n:
  >[>+>>+<<<-]>[<+>-]                             Copy a 3 cells to right: [n, a, 0, x, a, 1]
  >[                                              While x:
    >[>>+>+<<<-]>>>[<<<+>>>-]                       Copy a 2 cells to right: [n, a, 0, x, a, 1, a, 0]
    <<[>[>+>+<<-]>>[<<+>>-]<<<-]                    Cell 7 = prod(cell 5, cell 6)
    >[-]>[<<+>>-]<<<<-]                             Move this value to cell 5. End while.
  >>[<<+>>-]+<[-]<<<<-]                           Update x to result of exponentiation. End while.
>>>.                                            Print the result!

대한 (테스트)이 작품 x 0, 0 x, x 1, 1 x, x 2, 2 3,와 2 4. 나는 시도 3 3했지만 끝내지 않고 몇 시간 동안 (내 자바 구현에서-아마 최적은 아님) 편집했다 (편집 : @Timwi의 EsotericIDE에서 [그것은 훌륭합니다! 모두 시도해야합니다]. 운이 없습니다.) 이론적으로 이것은 특정 구현의 셀 크기까지 작동합니다.


1
"Br ** nfuck"예 "두뇌"는 매우 공격적인 단어 xD입니다. 죄송합니다
FireCubez

3

Python, 161-5 (* 연산자 없음) = 156

r=xrange
def m(x,y):
 i=0
 for n in r(y):i+=x
 return i
def e(x,y):
 i=1
 for n in r(1,y+1):i=m(i,x)
 return i
def t(x,y):
 i=1
 for n in r(y):i=e(x,i)
 return i

호출 :

t(2, 4)

1
반복 덧셈에 의한 곱셈은 실제로 평가하기에 충분히 빠릅 4***3니까?!
피터 테일러

2
@PeterTaylor 예? 그것은 나를 위해 1 초도 채 걸리지 않습니다
Blazer

와우. 동등한 GolfScript 버전에는 aaaaaaages가 필요합니다.
피터 테일러

에서와 같이, 나는 그것을 밤새도록 두었지만 여전히 끝나지 않았습니다.
피터 테일러

1
6 년 후, m기능을 다음과 같이 대체하여 바이트를 절약 할 수도 있습니다.m=lambda x,y:sum(x for _ in r(y))
Jack Brounstein

3

펄, 61 자

여기 기괴한 것이있다

sub t
{
  ($x,$y,$z)=@_;
  $y>1&&t($x,$y-1,eval$x."*$x"x($z-1||1))||$z
}

용법:

print t(2,4,1)

4
잘못된 것
ardnew

3

매스 매 티카 , 40 33

이것은 규칙을 따르지 않지만 어쨌든 가장 짧은 코드에 대한 논쟁이 아니며 누군가에게 관심이 있기를 바랍니다.

m@f_:=Fold[f,1,#2~Table~{#}]&;

m[m@Sum]

이렇게하면 "tettet"함수가 실행되지만 인수는 역순으로 제공되어야합니다. 예:

m[m@Sum][3, 4]

1340780792994259709957402499820584612747936582059239337772356144372176 4030073546976801874298166903427690031858186486050853753882811946569946 433649006084096


코드를 설명해 주시겠습니까? 아니면 숫자가 아닌 기호에 결과를 표시합니까? I 통지 Fold[g, 1, #2~Table~{#}] &[3, 4]생성 할 것이다 g[g[g[1, 4], 4], 4]예를 들어.
DavidC

@David m[Times]는을 생성합니다 Fold[Times, 1, Table[#2, {#1}]] &.이 함수는 다음과 같습니다. m[Times][5, x]---> x^5; 이 새로운 전력 함수에 동일한 방법이 사용되어 정션 함수를 생성합니다. 논리적으로 시작할 수는 Plus있지만 거의 즉시 실패합니다.
Mr.Wizard

Times를 제거하려면 다음을 시도하십시오 t[h_, n_] := Sum[h, {i, n}].. 그런 다음를 실행하십시오 m[m@t][3, 4].
DavidC

@David, 그렇습니다.하지만 Code-Golf에는 작동하지 않습니다. ;-) (BTW 작성 가능 Sum[h, n])
Mr.Wizard

점수 규칙을보십시오. 시간을 사용하지 않고 9 포인트를 저장합니다. 총점은 여전히 ​​당신보다 나쁘지 않지만 더 가까워지고 있습니다.
DavidC

3

하스켈 :  58  곱셈 유무에 관계없이 51 개의 문자.

i f x 1=x;i f x n=f$i f x$n-1
t=i(\o n->i(o n)n)(+)4

언 골프 드 :

bump op n a = iterate (op n) n !! (fromIntegral $ a-1)
tetrate = iterate bump (+) !! 3

더 짧은 정의는“범프”를 인라인하고“iterate”의 사용자 정의 버전을 정의하는 데 있습니다. 불행히도 결과는 비효율적이지만 (+) 대신 (*)로 시작하면 적절한 속도를 얻을 수 있습니다. 에서 ghci:

Prelude> let i f x 1=x;i f x n=f$i f x$n-1
(0.00 secs, 1564024 bytes)
Prelude> let t=i(\o n->i(o n)n)(*)3
(0.00 secs, 1076200 bytes)
Prelude> t 4 3
13407807929942597099574024998205846127479365820592393377723561443721764030073546
976801874298166903427690031858186486050853753882811946569946433649006084096
(0.01 secs, 1081720 bytes)

3

루비 66 59 자

def e(x,y)
r=1
(1..y).each{t=x
(2..r).each{t*=x}
r=t}
r
end

불행히도이 스크립트는 1두 번째 입력 번호가 0; 오히려 e(x,0)의 값을 반환합니다 x.
res

@ 네가 맞아. 코드를 수정했습니다. 감사!
Cristian Lupascu

2

파이썬, 112 자

숫자는 첫 번째 및 두 번째 인수 여야합니다. python this.py 4 3
**연산자는 사용되지 않습니다.
*익숙한. 을 정확히 구현하는 것은 쉽지 **않지만 5 자 이상입니다.

import sys
p=lambda y:y and x*p(y-1)or 1
t=lambda y:y>1 and p(t(y-1))or x
x,y=map(long,sys.argv[1:])
print t(y)

코드를 사용하여 4 3을 어떻게 계산합니까? 그리고 호기심이 생겼습니다 : 당신은 그런 식으로 구현하고 4 3을 계산하려고 했습니까?
사용자가 알 수 없음

@userunknown, 입력은 매개 변수 별입니다. 답변에 설명을 추가했습니다. *구현 을 추가하려고하지 않았지만 재귀 깊이가 너무 클 것으로 생각합니다 4 3.
ugoren

2

C, 117 개 (105) 99 문자

편집 : 두 기능 합병 pr일부 문자를 저장, 하나에 있습니다.
99 개의 문자 중 52 개가 실제 계산을 수행합니다 (변수 정의 포함). 다른 47은 입력 및 출력을 처리하기위한 것입니다.
BUG : 0의 거듭 제곱을 잘못 처리합니다 (예 :) 0 2. 최소 비용으로 수정해야합니다. 이것은 버그가 아니며 0 2정의되지 않은 것을 잊었습니다 .

를 성공적으로 처리 4 3하고 정확한 결과를 제공합니다. 그러나 일부 작은 숫자는 정확하지 않을 수 있습니다.
후행으로 숫자를 인쇄합니다 .000000.

x,y,z;
double R(){return--y?!z?y=R(),R(z=1):x*R():x;}
main(){
    scanf("%d%d",&x,&y);
    printf("%f\n",R());
}

나에게 (118 개) 문자 다음과 같습니다 ideone.com/9D5SU
mellamokb

4 3으로 이것을 테스트하는 것은 약 18 곳까지만 정확하고, double은 정확한 표현을 지원하기에 충분한 정밀도를 갖지 않습니다.
Sir_Lagsalot

@ Sir_Lagsalot, double은 4 ^ 256에 충분한 정밀도를 갖습니다. 유효 숫자는 하나뿐입니다.
ugoren

아 좋은 지적, 나는 바이너리로 생각하지 않았다. 실제로 정확한 값을 인쇄합니까? 내 컴퓨터에서 처음 18 자릿수 이후에 잘리지 만 시스템마다 다릅니다.
Sir_Lagsalot

@ Sir_Lagsalot : 내가 제공 한 이데 오네 링크를 참조하십시오. 정수를 인쇄합니다.
mellamokb

2

인자, 187 자

USING: eval io kernel locals math prettyprint sequences ;
IN: g
:: c ( y x o! -- v )
o 0 = [ x y * ] [ o 1 - o!
y x <repetition> 1 [ o c ] reduce ] if ;
contents eval( -- x y ) swap 2 c .

골프 전 :

USING: eval io kernel locals math prettyprint sequences ;
IN: script

! Calculate by opcode:
!   0 => x * y, multiplication
!   1 => x ^ y, exponentiation
!   2 => x ^^ y, tetration
:: calculate ( y x opcode! -- value )
    opcode 0 = [
        x y *
    ] [
        ! Decrement the opcode. Tetration is repeated exponentiation,
        ! and exponentiation is repeated multiplication.
        opcode 1 - opcode!

        ! Do right-associative reduction. The pattern is
        !   seq reverse 1 [ swap ^ ] reduce
        ! but a repetition equals its own reverse, and 'calculate'
        ! already swaps its inputs.
        y x <repetition> 1 [ opcode calculate ] reduce
    ] if ;

contents eval( -- x y )         ! Read input.
swap 2 calculate .              ! Calculate tetration. Print result.

곱셈 연산자를 제거하지 않았습니다 *. 만약 그렇게한다면, 빈 시퀀스의 합이 1이 아니라 0이라는 것을 나타내는 논리를 추가해야 할 것입니다.이 추가 논리는 -5 보너스보다 더 비쌉니다.


규칙 차단기, 124 + 10 = 134 자

USING: eval kernel math.functions prettyprint sequences ;
contents eval( -- x y ) swap <repetition> 1 [ swap ^ ] reduce .

이 프로그램의 점수는 낮지 만 지수 연산자 ^는 규칙을 위반합니다. 규칙에 "(문자 수) + (10 * (# of 'power'연산자))"가 표시되므로 +10 페널티를 적용했습니다. 그러나 규칙에는 " '파워'연산자를 사용하지 마십시오"라고 표시되어 있으므로 이러한 처벌을받는 모든 프로그램은 규칙을 위반합니다. 따라서이 134 자 프로그램은 정답이 아니므로 더 긴 187 자 프로그램을 답으로 제시해야합니다.


2

하스켈 110-5 = 105

테아 레이션 피아노 스타일. 이것은 가능한 한 가장 느린 해결책이며 경고 일뿐 아니라 추가조차도 피합니다.

data N=Z|S N
a&+Z=a
a&+S b=S$a&+b
_&*Z=Z
a&*S b=a&+(a&*b)
_&^Z=S Z
a&^S b=a&*(a&^b)
_&>Z=S Z
a&>S b=a&^(a&>b)

이것은 Peano 번호를 입력하는 인내심에 달려 있습니다 (답을 표시하지는 않습니다. 실제로 실행하려면 다음 몇 줄 (90 자)을 추가하십시오.

f 0=Z
f a=S$f$a-1
t Z=0
t(S a)=1+t a
main=interact$show.f.(\[x,y]->x&>y).map(f.read).words

2

루비, 47 46 45

t=->x,n{r=x;2.upto(n){r=([x]*r).inject :*};r}


2

루아 : 133 자, 곱셈

a,b=io.read():match"(%d+) (%d+)"a,b,ba=a+0,b+0,a for i=1,b-1 do o=1 for i=1,a do o=o+o for i=1,ba-b do o=o+o end end a=o end print(o)

원래 문자열 반복 해킹을 사용하여 가짜 곱셈을 수행하려고했지만 큰 값에서 실패하는 것을 좋아합니다. 동적 컴파일과 loadstring을 사용하여 더 작게 만들 수는 있지만 여기서 늦어지고 있습니다 ... 잠이 필요합니다.

stdin 출력에 "4 3"입력 :

1.3407807929943e+154

2

VBA, 90 자

* 아마도 곱셈 보너스가 충분하지 않을 수 있습니다. 나는 곱셈의 대답이 훨씬 흥미롭지 않다고 생각하지만 이것이 코드 골프이기 때문에 최선이 아닙니다. 이없는 답변 *과 더 나은 (짧고 더 나은 점수) 답변이 있습니다.

90 자, 전력 연산자 없음, 곱셈 = 90

Sub c(x,y)
f=IIf(y,x,1):For l=2 To y:b=x:For j=2 To f:b=b*x:Next:f=b:Next:MsgBox f
End Sub

116 자, 전력 연산자 없음, 곱셈 보너스 없음 (-5) = 111

Sub c(x,y)
f=IIf(y,x,1):For l=2 To y:b=x:For j=2 To f:For i=1 To x:a=a+b:Next:b=a:a=0:Next:f=b:Next:MsgBox f
End Sub

참고 : VBA에는 결과가 매우 클 때 (예 :) 숫자를 인쇄하는 데 문제가 4, 3있지만 올바르게 계산되므로 예를 들어 해당 숫자를 사용하려는 경우 이동하는 것이 좋습니다. 또한 BIGGER 숫자도 넘칩니다 (예 :) 3, 4.


2

펄 6 , 32 바이트

->\a,\b{(1,{[*] a xx$_}...*)[b]}

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

(1, { [*] a xx $_ } ... *)는 전력 타워를 생성하는 게으른 시퀀스이며, 각 요소 는 이전 요소와 동일한 횟수만큼 a복제 된 첫 번째 입력 매개 변수 ( xx)로 구성된 $_목록이며 그 목록은 곱셈 ( [*]) 으로 줄어 듭니다 . 그 순서에서 우리는 단순히 -th b요소 를 뽑아냅니다 .


2

람다 미적분학, 10-5

( 교회 인코딩De Bruijn indeces 사용 )
λλ(1λ13)λ1

설명

De Bruijn indeces가 없으면 : λa,b.(b λc.ca)λc.c:

λa,b.                                                 define the anonymous function f(a,b)=
     (b                                                apply the following function b times
        λc.                                                    the anonymous function g(c)=
           ca)                 apply c to a because of church encoding this is equal to a^c
              λc.c                              the identity function, 1 in church encoding

exp_a(x)=a^x이 프로그램 을 정의 하면 함수 종료를 나타내는 a↑↑b=exp_a^b(1)위치 를 정의 합니다 ^b.

이것이 실제로 내장되어 있지 않고 정수가 람다 미적분으로 인코딩되는 방식의 부작용 만 ca기술적으로 동일하기 때문에 이것이 허용되는지 확실 a^c하지 않습니다.


흠, 내가 이것을 시도 할 수 있도록 통역사가 있습니까? 언어가 구현되어 있지 않으면 여기서 언어를 사용하여 문제를 해결할 수 없습니다. 언어는 여기에서 구현을 기반으로합니다.
아웃 골퍼 에릭

1

자바 스크립트 : 116 자

function t(i){y=i.split(' ');a=y[0];b=y[1];return+b&&p(a,t(a+' '+(b-1)))||1}function p(a,b){return+b&&a*p(a,b-1)||1}

t ( '4 3') 출력 :

1.3407807929942597e+154

1

파이썬 (111) (113) 아니오 *

r=lambda x,y:(x for _ in range(y));t=lambda x,y:reduce(lambda y,x:reduce(lambda x,y:sum(r(x,y)),r(x,y)),r(x,y),1)

6 *** 3-36k 자리))

Upd : t (X, 0) = 1에 맞게 초기 값을 추가해야합니다.


36k는 얼마나 오래 걸렸습니까?
MrZander

1
인쇄를 포함하여 9.375 초
Ev_genus

1

Haskell : 곱셈이없는 88-5 자, 곱셈이있는 59 자

곱셈없이 :

h x y=foldr(\x y->foldl(\x y->foldl(+)0(replicate x y))1(replicate y x))1(replicate y x)

제가 골프를 조금 할 수있는 방법이있을 것입니다.

곱셈으로 :

h x y=foldr(\x y->foldl(*)1(replicate y x))1(replicate y x)

마지막으로 ungolfed 프로그램은 다음과 같습니다.

mult x y = foldl (+) 0 (replicate x y)
expo x y = foldl (mult) 1 (replicate y x)
h x y = foldr (expo) 1 (replicate y x)

이것은 아마도이 문제를 수행하는 가장 간단한 방법 일 것입니다. 곱셈을 반복 가산으로 반복, 지수를 반복 곱셈으로, 정션을 반복 지수로 정의하는 것입니다.


1

라켓 58 (* 없음)

(define(t x y)(if(= y 0)1(for/product([i(t x(- y 1))])x)))

for / product는 "곱셈 없음"규칙에 잘 맞습니다.
MrZander

1

일반 리스프, 85 자

(lambda(b c)(let((r b)u)(dotimes(c c r)(setf u 1 r(dotimes(c b u)(setf u(* u r)))))))

반복 덧셈을 통해 곱셈을 시도했지만 5 자 이상이었습니다. 매크로 렛의 경우와 마찬가지로 선언은 가치가 없습니다.

boothby의 python 솔루션에서 영감을 얻은 또 다른 솔루션. 위의 솔루션보다 1 문자가 적습니다.

(lambda(a b)(eval`(*,@(loop for x below b nconc(loop for x below a nconc`(,a,a))))))

1

파이썬 3 – 68

(파워 오퍼레이터의 10 점 벌금 포함)

a,b=input().split()
r=1
exec("r=%s**r;"%a*int(b))
print(r)


1

R , 71-5 = 66 바이트

function(x,y,b=x){for(i in 2:y)b=cumprod(z<-rep(x,b))[sum(z|1)];cat(b)}

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

-5를 피하기 위해 -5, 예상보다 어려웠습니다. 실제로 빠르게 폭발하고 메모리가 부족하지 않으면 작동하지 않지만 필요한 모든 기준을 충족시킵니다.

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