지수 확장


31

1보다 큰 두 개의 정수 A와 B가 주어지면 다음과 같은 순서로 네 개의 수학 표현식이 출력됩니다.

  1. 평범한 표현 A ^ B (A-거듭 제곱 B). 예를 들어 A = 2이고 B = 3이면 2^3.

  2. A의 반복 곱셈에 의한 A ^ B의 확장. 예 2*2*2.

  3. A의 반복 첨가에 대한 A ^ B의 팽창 2+2+2+2.

  4. 1의 반복 첨가에 대한 A ^ B의 팽창. 예 1+1+1+1+1+1+1+1.

네 가지 표현은 순서가 명확하고 분명한 한 합리적인 방법으로 출력 될 수 있습니다. 예를 들어, 목록에 넣거나 별도의 줄에 인쇄 할 수 있습니다

2^3
2*2*2
2+2+2+2
1+1+1+1+1+1+1+1

또는 등호로 구분 된 한 줄에 :

2^3=2*2*2=2+2+2+2=1+1+1+1+1+1+1+1

수학 연산자 옆에 공백이 삽입 될 수 있으므로

2^3 = 2 * 2 * 2 = 2 + 2 + 2 + 2 = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1

A = 2이고 B = 3 일 때 똑같이 유효한 출력이됩니다.

당신은 대안 기호를 사용할 수 있습니다 ^, *그리고 +하지만 경우에만 새로운 기호 (예를 들어, 언어에 더 관용적 있습니다 **대신 ^파이썬에서).

A와 B가 충분히 작아서 A ^ B가 언어의 기본 정수 유형을 오버플로하지 않을 것이라고 가정 할 수 있습니다 (적어도 그 유형이 최대 255 이상인 경우).

바이트 단위의 가장 짧은 코드가 이깁니다.

테스트 사례

라인 당 하나의 출력. 첫 번째 표현식이 항상 A ^ B이므로 입력을 유추 할 수 있습니다.

2^2 = 2*2 = 2+2 = 1+1+1+1
2^3 = 2*2*2 = 2+2+2+2 = 1+1+1+1+1+1+1+1
2^4 = 2*2*2*2 = 2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
2^5 = 2*2*2*2*2 = 2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^2 = 3*3 = 3+3+3 = 1+1+1+1+1+1+1+1+1
3^3 = 3*3*3 = 3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^4 = 3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^5 = 3*3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^2 = 4*4 = 4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^3 = 4*4*4 = 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
10^2 = 10*10 = 10+10+10+10+10+10+10+10+10+10 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
13^2 = 13*13 = 13+13+13+13+13+13+13+13+13+13+13+13+13 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1

@JonathanAllan 그래, 내가 본 모든 오타가있어. 좋은 작업! 당신은 아무것도 얻지 못합니다.
R. Kap

2
@JonathanAllan에게 감사를드립니다. R. Kap은 나의 모든 3 가지에 대해 걱정했습니다
Calvin 's Hobbies

글쎄, (행운 적으로) =의 왼쪽에 잘못 놓인 곳이 없었습니다 3.
R. Kap

5
다음 "크 누스가 표기 화살표를 최대의 확장"하지 마십시오
마태 복음 노무현

1
STDIN의 입력을 단일 문자열로 읽는 경우 2^3유효한 입력 형식입니까? 아니면 공백 / 쉼표 / ​​줄 바꿈으로 구분해야합니까?
Martin Ender 2012

답변:


11

파이썬 3.6 , 88 74 바이트

Dada 덕분에 -2 바이트 (사용 ~)
Erwan 덕분에 -5 바이트 (Python 3.6의 f- 문자열 사용)

lambda a,b:f"{a}^{b}={a}{f'*{a}'*~-b}={a}{f'+{a}'*~-a**~-b}=1"+"+1"*~-a**b

온라인으로 누군가를 원하십니까?

방법?

이것은 두 개의 정수 입력을 사용 a하고 b각각 이보다 큰 명명되지 않은 함수입니다 0(사양이보다 큰 것에 대해서만 1).

Python 3.6에서는 형식화 된 문자열 리터럴 또는 "f- 문자열" 과 같은 새로운 기능을 사용할 수 있습니다 . 이를 통해 런타임 평가 문자열 구성이 가능합니다. 선행 f(또는 F)은 이러한 구성을 만듭니다 ( 예 : f"blah"또는) f'blah'. f- 문자열 안에는 중괄호 쌍 사이에 {...}평가할 표현식이 있습니다.

이와 같이 f"{a}^{b}={a}{f'*{a}'*~-b}={a}{f'+{a}'*~-a**~-b}=1"평가하여 각각 a, b, a, f'*{a}'*~-b, a, 및 f'+{a}'*~-a**~-b}유지 표현과 ^, =, =,와 =1함께 연결된됩니다 모두 문자열로.

ab표현의 표현으로 평가 a하고 b각각.

f'*{a}'f'+{a}'차례로도에 평가 이러한 식 내부의 F-문자열이다 a선도로 '*'및 선도적 '+'각각

및 부분에 필요한 수 a와 작업 을 만들려면 함께 곱하고 더할 수 있습니다. 각 경우에는 s 수보다 하나 적은 운영자 부호가 필요합니다 . 우리가 F-문자열을 반복 할 수 있도록 하고 (사용 이 운영하고 각각 하나에 붙일 수만큼) . 이다 하고 있다 .*+b aa**(b-1) aaf'*{a}f'+{a}'*a(b-1)~-b(a**(b-1))-1~-a**~-b

being를 1사용 하여 s에 대해서도 동일하게 수행 되지만 상수가 있으므로 f- 문자열의 오버 헤드가 필요하지 않으므로 반복되는 표준 문자열이와 연결됩니다 .(a**b)-1~-**b1+


이전 파이썬 버전, 81 :

lambda a,b:'%s^%s=%s=%s=1'%(a,b,('*%s'%a*b)[1:],('+%s'%a*a**~-b)[1:])+'+1'*~-a**b

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


당신은 대체 할 수 없습니다 (b-1)와 함께 ~-b?
Dada

네 당신 말이 맞아요
Jonathan Allan

1
파이썬 3.6에서 f 문자열을 사용하면 5 바이트를 얻을 수 있습니다.lambda a,b:f"{a}^{b}={(f'*{a}'*b)[1:]}={(f'+{a}'*a**~-b)[1:]}=1"+'+1'*~-a**b
Erwan

@ Erwan 예, (지금) 돌아 왔을 때 f 문자열을 사용할 계획이었습니다. 커플도 더 구할 수 있습니다.
Jonathan Allan

1
올챙이 연산자를 항상 만나보십시오.
잭 Brounstein

11

Cubix, 238 234 217 151 110 100 바이트

ETHProductions 덕분에 14 바이트 절약

u'^.:s+.;;;\-?W?rsos\(rrOIO:ur>'=o;^u.;;.>$.vUo^'rsu1;;@!\q?s*su;;IOu*+qU../;(*\(s.;<..r:''uq....qu\

넓히는:

          u ' ^ . :
          s + . ; ;
          ; \ - ? W
          ? r s o s
          \ ( r r O
I O : u r > ' = o ; ^ u . ; ; . > $ . v
U o ^ ' r s u 1 ; ; @ ! \ q ? s * s u ;
; I O u * + q U . . / ; ( * \ ( s . ; <
. . r : ' ' u q . . . . q u \ . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

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

여기 사용해보십시오

설명

코드는 두 단계로 구성된 8 단계로 구성됩니다. 코드를 부분적으로 살펴 보겠습니다.

1 단계 (A ^ B)

          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
I O : u . . . . . . . . . . . . . . . .
U o ^ ' . . . . . . . . . . . . . . . .
; I O u . . . . . . / ; ( * \ . . . . .
? ? r : . . . . . . ? . . . \ ? ? ? ? ?
. . . . ? . . . . . ? . . . . . . . . .
          ? ? ? ? ?
          . . . . .
          . . . . .
          . . . . .
          . . . . .

첫 번째 단계와 관련이없는 부분이있는 큐브입니다. 물음표는 경로를보다 명확하게하기 위해 IP가 방문 할 no-ops를 표시합니다.

IO:'^o;IO:r*(; # Explanation
I              # Push the first input (A)
 O             #   output that
  :            #   duplicate it
   '^          # Push the character "^"
     o         #   output that
      ;        #   pop it from the stack
       I       # Push the second input (B)
        O      #   output that 
         :     #   duplicate
          r    #   rotate top 3 elements
           *   # Push the product of the top two elements
            (  #   decrease it by one
             ; #   pop it from the stack (making the last
               #   two operations useless, but doing it
               #   this way saves 10B)

이제 스택은 다음과 같습니다. A, B, A, B

2 단계 (인쇄 루프 준비)

인쇄 루프는 3 개의 인수 (스택 상위 3 요소) 소요 : P, QR. P반복 횟수이고 Q구분 기호 (문자 코드)이며 R반복 할 숫자입니다. 운 좋게도 루프는 결과 문자열이 R아닌로 끝나는 요구 사항을 처리합니다 Q.

우리는 A*정확한 B시간 을 반복하기를 원 하므로 구분 기호는 *입니다. 스택은로 시작합니다 A, B, A, B. 다시 한 번, 관련없는 모든 지침을 제거했습니다. IP는 S포인팅 북쪽 에서 시작합니다 .

          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . * . . . . . . . . . . . . . . .
. . . . ' . . . . . . . . . . . . . . .
. . . . S . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

'*rr # Explanation
'*   # Push * (Stack: A, B, A, B, *)
  rr # Rotate top three elements twice

스택은 이제 A, B, B, *, A입니다.

3/6/8 단계 (인쇄 루프)

개념

E . . . . .
? r s o s u 
\ ( r r O <
. . . . . S

IP는 루프를 통과하여 S북쪽을 가리키고 에서 루프를 종료하고 E북쪽을 다시 가리 킵니다. 이 설명에서는 스택이로 설정되어 [..., A, B, C]있습니다. 다음과 같은 명령이 실행됩니다. IP는 물음표 앞에 루프를 남길 수 없으므로 처음 네 개의 명령어는 항상 실행됩니다.

Orr(?rsos # Explanation
O         # Output `C`
 rr       # Rotate top three elements twice (Stack: [..., B, C, A])
   (      # Decrease A by one (Stack: [..., B, C, A-1])
    ?     # If top of stack (A) > 0:
     r    #    Rotate top of stack (Stack: [..., A-1, B, C])
      s   #    Swap top elements (Stack: [..., A-1, C, B])
       o  #    Output top of stack (B) as character code
        s #    Swap top elements (Stack: [..., A-1, B, C]
          #
          # ... and repeat ...

이행

관련성이없는 부분이 제거 된 큐브입니다. IP가에서 시작하여 S동쪽을 가리 킵니다.

          . . . . .
          . . . . .
          . . . . .
          ? r s o s
          \ ( r r O
. . . . . S ' = o ; ^ u . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

보시다시피, IP는 루프에 들어가기 전에 네 가지 명령을 거칩니다. 문자 코드가 다시 제거되었으므로이 부분에 입력 한 것과 정확히 동일한 스택으로 루프에 도달합니다.

'=o; # Explanation
'=   # Push =
  o  #     Output
   ; #     Pop from stack

루프 내부에서 위의 설명이 유지됩니다.

4 단계 (IP 차별화)

위의 루프를 여러 번 사용하고 IP 루프가 모두 같은 지점에있게되므로 여러 실행을 구분해야합니다. 먼저 구분 기호를 구분할 수 있습니다 (첫 번째 실행에는 *, 두 번째 실행에는 세 개가 +분리 자로 있음). 반복되는 수의 값을 확인하여 런 2와 3을 구별 할 수 있습니다. 이것이 하나이면 프로그램을 종료해야합니다.

첫 번째 비교

큐브에 다음과 같은 모습이 있습니다. IP는 S에서 시작하여 북쪽을 가리 킵니다. 스택에 포함되어 있습니다 [..., * or +, A or 1, 0]. 숫자 1은 IP가 첫 번째 루프 인 경우 북쪽을 가리키는 위치를 나타내고 숫자 2는 IP가 두 번째 (또는 세 번째) 루프 인 경우 동쪽을 가리키는 위치를 나타냅니다.

          u ' . . .
          s + . 1 .
          ; \ - ? 2
          S . . . .
          . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

;s'+-? # Explanation
;      # Delete top element (0)
 s     # Swap the top two elements (Stack: 1/A, */+)
  '+   # Push the character code of + 
    -  # Subtract the top two elements and push
       #  that to the stack (Stack: 1/A, */+, +, (*/+)-+)
     ? # Changes the direction based on the top
       # item on the stack. If it's 0 (if (*/+) == +)
       # the IP continues going right, otherwise, it
       # turns and continues going north.

IP가 현재이면 1스택은 [A, *, +, -1]입니다. 그렇지 않으면 스택은 [A or 1, +, +, 0]입니다. 보시다시피, 두 번째 경우의 스택에는 여전히 알려지지 않은 것이 있으므로 다른 비교를 수행해야합니다.

두 번째 비교

IP가 5 단계를 거쳤으므로 스택은 다음과 같습니다 [A^(B-1) or nothing, A or 1, +, +, 0]. 첫 번째 요소가 nothing이면 두 번째 요소는 1이고 그 반대도 마찬가지입니다. 큐브는 다음과 같습니다. IP는 S에서 시작하여 동쪽을 가리 킵니다. 이것이 두 번째 루프 인 경우 IP는 E서쪽을 가리키는로 끝납니다 . 그렇지 않으면 프로그램이에 도달하여 @종료됩니다.

          . . . . .
          . . . . ;
          . . . S W
          . . . . .
          . . . . .
. . . . . . . . . . . . . ; . . . . . .
. . . . . . . . . E @ ! \ q . . . . . .
. . . . . . . . . . . . ( * . . . . . .
. . . . . . . . . . . . q u . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

제어 흐름에 아무런 영향을 미치지 않는 실행 된 명령어는 다음과 같습니다.

;;q*q(!@
;;       # Delete top two elements (Stack [A^(B-1)/null, A/1, +])
  q      # Send top element to the bottom (Stack [+, A^(B-1)/0, A/1])
   *     # Push product of top two elements 
         #    (Stack [+, A^(B-1)/0, A/1, A^B/0])
    q    # Send top element to the bottom 
         #    (Stack [A^B/0, +, A^(B-1)/0, A/1])
     (   # Decrease the top element by 1 
         #    (Stack [A^B/0, +, A^(B-1)/0, (A-1)/0])
      !  # If (top element == 0):
       @ #  Stop program

[A^B, +, A^(B-1), A-1]프로그램이 종료되지 않은 경우 스택은 이제 입니다.

5 단계 ( "A +"준비 (반복 A ^ (B-1)))

안타깝게도 Cubix에는 전력 연산자가 없으므로 다른 루프가 필요합니다. 그러나 먼저 스택을 정리해야합니다 [B, A, *, +, -1].

청소

다시 큐브가 있습니다. 평소와 같이 IP는 S (북쪽)에서 시작하고 E에서 서쪽을 가리키고 끝납니다.

          . . . ? .
          . . . ; .
          . . . S .
          . . . . .
          . . . . .
. . . . . . . . . . . . . . . . > $ . v
. . . . . . . . . . . . . . . . . . . ;
. . . . . . . . . . . . . . . . . . E <
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

;; # Explanation
;; # Remove top 2 elements (Stack: [B, A, *])

A ^ (B-1) 계산

또 다른 루프는 인쇄 루프와 거의 동일하지만 조금 더 콤팩트합니다. IP는에서 시작 S하여 stack을 (를) 서쪽으로 가리 킵니다 [B, A, *]. E북쪽 을 가리키면 IP가 종료됩니다 .

          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
. . . . . . . . . . . . . . E . . . . .
. . . . . . . . . . . . . . ? s * s u .
. . . . . . . . . . . . . . \ ( s . ; S
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

루프 바디는 다음과 같습니다.

;s(?s*s # Explanation
;       # Pop top element.
 s      # Shift top elements.
  (     # Decrease top element by one
   ?    # If not 0:
    s   #    Shift top elements again
     *  #    Multiply
      s #    Shift back
        #
        # ... and repeat ...

결과 스택은 [A, A^(B-1), 0]입니다.

스택 청소 (다시)

이제 스택의 상단이 포함 된 인쇄 루프로 다시 이동해야합니다 [..., A^(B-1), +, A]. 이를 위해 다음을 실행합니다. 다시 큐브가 있습니다.

          . . ^ ? :
          . . . . .
          . . . . .
          . . . . .
          E . . . .
. . . . . s . . . . . . . . ; . . $ . .
. . . . . + q U . . . . . . S . . s . .
. . . . . ' u q . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
          . . ? . .
          . . ? . .
          . . ? . .
          . . ? . .
          . . ? . .

;:$sqq'+s # Explanation
;         # Delete top element (Stack: [A, A^(B-1)])
 :        # Copy top element
  $s      # No-op
    qq    # Send top two elements to the bottom
          #   (Stack: [A^(B-1), A^(B-1), A])
      '+  # Push +
          #   (Stack: [A^(B-1), A^(B-1), A, +])
        s # Swap top two elements
          #   (Stack: [A^(B-1), A^(B-1), +, A])

7 단계 (마지막 루프 준비)

스택은 이제 [A^B, +, A^(B-1), A-1]이고 IP는에서 시작하여 S서쪽으로 E가고 에서 끝납니다 .

          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
. . . . . E . . . . . . . . . . . . . .
. . . . . . u 1 ; ; S . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

실행 된 명령 :

;;1 # Explanation
;;  # Delete top two elements
  1 # Push 1

이제 스택이처럼 보이고 [A^B, +, 1]IP가 인쇄 루프에 들어 가려고합니다.


2
네, 설명해주세요, 최소한 ungolfed cube net 버전을 만드십시오
Destructible Lemon

설명을 완료했습니다
Luke

누가이 언어를 만들 었는가? 그것은 16 진수와 같지만 입방체와 같다. 누군가 3D 16 진수를 만듭니다.
Magic Octopus Urn

1
@carusocomputing 그리고 어떤 다면체가 3D 육각형일까요?
mbomb007

1
테셀 레이트 된 4 면체의 3D 구조에서 실행되는 언어를 만들 수 있습니다.
mbomb007

7

MATL , 46 바이트

XH'^'i'='XJ2G:"H'*']xJ&Gq^:"H'+']xJ&G^:"1'+']x

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

여기서 "합리적인 방법"의 한계를 늘리지 만 표현은 분리되어 있습니다.

설명

첫 표현 :

XH'^'i'='XJ

XH         % implicitly take input A, save it to clipboard H
'^'        % push literal '^'
i          % take input B
'='        % push literal '='
XJ         % copy '=' to clipboard J, we'll use this twice more so it's worth it

두 번째 표현 :

2G:"H'*']xJ

2G         % paste the second input (B) again
:"         % do the following B times
  H        % paste A from clipboard H
  '*'      % push literal '*'
]          % end loop
x          % delete the final element (at the moment we have a trailing *)
J          % paste '=' from clipboard J

세 번째 표현 :

&Gq^:"H'+']xJ

&G         % paste all of the input, ie push A and B
q          % decrement B
^          % power, giving A^(B-1)
:"         % do the following A^(B-1) times 
  H        % paste A from clipboard H
  '+'      % push literal '+'
]          % end loop
x          % delete the final element (at the moment we have a trailing +)
J          % paste '=' from clipboard J

네 번째 표현 :

&G^:"1'+']x

&G         % paste all of the input, ie push A and B
^          % power, giving A^B
:"         % do the following A^B times 
  1        % push 1
  '+'      % push '+'
]          % end loop
x          % delete the final element (at the moment we have a trailing +)
           % (implicit) convert all to string and display

6

자바 스크립트 (ES7), 78 바이트

카레 구문으로 입력을 (a)(b)받습니다. 문자열을 출력합니다.

a=>b=>a+'^'+b+(g=o=>'='+a+('+*'[+!o]+a).repeat(b-1))()+g(b=a**~-b)+g(b*=a,a=1)

테스트 사례


3

루비, 52 바이트

->a,b{[[a,b]*?^,[a]*b*?*,[a]*a**~-b*?+,[1]*a**b*?+]}

3

05AB1E , 30 바이트

mUð¹'^²J'*¹«²×'+¹«X¹÷ׄ+1X×)€¦

설명:

mU                               # Store a^b in variable X
  ð                              # Push a space character to the stack (will be deleted at the end, but this is needed to keep the character count low)
   ¹'^²J                         # Push the string "a^b" to the stack
        '*¹«                     # Push the string "*a" to the stack
            ²×                   # Repeat b times
              '+¹«               # Push the string "+a" to the stack
                  «X¹÷×          # Repeat a^b / a times
                       „+1       # Push the string "+1" to the stack
                          X×     # Repeat a^b times
                            )    # Wrap stack to array
                             €¦  # Remove the first character from each element in the array

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


¹²'^ý ¹'*¹«²<׫¹²m¹÷¹s×S'+ý 1¹²m×S'+ý», 왜 당신이 나를 5 바이트 이길 :(?
Magic Octopus Urn

1
왜냐하면 나는. : P
Okx

어떤 이유로 든 나는 당신의 대답을보고 "80 바이트"를 읽고 자신에게 "이길 쉽다"고 생각한 다음 80의 목표를 염두에두고 광산을 만들었습니다. 당신이 하하입니다.
Magic Octopus Urn

¹²«¹²×¹¹²m©¹÷×1®×)vySN"^*++"èý,더 가까이;). 당신은 지금 1 만 이기고 있습니다;).
Magic Octopus Urn

2

C (GCC) , 156 (149) 바이트

#define q for(x=0;x
x,y;p(a,b,c){printf("%c%d",x?b:61,c),x+=a;}e(n,i){x=1;p(0,0,n);p(0,94,i);y=!!i;q<i;y*=n)p(1,42,n);q<y;)p(n,43,n);q<y;)p(1,43,1);}

0의 거듭 제곱을 무시할 수 있으면 -2 바이트 ; y=!!i될 수 있습니다y=1

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


2

자바 7, 170 바이트

String c(int a,int b){String s="=",r=a+"^"+b+s+a;double i=0,x=Math.pow(a,b);for(;++i<b;r+="*"+a);r+=s+a;for(i=0;++i<x/a;r+="+"+a);r+=s+1;for(i=0;++i<x;r+="+1");return r;}

언 골프 드 :

String c(int a, int b){
  String s = "=",
         r = a+"^"+b+s+a;
  double i = 0,
         x = Math.pow(a,b);
  for(; ++i < b; r += "*"+a);
  r += s+a;
  for(i = 0; ++i < x/a; r += "+"+a);
  r += s+1;
  for(i = 0; ++i < x; r += "+1");
  return r;
}

테스트 코드 :

여기에서 시도하십시오.

class M{
  static String c(int a,int b){String s="=",r=a+"^"+b+s+a;double i=0,x=Math.pow(a,b);for(;++i<b;r+="*"+a);r+=s+a;for(i=0;++i<x/a;r+="+"+a);r+=s+1;for(i=0;++i<x;r+="+1");return r;}

  public static void main(String[] a){
    System.out.println(c(2,2));
    System.out.println(c(2,3));
    System.out.println(c(2,4));
    System.out.println(c(2,5));
    System.out.println(c(3,2));
    System.out.println(c(3,3));
    System.out.println(c(3,4));
    System.out.println(c(3,5));
    System.out.println(c(4,2));
    System.out.println(c(4,3));
    System.out.println(c(10,2));
    System.out.println(c(13,2));
  }
}

산출:

2^2=2*2=2+2=1+1+1+1
2^3=2*2*2=2+2+2+2=1+1+1+1+1+1+1+1
2^4=2*2*2*2=2+2+2+2+2+2+2+2=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
2^5=2*2*2*2*2=2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^2=3*3=3+3+3=1+1+1+1+1+1+1+1+1
3^3=3*3*3=3+3+3+3+3+3+3+3+3=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^4=3*3*3*3=3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^5=3*3*3*3*3=3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^2=4*4=4+4+4+4=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^3=4*4*4=4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
10^2=10*10=10+10+10+10+10+10+10+10+10+10=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
13^2=13*13=13+13+13+13+13+13+13+13+13+13+13+13+13=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1

1

, 38 35 34 바이트

33 바이트의 코드, -n플래그의 경우 +1

Ya**b[gJ'^aRLbJ'*aRLy/aJ'+1XyJ'+]

A와 B를 명령 행 인수로 사용합니다. 한 줄에 하나의 표현식을 인쇄합니다. 온라인으로 사용해보십시오!

설명

Ya**b설정 코드입니다 : 변수에 a**b들어가십시오 y. 그 후, 우리는 []네 개의 표현식을 포함하는 (in ) 목록을 얻습니다 :

  • gJ'^: 전체 아칸소 걸릴 g(여기에 목록이 포함 된 목록 ab) 및 J그 OIN에를^
  • aRLbJ'*: Repeat List를 사용하여의 b복사본으로 목록을 a만든 다음에 Join*
  • aRLy/aJ'+: 사용 RL과 목록 작성하는 y/a(즉, a**(b-1)의) 사본을 a한 후, J그 OIN에+
  • 1XyJ'+: 1에 문자열 곱하기 y, Joined on+

-n플래그 덕분에 목록이 줄 바꿈으로 구분 기호로 인쇄됩니다 .


1

자바 115 113 104 바이트

1 바이트 씩 골프를 치는 @Neil과 @TuukkaX와 9 바이트를 골프로 치는 @ETHproductions와 Luke에게 감사드립니다.

a=>b=>[a+'^'+b,(a+'*').repeat(b-1)+a,(a+'+').repeat(Math.pow(a,b-1)-1)+a,1+'+1'.repeat(Math.pow(a,b)-1)]

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


currying 구문을 사용할 수 있습니다 : a=>b=>.
Yytsi

왜 안돼 '=1'+'+1'.repeat?
Neil

다음을 사용하여 추가 바이트를 절약 할 수 있습니다 .join.a=>b=>[a+'^'+b,(a+'*').repeat(b-1)+a,(a+'+').repeat(Math.pow(a,b-1)-1)+a,1+'+1'.repeat(Math.pow(a,b)-1)].join`=`
ETHproductions

"네 가지 식은 순서가 명확하고 뚜렷한 한 합리적인 방식으로 출력 될 수 있습니다." 네 가지 요소로 배열을 반환하는 것도 포함 할 필요가 없습니다 .join().
Luke

1

젤리 , 29 바이트

*⁹’,¤;@
,`;1ẋ"ç
,W;çj"“^*++”Y

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

방법?

*⁹’,¤;@ - Link 1, get list lengths: a, b
    ¤   - nilad followed by link(s) as a nilad
 ⁹      - right: b
  ’     - decrement: b-1
   ,    - pair with right: [b-1, b]
*       - exponentiate: [a^(b-1), a^b]
     ;@ - concatenate with reversed arguments: [b, a^(b-1), a^b]

,`;1ẋ"ç - Link 2, create lists: a, b
 `      - monad from dyad by repeating argument
,       - pair: [a, a]
  ;1    - concatenate 1: [a, a, 1]
      ç - last link (1) as a dyad: [b, a^(b-1), a^b]
     "  - zip with the dyad...
    ẋ   -     repeat list:  [[a, a, ..., a], [a, a, ..., a], [1, 1, ..., 1]]
                                <- b ->       <- a^(b-1) ->     <- a^b ->

,W;çj"“^*++”Y - Main link: a, b
,             - pair: [a, b]
 W            - wrap: [[a, b]]
   ç          - last link (2) as a dyad: [[a, a, ..., a], [a, a, ..., a], [1, 1, ..., 1]]
  ;           - concatenate [[a, b], [a, a, ..., a], [a, a, ..., a], [1, 1, ..., 1]]
      “^*++”  - list of characters: ['^', '*', '+', '+']
     "        - zip with the dyad...
    j         -     join: ["a^b", "a*a*...*a", "a+a+...+a", "1+1+...+1"]
            Y - join with line feeds
              - implicit print

1

tinylisp REPL, 178 186 바이트

(load library
(d W(q((_ N S #)(i(e # 1)(c N _)(W(c S(c N _))N S(s # 1
(d ^(q((x y)(i y(*(^ x(s y 1))x)1
(d X(q((A B)(list(list A(q ^)B)(W()A(q *)B)(W()A(q +)(^ A(s B 1)))(W()1(q +)(^ A B

repl을 사용하면 줄 끝에서 암시적인 닫는 괄호 안에 8 바이트가 절약됩니다. X두 개의 숫자를 사용하고 표현식 목록을 리턴 하는 함수 를 정의합니다 . 각 표현식은 괄호로 묶여 있으며 연산자 주위에 공백이 있습니다 (실제로 숫자와 연산자 기호의 목록입니다).

((2 ^ 3) (2 * 2 * 2) (2 + 2 + 2 + 2) (1 + 1 + 1 + 1 + 1 + 1 + 1 + 1))

이 출력 형식이 허용되기를 바랍니다. 온라인으로 사용해보십시오! (여러 테스트 사례 포함).

설명

(load library)

우리는 표준 라이브러리에서 두 가지 기능이 필요 list하고 *.

(d W(q((_ N S #)(i(e # 1)(c N _)(W(c S(c N _))N S(s # 1))))))

W누산기 _, 숫자 N, 기호 S및 개수 를 취하는 함수 ( "직조"의 약어)를 정의하십시오 #. 이 함수를 사용하여 대부분의 표현식을 생성합니다. 예를 들어, (W () 2 (q +) 3)결과는 (2 + 2 + 2)입니다.

카운트가 1 (e # 1)이면 숫자를 누산기의 앞면에 놓고 그 숫자를 (c N _)반환하십시오. 그렇지 않으면 재귀하십시오.

  • 새로운 누산기는 (c S(c N _))다음과 같습니다. 이전 누산기의 앞면에있는 기호와 숫자;
  • N그리고 S동일하다;
  • 새로운 카운트는 (s # 1)count-1입니다.

적절한 꼬리 재귀 를 달성하려면 재귀 깊이 관용구가 필요 하며 재귀 깊이 오류를 방지 할 수 있습니다. (이 변경은 바이트 수에 대한 +8을 담당합니다. 13^2이전 버전에서는 작동하지 않았습니다.)

(d ^(q((x y)(i y(*(^ x(s y 1))x)1))))

불행히도 현재 라이브러리에는 지수 함수가 없으므로 정의해야합니다. ^소요 xy. 경우 ytruthy (제로), 우리는 함께 재귀 y-1( (s y 1))와에 의해 곱셈 결과 x. 그렇지 않으면, y0이고 우리는를 반환 1합니다.

(참고 :이 함수는 적절한 꼬리 재귀를 사용 하지 않습니다 . 나는 지수가 중요하지 않을 정도로 충분히 작을 것이라고 가정합니다. OP가 동의하지 않으면 변경합니다.)

(d X(q((A B)(list(list A(q ^)B)(W()A(q *)B)(W()A(q +)(^ A(s B 1)))(W()1(q +)(^ A B))))))

마지막으로, 우리가 관심있는 기능은 X, 소요 AB반환 네 항목의 목록을 :

  • (list A(q ^)B): A, 리터럴 ^B;
  • (W()A(q *)B): 리터럴로 짜여진 복사본 W목록을 얻으려면 호출 ;BA*
  • (W()A(q +)(^ A(s B 1))): 리터럴로 짜여진 복사본 W목록을 얻으려면 호출 ;A^(B-1)A+
  • (W()1(q +)(^ A B)): 리터럴로 짜여진 복사본 W목록을 얻으려면 호출 합니다 .A^B1+

1

Brainfuck , 372 바이트

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

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

노트

  1. 두 입력은를 A**B초과하지 않는 방식으로 선택해야합니다 255. brainfuck는 1 바이트의 값만 저장할 수 있기 때문입니다.
  2. 한 입력이 9보다 큰 경우 다음 ASCII 문자를 사용하십시오. 10진다 :, 11해진다 ;브레인 퍽 하나만 바이트의 입력을 수행 할 수 있기 때문이다 등등.

설명

여기 약간 주석 처리 된 코드가 있습니다. 나중에 이것을 확장하겠습니다.

,.                      print A
> +++++ +++
[
    > +++++ +++++ ++    set up 96 (for ^ sign)
    > +++++ +++         set up 64 (for = sign)
    > +++++             set up 40 (for plus and * sign)
    <<< -
]
> --.                   print ^
< ,.                    print B
>
> ---.                  print =
> ++                    prepare *

> +++++ +++             convert B from char code
[
    <<<< ----- -
    >>>> -
]

<<<< -                  print loop "A*"
[
    < .
    >>>> .
    >> +
    <<<<< -
]
< .                     print final A
>>> .                   print =


<< +++++ +++            convert A from char code
[
    < ----- -
    > -
]

<
[                       duplicate A
    > +
    >>>> +
    <<<<< -
]

>>>>>                   exponentiation (A**(B minus 1))
>>+<[->[-<<[->>>+>+<<<<]>>>>[-<<<<+>>>>]<<]>[-<+>]<<]<

>>
[                       duplicate
    < +
    >> +
    < -
]

>[<+>-]                 move

<<<<< <<< +++++ +++     convert A to char code
[
    > +++++ +
    < -
]

>>>> +                  convert * to plus sign
>> -                    print loop "A plus"
[
    <<<< < .
    >>> .
    >> -
]
<<<<< .                 print final A
>> .                    print =

>>>>                    move
[
    < +
    > -
]

                        multiply A**(B minus 1) by A
<<[->[->+>+<<]>>[-<<+>>]<<<]        

>>> +++++ +++           generate the char code for 1 (49)
[                           generate 8*6 = 48
    <<< +++++ +
    >>> -
]
<<< +                       add one

>> -                    print loop "1 plus"
[
    << .
    < .
    >>> -
]
<< .                    print final 1

0

Pyth, 32 31 바이트

AQjMC,"^*++"[Q*]GH*^GtH]G*]1^GH

로 입력을 받고 [2,10]로 출력합니다.["2^10", "2*2*2*2*2*2*2*2*2*2", "2+2+...

설명:

Q = eval(input())                     #  
G, H = Q                              #  AQ
operators = "^*++"                    #        "^*++"
operands = [Q,                        #              [Q
  [G]*H,                              #                *]GH
  G**(H-1)*[G]                        #                    *^GtH]G
  [1]*G**H                            #                           *]1^GH
]                                     #
map( lambda d: join(*d),              #    jM
     zip(operators, operands)         #      C,...
)                                     #

여기에서 시도하십시오.



0

R, 147 바이트

w=switch;function(A,B)for(s in letters[1:4]){cat(rep(w(s,d=1,a=c(A,B),b=,c=A),w(s,a=1,b=B,c=A^B/A,d=A^B)),sep=w(s,a="^",b="*",d=,c="+"));cat("\n")}

필요한 출력을 한 줄씩 출력하는 익명 함수입니다. 이 솔루션은 switch기능을 광범위하게 사용 합니다.

switch함수는 s숫자 또는 문자열로 평가 되는 식 (여기서는 )을 ?switch취하고 그 뒤에 해당하는 대체식이옵니다 s. 대안이 누락 된 경우 (예 : switch(s, a=, b= "PPCG")다음의 비결 측 대안이 평가됩니다 (이 예에서는 s="a"출력 "PPCG").

rep함수 반복 (복제 실제로) 첫 번째 인자 횟수 번째 인수에 나타내었다.

cat, sep =인수를 사용하여 선택할 수있는 구분 기호를 사용하여 객체를 마무리, 연결 및 인쇄합니다 . 두 번째 cat기능은 줄 바꿈입니다.

언 골프 드 :

f=function(A,B)
    for(s in letters[1:4]){
        cat(
            rep(switch(s, d = 1, a = c(A,B), b =, c = A),
            switch(s, a = 1, b = B, c = A^B/A, d = A^B)),
        sep=switch(s,a = "^", b = "*", d =, c = "+"))
    cat("\n")
}



0

기본 202 바이트

%:.~:#"^"."=">v
x            "~
             *.
     >~=088v "~
     v88+88< ?
     8       -
     8      x#<
     v     < 0
     >   t / <
v~.~ <#"="?<
-
#?"+"^t
0
V
#?"="  >"1"-v
/ {   <^"+"?<
>     ^

추기경에서 포인터로 보유 할 수있는 값의 제한으로 인해 계산 된 값이 <256 인 숫자에 대해서만 작동합니다.

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

설명:

1 단계

%:.~:#"^"."="

입력으로 두 개의 숫자 a와 b를 받고 "a ^ b ="와 같이 출력합니다.
활성 값 a와 비활성 값 b를 가진 포인터를 전달합니다.

2 단계

        >v
        "~
        *.
>~=088v "~
v88+88< ?
8       -
8      x#<
v     < 0
>   t / <

"a"+ ( "* a") (b-1) 번 인쇄하는 활성 값 a 및 비활성 값 b를 가진 포인터를받습니다.
활성 값 a ^ (b-1)을 가진 포인터를 다음 부분으로 전달합니다.

3 단계

v~.~ <#"="?<
-
#?"+"^t
0
V
#?"="  
/ {   <
>     ^ 

값이 a ^ (b-1) 인 포인터를 수신하고 "= a"+ ( "+ a")를 반복합니다 (a ^ (b-1) -1) times + "="
값이 a ^ b 인 포인터를 전달합니다. 다음 부분으로

4 단계

>"1"-v
^"+"?<

값이 a ^ b 인 포인터를 수신하고 a ^ b-1 번 반복 된 "1"+ ( "+ 1")을 인쇄합니다.


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