피타고라스의 다른 다리


33

피타고라스는 전쟁에서 다리를 날려 버렸습니다. 그는 절단해야했고, 거의 죽었지 만 그는 완전히 회복했습니다. 이제 목발로 1 년을 걷다가 보철 다리를 얻는 특권을 얻습니다! 하지만 맞는 것은 몇 가지가 있지만 어느 것입니까?

작업

피타고라스 트리플의 한쪽 레그의 길이 인 입력으로 양의 정수가 주어지면 다른 레그에 대한 모든 가능성을 출력합니다. 예를 들어, 가장 작은 피타고라스 트리플은 (3,4,5)로, 길이 3과 4의 두 다리와 길이 5의 빗변이있는 삼각형을 형성합니다.

Leg:5
12

Leg:28
21
45
96
195

Leg:101
5100

Leg:1001
168
468
660
2880
3432
4080
5460
6468
10200
38532
45540
71568
501000

규칙

  • 입력은 단일 양의 정수 n입니다.
  • 출력은 임의의 구분 기호, 임의의 기준 (이 기준은 일관성이 있어야 함), 선택적 개폐 괄호 및 선택적 후행 공백이있는 순서에 상관없이 가능합니다. , 즉 1 2 3, [1,2,3]그리고 1,11,111모든이 출력 사양에 맞게.
  • n언어 제한의 네 번째 루트의 4 분의 1 (라이브러리를 사용하지 않고)보다 크지 않을 것이라고 가정 할 수 있습니다 . 실제로 입력이 이보다 작거나 10,000보다 작은 것으로 가정 할 수 있습니다.

피타고라스가 여러분을 기다리고 있으므로 코드를 빠르고 짧게 작성하는 것이 좋습니다!


18
그는 정말 이상한 사람입니다. 그는 컴퓨터가 발명되기까지 몇 천 년을 기꺼이 기다리지 만 몇 백 바이트를 읽는 데 몇 나노초도 걸리지 않습니다. 가장 정확한 말은 아주 정확하게 말입니다.
corsiKa

답변:



11

젤리 , 8 바이트

²R²+²Æ²O

이 답변은 챌린지가 게시 된 후 구현 된 기능을 사용하므로 경쟁이 아닙니다. 온라인으로 사용해보십시오!

이 방법은 부동 소수점 수학을 사용하지 않으므로 개입 목록이 메모리에 들어갈 수있는 한 정답을 제공합니다.

생각

경우 (A, B, C)는 트리플 피타고라스이다 엄격히 양의 정수가있는 K가 m이 N 세트 참가하도록 {A, B} =는 {km 2 - KN 2 , 2kmn}를 보유하고있다.

특히 이것은 a <b 2b <a 2 를 의미하므로 입력 a의 경우 a 2 + b 2{1,… a 2 }의b 에 대해 완벽한 제곱 인지 간단히 확인할 수 있습니다 .

암호

            Input: x

²           Compute x².
 R          Get get range 1 ... x².
  ²         Square each integer in that range.
   +²       Add x² to each resulting square.
     Ʋ     Check if the resulting sums are perfect squares.
       O    Get all indices of ones.

10

줄리아, 35 바이트

n->filter(i->hypot(i,n)%1==0,1:n^2)

이것은 정수를 받아들이고 배열을 반환하는 익명 함수입니다.

i1에서 입력 제곱까지 각각 Julia의 내장 hypot함수를 사용하여 빗변을 계산 하고 분수 부분이 0인지 여부를 결정합니다.


6

CJam, 17 바이트

{:A2#{Amh1%!},1>}

이것은 스택에서 정수를 팝하고 배열을 반환하는 익명 함수입니다.

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

생각

경우 (A, B, C)는 트리플 피타고라스이다 엄격히 양의 정수가있는 K가 m이 N 세트 참가하도록 {A, B} =는 {km 2 - KN 2 , 2kmn}를 보유하고있다.

특히 이것은 a <b 2b <a 2 를 의미하므로 입력 a의 경우 a 2 + b 2{1,… a 2 }의b 에 대해 완벽한 제곱 인지 간단히 확인할 수 있습니다 .

암호

:A               Save the input in A.
  2#             Square it.
    {      },    Filter; for each B in {0, ..., A**2}:
     Amh           Calculate the hypotenuse of (A, B).
        1%!        Apply logical NOT to its fractional part.
                 Keep B if ! pushed 1.
             1>  Discard the first kept B (0).  

4

자바 스크립트 ES6, 60 62

1에서 a * a-1까지 확인하는 다른 답변과 동일

a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))

ES6에서 범위를 구축하는 가장 짧은 방법은 @ Mwr247입니다 .

@ETHproductions에서 2 바이트 절약


대박! 내장 된 기능으로 몇 바이트를 절약 할 수 있다고 생각합니다.a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
ETHproductions

@ETHproductions thx, 나는 새로운 수학 내장에 대해 더 배울 필요가 있습니다
edc65

편리하게도 이미 링크 한 페이지에서 설명합니다. (저는 hypot 제안을 스스로 만들었을 것이지만 당시에는 로그인하지 않았습니다.)
Neil

3

C, 96 바이트

차이가 1로 떨어질 때까지 교대로 y(다른 다리)와 z(가설)를 증가시킵니다 c==0.

int x,y,z;main(int c,char**a){for(x=z=atoi(a[1]);++y<z;c=x*x+y*y-z*z,c?z+=c>0:printf("%d ",y));}

n 을 매개 변수로 사용 하여 컴파일 된 프로그램을 호출하십시오 . 공백으로 구분 된 10 진수 목록을 출력합니다.

분명히 가장 짧지는 않습니다. 나는 가장 빠른 것을 가지고 편안함을 찾을 수 있습니다.

$ time ./pyth 9999
200 2020 13332 13668 16968 44440 45360 54540 55660 137532 164832 168168 413080 494900 504900 617120 1514832 1851468 4544540 5554440 16663332 49990000 
real    0m0.846s
user    0m0.800s
sys     0m0.000s


3

Wolfram Language (Mathematica) , 40 바이트

b/.Solve[#^2+b^2==c^2,PositiveIntegers]&

나는 문서화되지 않은 형식을 사용하고 있습니다 Solve: 변수 목록이 생략되면 Solve기본적으로 표현식의 모든 기호를 해결합니다. 따라서 우리는보다 일반적인 6 바이트를 절약 Solve[#^2+b^2==c^2,{b,c},PositiveIntegers]합니다.

PositiveIntegersMathematica 버전 12의 새로운 기능이므로 TIO 에서는 사용할 수 없습니다 . 데스크탑 Mathematica에서

F = b/.Solve[#^2+b^2==c^2,PositiveIntegers]& ;

F[5]
(*    {12}    *)

F[28]
(*    {21, 45, 96, 195}    *)

F[101]
(*    {5100}    *)

F[1001]
(*    {168, 468, 660, 2880, 3432, 4080, 5460, 6468, 10200, 38532, 45540, 71568, 501000}    *)

2

파이썬 2, 53 바이트

lambda n:[i for i in range(1,n*n)if abs(i+n*1j)%1==0]

abs빗변의 길이를 계산하기 위해 복소수 를 사용하는 간단한 솔루션 . n*n때문에 다른 다리의 상한 으로 사용 하는 것이 안전합니다 (n*n)^2 + n^2 < (n*n+1)^2. 대신 재귀를 사용했지만 더 짧은 것은 얻지 못했습니다.


2

정말 20 바이트

,;╗ªDR;`╜@ÇA1@%Y`M@░

xnor의 Python 답변과 동일한 전략 : i in range(1,n*n)where 값을 확인 abs(i+nj) % 1 == 0하고 목록을 출력하십시오. 온라인으로 사용해보십시오

설명:

,;╗    get input and save a copy in register 0
ªDR;   push two copies of range(1,n*n)
`╜@ÇA1@%Y`M    map the function across one of the ranges:
    ╜@ÇA         compute abs(i+nj)
    1@%Y         push 1 if result % 1 is 0, else 0
M@░    swap the two lists, take values in the original range where the corresponding values in the second range are truthy


2

APL (NARS), 373 자, 746 바이트

C←{h←{0=k←⍺-1:,¨⍵⋄(k<0)∨k≥i←≢w←⍵:⍬⋄↑,/{w[⍵],¨k h w[(⍳i)∼⍳⍵]}¨⍳i-k}⋄1≥≡⍵:⍺h⍵⋄⍺h⊂¨⍵}⋄P←{1≥k←≢w←,⍵:⊂w⋄↑,/{w[⍵],¨P w[a∼⍵]}¨a←⍳k}⋄d←{∪×/¨{k←≢b←1,π⍵⋄∪{b[⍵]}¨↑∪/101 1‼k k}⍵}⋄t←{(-/k),(×/2,⍵),+/k←⍵*2}⋄b←{⍬≡a←3 C d w←⍵:(⊂1,⍵,1)⋄(⊂1,⍵,1),a/⍨{⍵[2]>⍵[3]}¨a←↑∪/P¨,a/⍨{w=×/⍵}¨a}⋄u←{(↑⍵),2÷⍨(+/a),-/a←1↓⍵}⋄t1←{(↑¨⍵)×t¨1↓¨⍵}⋄f1←{0=2∣⍵:↑¨t1 b⍵÷2⋄{2⊃⍵}¨t1 u¨b⍵}⋄f←{m←⎕ct⋄⎕ct←0⋄r←f1⍵⋄⎕ct←m⋄r}

논평:

C: ⍺ combination in ⍵ list
P: permutations  in ⍵ list
d: divisors of ⍵ unsigned
t: Pythagorian triple from ⍵ list 2 unsigned
b: if argument ⍵ is one unsigned it would return the list of (k,i,j) where 
   k,i,j are all divisors of ⍵, and ⍵=k×i×j and i>j
u: from one triple (k,i,j) return (k,(i+j)/2,(i-j)/2)
t1: apply (k,i,j) to t in the way  k×t i,j 
f: the function of this exercise

이 아이디어는 입력 값을 다리로 갖는 모든 피타 고리아 트리플을 사용하여 생성 할 수있는 가능한 m, n을 알기위한 입력 값을 고려합니다. 테스트:

  f 18298292829831839x
167413760243137645229428509060960 15219432749376149566311682641900 99808869980900940 
  1383584795397831778755607512840 
  f 5
12
  f 28
195 96 21 45 
  f 101
5100
  f 1001
501000 6468 38532 2880 468 660 168 5460 45540 4080 71568 3432 10200 
  ≢f 1001
13
  f 1663481166348349x
1383584795397831778755607512900 
  f 198820182831x
19764732550476133587280 346749693868002343608 5664631173992 6083327962596530720 613900915408 115583231289334114460 
  18249983887789596492 1883559626820 1040249081604007030900 54749951663368790920 6588244183492044529092 
  265093577108 2196081394497348176360 

2

APL (Dyalog Extended) , 15 14 바이트 SBCS

익명의 암묵적 접두사 기능.

(⍸⊢(+∊⊢)⍳×⍳)×⍨

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

×⍨ 논쟁의 제곱 (lit. 곱셈 selfie)

() 다음 익명의 암묵적 기능을 적용하십시오.

ɩ 인수 1 내지 ntegers

 곱셈에 의해 ɩ인수 (예 : 제곱)를 통해 ntegers 1

⊢()  왼쪽 인수로 인수와 함께 다음 익명의 암묵적 기능을 적용하십시오.

  + 합계입니다

   의 회원

   그것?

진실의 ndi


1

펄 5, 43 바이트

$i=<>;{sqrt(++$_**2+$i**2)!~/\./&&say;redo}

스크립트를 종료하려면 xnor에 설명 된 대로 다른 레그를 최대 n²까지 검사 할 수 있으므로 48 바이트가 있습니다.

map{sqrt(++$_**2+$i**2)!~/\./&&say}1..($i=<>)**2

1

Japt , 16 바이트

1oU² f@!(MhXU %1

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

작동 원리

        // Implicit: U = input integer
1oU²    // Generate a range of integers from 1 to U squared.
f@!(    // Keep only items X that return falsily to:
MhXU %1 //  Math.hypot(X,U) % 1.
        // This keeps only the items where sqrt(X*X+U*U) = 0.
        // Implicit: output last expression


1

05AB1E , 10 바이트

nDLn+Ųƶ0K

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

nDLʒnIn+Ų

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

n           # Take the square of the (implicit) input-integer
 D          # Duplicate it
  L         # Create a list in the range [1, input^2]
   n        # Square each value in this list
    +       # Add the input^2 we duplicated to each
     Ų     # Check for each of these if it's a square (1 if truthy; 0 if falsey)
       ƶ    # Multiply each value by its 1-based index
        0K  # Remove all 0s from the list
            # (after which the result is output implicitly)

nDL         # Same as above
   ʒ        # Filter this list by:
    n       #  Get the square of the current number
     In+    #  Add the squared input to it
        Ų  #  And check if it's a square
            # (after the filter, implicitly output the result)

1

MathGolf , 9 바이트

²╒gƲk²+°

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

다음 중 하나를 제거 할 수있는 좋은 방법을 찾지 못했습니다 ²3/9 바이트를 차지하는 . 그렇지 않으면 매우 간단합니다

설명

²           square input
 ╒          range(1,n+1)
  gÆ        filter list using next 5 operators
    ²       square list element
     k²     push input squared
       +    pop a, b : push(a+b)
        °   is perfect square

1

자바 8, 72 바이트

n->{for(int i=0;++i<n*n;)if(Math.hypot(i,n)%1==0)System.out.println(i);}

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

설명:

n->{                           // Method with integer as parameter and no return-type
  for(int i=0;++i<n*n;)        //  Loop `i` in the range (0, n²)):
    if(Math.hypot(i,n)         //   If sqrt(i² + n²)
       %1==0)                  //   has no decimal digits after the comma (so is an integer)
      System.out.println(i);}  //    Output `i` with trailing newline
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.