격자에 몇 개의 직사각형이 있습니까?


29

글쎄,이 도전은 큰 성공으로 판명되었지만, 해결하기가 매우 사소한 것으로 판명되었습니다. 따라서 더 많은 도전을 찾고있는 사람들을 위해이 고유 한 사각형 의 수를 세어야하는이 도전의 속편을 만들었습니다 . 확인 해봐!

자, 도전 을 해결하고자하는 사람들을 위해 여기에 온다.


글쎄, 우리는 아직 이와 같은 도전을 가지고 있지 않으므로 여기로갑니다.

3 x 3사각형 격자를 고려하십시오 .

예

직사각형은 몇 개입니까? 시각적으로 볼 36때 전체 평면 자체를 포함하여 실제로 직사각형 이 있으며 아래 애니메이션 GIF에 모두 표시되어 있습니다.

예제의 사각형

작업

위에 표시된 사각형의 개수는 작업입니다. 즉, 2 개보다 큰 정수 또는 주어진 동일 0, mn여기서, m폭을 나타내고, n출력, 그 안에 직사각형의 총 개수의 높이를 나타내는 m x n직사각형 그리드.

규칙

  • 이 문제를 직접 해결하는 내장 기능을 사용하는 것은 명시 적으로 허용되지 않습니다.

  • 이 과제는 가장 짧은 답변을 찾는 것이 아니라 모든 언어에서 가장 짧은 답변을 찾는 것입니다. 따라서 응답이 없습니다.

  • 표준 허점은 금지되어 있습니다.

테스트 사례

형식으로 제시 Array of Integers Input -> Integer Output:

[0,0] -> 0
[1,1] -> 1
[3,3] -> 36 (Visualized above)
[4,4] -> 100
[6,7] -> 588

참고 문헌

이것은 이므로 가장 짧은 코드가 승리 한다는 것을 기억하십시오 !


588마지막 테스트 사례를 계산 했습니다.
Leaky Nun

@LeakyNun 글쎄, 나는 그들을 세는 동안 일부를 놓친 것 같아요 . 고정되어 있습니다.
R. Kap

입력의 최대 값은 얼마입니까?
Outgolfer Erik

답변:


34

파이썬, 22 바이트

lambda m,n:m*~m*n*~n/4

m*n*(m+1)*(n+1)/4비트 보수를 사용하여 공식 이 단축 ~m=-(m+1)되고로 표현 (m+1)*(n+1)됩니다 ~m*~n.

왜 사각형의 개수는 m*n*(m+1)*(n+1)/4? 각 사각형은 두 개의 수평선 (위와 아래)과 두 개의 세로선 (왼쪽과 오른쪽)을 선택하여 지정됩니다. m+1수평선 이 있는데 , 그중에서 두 개의 구별되는 부분 집합을 선택합니다. 따라서 선택의 수는 choose(m+1,2)입니다 m*(m+1)/2. n*(n+1)/2수직선 선택에 곱하면 결과가 나타납니다.


그 +1 트릭은 훌륭합니다.
David Ljung Madison Stellar

11

잘 했어. 엄지 손가락. :)
R. Kap

24
설명 할까?
Pureferret

도 있습니다 בHP그리고 ‘c2P어쩌면 다른 4 바이트 대안.
마일

1
@Pureferret 이것은 삼각수 nth와 곱의 곱에 대한 OEIS 공식을 사용합니다 mth. R각 숫자를 1 기반 인덱스로 변환합니다 [1, 2, ..., n]. S는 합산이며 '각'을 의미하므로 각 목록이 합산되어 다음과 같은 목록이 제공 [nth triangle number, mth triangle number]됩니다. 그런 다음 P해당 목록의 곱을 가져와 원하는 결과를 얻습니다.
FryAmTheEggman

1
@FryAmTheEggman 그래서 당신의 말은 .... 마법
Pureferret


9

Mathematica, 15 바이트

##(1##+##+1)/4&

이것은 두 개의 정수 인수를 사용하고 사각형 수를 반환하는 명명되지 않은 함수입니다.

설명

구현은 기본적으로 두 개의 삼각형 숫자의 곱의 골프 형식입니다. 자세한 내용 은이 게시물의 "인수 순서"섹션을 읽어 볼 가치가 있지만 여기서 요점을 요약하려고합니다.

##모든 인수 의 순서 로 확장됩니다 . 이것은 다른 언어에서 뿌려 지는 것과 비슷합니다 . 예를 들어, 인수가 3and 4인 경우을 {1, 2, ##, 5}제공합니다 {1, 2, 3, 4, 5}. 그러나 이것은 목록에서만 작동하는 것이 아니라 어떤 식 으로든 작동 f[1, 2, ##, 5]합니다 f[1, 2, 3, 4, 5].

##연산자와 결합하면 흥미로워집니다 . Mathematica의 모든 연산자는 일부 f[...]유사한 표현 ( 단지 중첩 된)에 대한 속기입니다. 예를 들면 a+b입니다 Plus[a, b]a-b대표 실제로 Plus[a, Times[-1, b]]. 이제 ##연산자와 결합 할 때 Mathematica는 연산자를 먼저 확장하고 ##단일 피연산자처럼 취급 하고 끝에서만 확장하는 것입니다. ##따라서 올바른 위치에 삽입 하여 피연산자를 곱하고 추가하는 데 사용할 수 있습니다.

위의 코드에 대해이 작업을 수행하십시오.

##(1##+##+1)/4

전체 형태로 확장하면 다음과 같은 결과를 얻습니다.

Times[##, Plus[Times[1, ##], ##, 1], Rational[1/4]]

함수 인수 삽입하자 ab:

Times[a, b, Plus[Times[1, a, b], a, b, 1], Rational[1/4]]

이제 다시 표준 수학 표기법으로 변환합니다.

a * b * (a * b + a + b + 1) / 4

약간의 정리는 이것이 삼각형 숫자의 곱임을 보여줍니다.

a * b * (a + 1) * (b + 1) / 4
(a * (a + 1) / 2) * (b * (b + 1) / 2)
T(a) * T(b)

재미있는 사실 :이 구현은 매우 골치 거리이며 단일 삼각 수를 계산하기위한 내장 길이와 길이가 같습니다 PolygonalNumber.


8

C, 25 바이트

#define r(x,y)x*y*~x*~y/4

순수 주의자 버전 (27) :

r(x,y){return x*y*~x*~y/4;}

ISO-er 버전 (35) :

#define r(x,y)((x)*(y)*~(x)*~(y)/4)

어떤 버전이 가장 좋다고 생각하십니까?
Outgolfer Erik

8

해파리 , 16 바이트

p|%/**+1
  4  Ei

입력 형식은 [x y]이며 출력은 결과입니다.

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

대체 솔루션, 동일한 바이트 수 :

pm%/*[*i
  4  +1

설명

해파리에게 그만한 가치가있는 소개를 해줄 시간입니다! :)

Jellyfish는 2D 구문 문제에 기반한 Zgarb 의 언어 입니다. 시맨틱은 주로 J에서 영감을 얻었지만 구문은 예술 작품입니다. 모든 기능은 단일 문자이며 그리드에 배치됩니다. 함수는 남쪽과 동쪽의 다음 토큰에서 인수를 취하여 결과를 북쪽과 서쪽으로 반환합니다. 이를 통해 여러 방향에서 여러 함수로 값을 전달하여 값을 재사용하는 흥미로운 함수 호출 웹을 만들 수 있습니다.

위 프로그램의 일부 토큰이 특수 연산자 (상위 함수) 라는 사실을 무시하면 위의 프로그램은 다음과 같이 정상적인 언어로 작성됩니다.

p(|( /*(i*(i+1)) % 4 ))

코드 상향식을 살펴 보겠습니다. 에 의해 입력이 입력되어로 i평가됩니다 [x y].

+위에는 리터럴 1과 함께이 입력을 수신 하므로 두 요소를 모두 증가시킵니다 [(x+1) (y+1)](대부분의 작업은 목록에서 자동으로 스레드됩니다).

다른 값은 i왼쪽으로 보내지지만 E분할은 북쪽과 서쪽의 동부 인수입니다. 그 수단 오른쪽 입력은 *실제로 [x y][(x+1) (y+1)]이되도록 계산하여 [x*(x+1) y*(y+1)].

다음 *은 실제로 이전에 의해 수정되어 /접기 작업으로 바뀝니다. 접는 *우리가 얻을 그래서, 단순히 곱셈을 한 쌍 이상 x*(x+1)*y*(y+1).

이제는 %단지 나눗셈이므로 계산합니다 x*(x+1)*y*(y+1)/4. 불행히도 이로 인해 부동이 발생하므로 단항으로 반올림해야합니다 |. 마지막으로이 값이 공급되어 p최종 결과를 인쇄합니다.


나는 정수 나누기에 관한 문서에서 무언가를 읽겠다고 맹세 할 수 있었다 ...
Conor O'Brien

7

R, 40 35 바이트

글쎄, 깊은 곳에서 뛰어들 시간입니다! @xnor answer에서 영감을 얻은 내 R 코드 는 다음과 같습니다 .

a=scan();(n=a[1])*(m=a[2])*(n+1)*(m+1)/4 

편집 :이 버전에서 R 은 입력을 두 번 요구합니다.

(n=scan())*(m=scan())*(n+1)*(m+1)/4

cat(prod(choose(scan()+1,2)))29 바이트입니다.
주세페

6

CJam, 12 10 바이트

Martin 덕분에 2 바이트가 절약되었습니다.

{_:)+:*4/}

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

스택에서 2 개의 요소 목록을 가져 와서 솔루션을 스택에 남겨 두는 블록입니다. 테스트에 사용 가능한 전체 프로그램 : riari+{_:)+:*4/}~.

xnor의 뛰어난 Python 솔루션을 기반으로합니다.

설명:

{_:)+:*4/}
{        } -- Define a block
 _:)       -- Duplicate list, increment all values in new list
    +      -- Join the two lists
     :*    -- Fold multiply over all 4 elements
       4/  -- Divide by 4

2
두 요소의 목록을 입력하면 10에 효과가 있다고 생각합니까? {_:~+:*4/}
Martin Ender

실제로 ~CJam에서는 전혀 사용할 필요가 없습니다 . 그냥 사용하십시오 ).
Martin Ender

5

MATLAB, 23 19 바이트

@(x)prod([x/2,x+1])

공식의 구현 m*n*(m+1)*(n+1)/4
사용법 :ans([m,n])


4

MATL , 6 바이트

tQ*2/p

입력은 형식의 배열입니다 [m,n].

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

설명

공식에 기반한 직접 계산 m*(m+1)*n*(n+1)/4.

t     % Input array [m,n] implicitly. Duplicate
Q     % Add 1 to each entry of the copy: gives [m+1,n+1]
*     % Multiply element-wise: gives [m*(m+1),n*(n+1)]
2/    % Divide each entry by 2: [m*(m+1)/2,n*(n+1)/2]
p     % Product of the two entries: m*(m+1)*n*(n+1)/4. Display implicitly


4

자바 7, 39 38 바이트

int c(int a,int b){return~a*a*b*~b/4;}

자바 8, 26 25 19 18 17 바이트

a->b->a*~a*b*~b/4

@xnor 의 탁월한 답변을 기반으로 합니다. @DavidConrad 덕분에 여러 바이트가 절약 되었습니다 . 여기에서 시도하십시오.

테스트 코드 (자바 7) :

여기에서 시도하십시오.

class M{
  static int c(int a,int b){return~a*a*b*~b/4;}

  public static void main(String[] a){
    System.out.println(c(0, 0));
    System.out.println(c(1, 1));
    System.out.println(c(3, 3));
    System.out.println(c(4, 4));
    System.out.println(c(6, 7));
  }
}

산출:

0
1
36
100
588

1
당신은 필요하지 않습니다 returna->b->이상의 바이트 짧다 (a,b)->.
David Conrad

2
세미콜론이 필요 하다고 생각 하지 않습니다 . 람다를 Function<Integer, Function<Integer, Integer>>매개 변수 로 사용하는 메소드에 람다를 전달하면 세미콜론이 뒤 따르지 않기 때문입니다.
David Conrad

2
나는 @DavidConrad에 동의합니다 : 나는 ;단일 진술 J8 람다로 끝나지 않습니다 .
CAD97

@DavidConrad 매우 늦은 편집에 대해 죄송하지만 지금은 return .. 를 제거하기 위해 귀하의 의견을 읽은 것을 알았습니다 . 또한 Java 8 (그래서 모든 Java 7 답변)에서 프로그래밍하지는 않지만 어떻게 a->b->작동합니까? 현재 사례의 아이디어는 다음과 같습니다.
Kevin Cruijssen

1
답변이 늦어서 죄송합니다. 함수를 카레해야하므로 MathOperation.operation하나만 변경 하고 inta를 반환해야하며 Function<Integer, Integer>호출 할 때 처음에는 첫 번째 매개 변수 만 전달한 a다음을 호출 .apply(b)해야합니다 Function. 또한 가져와야 java.util.function.Function합니다. 다음은 변경 사항이있는 아이디어입니다.
David Conrad

3

루비, 22 바이트

@xnor의 속임수를 훔치고 stabby-lambda 만들기 :

r=->(m,n){m*n*~m*~n/4}

호출 예 :

r[6,7]     # => 588

또는 proc로, 22 바이트 :

proc{|m,n|m*n*~m*~n/4}

우리는 다음과 같이 부를 수 있습니다.

proc{|m,n|m*n*~m*~n/4}.call(6,7)     # => 588

이름을 지정할 필요는 없습니다. 익명의 기능은 사이트 컨벤션에 따라 가능합니다
Conor O'Brien

3

미로 , 13 11 바이트

*?;*_4/!
):

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

설명

또한 대부분의 답과 같이 삼각 숫자의 곱을 계산합니다. 선행 2x2 블록은 작은 루프입니다.

*?
):

첫 번째 반복 *에서는 아무것도 수행 하지 않으므로 실제 루프 순서는 다음과 같습니다.

?   Read integer N from STDIN or 0 at EOF and push onto stack. If 0, exit the loop.
:   Duplicate N.
)   Increment.
*   Multiply to get N*(N+1).

나머지 코드는 선형입니다.

;   Discard the zero that terminated the loop.
*   Multiply the other two values.
_4  Push a 4.
/   Divide.
!   Print.

그런 다음 Labyrinth는 /다시 실행을 시도하며 0으로 나누면 프로그램이 종료됩니다.


2

파이크, 6 바이트

mh+Bee

여기 사용해보십시오!

mh     -    map(increment, input)
  +    -   ^ + input
   B   -  product(^)
    ee - ^ \ 4

이것은 고장을 사용할 수 있지만 개인적으로 예술 작품이라고 생각합니다.
corsiKa


1

Pyth, 8 6 바이트

@DenkerAffe 덕분에 2 바이트가 절약되었습니다.

*FmsSd

입력은와 같은 목록으로 예상됩니다 [m,n]. 여기서 사용해보십시오 .

설명:

          Implicit assignment of Q to eval(input).
*         Multiplication.
 F        Splat the following sequence onto the arguments of the previous function.
  m       Map the following function of d over Q (Q is implicitly added to the end).
   s      Reduce the following list with addition, initial value of 0.
    Sd    Return range(1,d+1).

1
암시 적으로 추가되었으므로 F대신 대신 사용 .*하고 제거 할 수 있습니다 Q.
Denker

나는 알고 F있었지만 그것을 사용하는 방법을 알 수 없었고 .*대신 사용해야한다고 생각했습니다 ... 감사합니다!
Rhyzomatic 2009 년

1

C #, 19 바이트

(n,m)=>m*n*~m*~n/4;

@xnor의 답변을 기반으로 한 익명 함수.


1

루아, 74 63 바이트

x,y=...n=0 for i=1,y do for j=i,i*x,i do n=n+j end end print(n)

함수는 숫자 매개 변수로 입력을받습니다.

Lua가 구현되는 방식 때문에 기술적으로 변수 args가있는 함수입니다.이 함수는 "function"문으로 랩핑하거나 "loadstring"을 사용하여 소스 코드에서로드하여 호출 할 수 있습니다.


1
나는 당신이 I / O를 위해 꽤 많은 코드를 가지고 있음을 알았습니다. 아마도 두 숫자를 가져 와서 답을 반환하고 불필요한 모든 I / O 코드를 제거하는 함수를 만드는 것이 더 짧을 것입니다.
Zwei

@ Zwei 함수가 매개 변수로 입력 할 수 있다는 것을 잊었습니다. 지적 해 주셔서 감사합니다.
brianush1

이 함수는 전체 이름 "function"대신 "f"와 같은 이름으로 7 바이트를 더 절약 할 수 있습니다.
Zwei

루아에서, 함수를 선언하려면 키워드 "function"이 필요합니다. 이름이 지정되지 않은 경우 (예 : "function f ()") 익명 함수입니다. (예 : "function ()"). 따라서 코드가 작동하려면 "기능"이 필요합니다.
brianush1

오, 루아가 그렇게 작동한다는 것을 잊었습니다. 내 잘못이야!
Zwei


1

Brain-Flak , 84 80 바이트

({}<>)({({})<({}[()])>}{})<>({({})<({}[()])>}{}[()]){<>(({}))<>({}[()])}<>({{}})

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

아마도 삼각형 숫자와 관련된 코드 재사용으로 인해 매우 차선책 일 수 있지만 적어도 Brain-Flak 솔루션이 작동합니다.

슬프게도 0 0테스트 케이스 와 함께 무한 반복하여 실패하는 것처럼 보이지만 다른 모든 것은 잘 작동합니다.




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