Inna noga Pitagorasa


33

Pitagoras miał wysadzoną nogę podczas wojny. Musiał zostać amputowany i chociaż prawie umarł, przeżył i całkowicie wyzdrowiał. Teraz, po roku chodzenia o kulach, otrzymuje przywilej uzyskania protezy nogi! Chodzi o to, że istnieje kilka pasujących, ale które z nich?

Zadanie

Biorąc pod uwagę dodatnią liczbę całkowitą jako wartość wejściową, która jest długością jednej nogi potrójnego pitagorejskiego, wypisz wszystkie możliwości dla drugiej nogi. Na przykład najmniejszą potrójną pitagorejską jest (3,4,5), która tworzy trójkąt z dwoma nogami o długości 3 i 4 i przeciwprostokątną o długości 5.

Przykłady

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

Zasady

  • Wejście będzie pojedynczą dodatnią liczbą całkowitą n.
  • Dane wyjściowe mogą być w dowolnej kolejności, z dowolnym ogranicznikiem, w dowolnej podstawie (choć podstawa ta musi być spójna), z opcjonalnym otwieraniem i zamykaniem nawiasów klamrowych i opcjonalnym końcowym odstępem. Oznacza to, że 1 2 3, [1,2,3]i 1,11,111wszystko pasuje tej specyfikacji wyjściowego.
  • Możesz założyć, że nnigdy nie będzie większy niż jedna czwarta czwartego katalogu głównego limitu Twojego języka (bez korzystania z bibliotek). W praktyce możesz założyć, że wartość wejściowa będzie mniejsza niż ta lub 10 000, w zależności od tego, która wartość będzie mniejsza.

Pitagoras czeka na ciebie, więc lepiej napisz swój kod szybko i krótko!


18
To naprawdę dziwny facet. Gotów jest czekać kilka tysięcy lat na wynalezienie komputerów, ale nie więcej niż kilka nanosekund, aby odczytać kilka dodatkowych setek bajtów. Bardzo precyzyjny człowiek, delikatnie mówiąc.
corsiKa,

Odpowiedzi:



11

Galaretka , 8 bajtów

²R²+²Æ²O

Ta odpowiedź nie jest konkurencyjna, ponieważ wykorzystuje funkcje, które zostały zaimplementowane po opublikowaniu wyzwania. Wypróbuj online!

Podejście to nie wykorzystuje matematyki zmiennoprzecinkowej, więc da poprawną odpowiedź, o ile listy interweniujące mieszczą się w pamięci.

Pomysł

Jeśli (a, b, c) jest potrójną pitagorejską liczbą, istnieją ściśle dodatnie liczby całkowite k, m, n takie, że zachowana jest równość {a, b} = {km 2 - kn 2 , 2kmn} .

W szczególności oznacza to, że a <b 2 i b <a 2 , tak dla wejścia A może po prostu sprawdzić, czy 2 + b 2 jest idealny dla każdego kwadratu B w {1, ... 2 } .

Kod

            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

Julia, 35 bajtów

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

Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca tablicę.

Dla każdego iz 1 do kwadratu wejściowego obliczamy przeciwprostokątną za pomocą wbudowanej hypotfunkcji Julii i określamy, czy część ułamkowa wynosi 0. Jeśli tak, zachowujemy ją, w przeciwnym razie jest wykluczona.


6

CJam, 17 bajtów

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

Jest to anonimowa funkcja, która wyrzuca liczbę całkowitą ze stosu i pozostawia tablicę w zamian.

Wypróbuj online!

Pomysł

Jeśli (a, b, c) jest potrójną pitagorejską liczbą, istnieją ściśle dodatnie liczby całkowite k, m, n takie, że zachowana jest równość {a, b} = {km 2 - kn 2 , 2kmn} .

W szczególności oznacza to, że a <b 2 i b <a 2 , tak dla wejścia A może po prostu sprawdzić, czy 2 + b 2 jest idealny dla każdego kwadratu B w {1, ... 2 } .

Kod

: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

JavaScript ES6, 60 62

Taki sam jak inne odpowiedzi, sprawdzanie od 1 do * a-1

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

Dzięki @ Mwr247 najkrótszym sposobem na zbudowanie zakresu w ES6

2 bajty zaoszczędzone dzięki produkcji @ETH


Niesamowite! Myślę, że możesz zaoszczędzić kilka bajtów dzięki wbudowanemu:a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
ETHproductions

@ETHproductions thx, muszę dowiedzieć się więcej o nowych wbudowanych funkcjach matematycznych
edc65

Dogodnie są one również omawiane na stronie, którą już dowiązałeś. (Sam bym zasugerował hipotezę, ale nie byłem wtedy zalogowany).
Neil

3

C, 96 bajtów

Na przemian zwiększaj y(druga noga) i z(przeciwprostokątna), aż ich różnica spadnie do 1. Generuj każdy dokładny wynik ( c==0), jaki napotkasz po drodze.

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));}

Wywołaj skompilowany program z parametrem n jako parametrem; wyświetli rozdzieloną spacjami listę liczb dziesiętnych.

Oczywiście nie najkrótszy; Mogę znaleźć ukojenie w najszybszym.

$ 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 bajtów

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

Używam nieudokumentowanej formy Solve: gdy lista zmiennych jest pominięta, wówczas Solvedomyślnie rozwiązuje wszystkie symbole w wyrażeniu. W ten sposób oszczędzamy 6 bajtów nad bardziej regularnymi Solve[#^2+b^2==c^2,{b,c},PositiveIntegers].

PositiveIntegersjest nowy w wersji 12 Mathematica i dlatego nie jest dostępny w TIO . W wersji stacjonarnej Mathematica otrzymujemy

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

Python 2, 53 bajty

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

Proste rozwiązanie wykorzystujące kompleks absdo obliczenia długości przeciwprostokątnej. n*nPonieważ można bezpiecznie stosować jako górną granicę dla drugiej nogi (n*n)^2 + n^2 < (n*n+1)^2. Zamiast tego spróbowałem użyć rekurencji, ale nie otrzymałem nic krótszego.


2

Poważnie, 20 bajtów

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

Ta sama strategia, co w pytaniu xnor: sprawdź i in range(1,n*n)wartości gdzie abs(i+nj) % 1 == 0i wypisz listę. Wypróbuj online

Wyjaśnienie:

,;╗    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 znaków, 746 bajtów

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}

komentarz:

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

Pomysł byłby uwzględniony na wejściu, aby poznać możliwe m, n, które generują przy użyciu t wszystkich potrójnych Pythagorianów, które mają dane wejściowe jako nogę. Test:

  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 bajtów SBCS

Anonimowa ukryta funkcja prefiksu.

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

Wypróbuj online!

×⍨ kwadrat (podświetlone selfie z mnożenia) argumentu

() Zastosuj następującą anonimową funkcję ukrytą:

t ntegers 1 poprzez argument

 pomnóż przez t ntegers 1 przez argument (tj. kwadrat)

⊢() Zastosuj następującą anonimową ukrytą funkcję z argumentem jako lewym argumentem:

  + jest sumą

   członek

   to?

Okazy prawd


1

Perl 5, 43 bajtów

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

Jeśli chcesz, aby skrypt się zakończył, możemy sprawdzić tylko inne nogi do n², jak wyjaśniono przez xnor , więc mamy 48 bajtów:

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

1

Japt , 16 bajtów

1oU² f@!(MhXU %1

Wypróbuj online!

Jak to działa

        // 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 bajtów

nDLn+Ųƶ0K

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

nDLʒnIn+Ų

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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 bajtów

²╒gƲk²+°

Wypróbuj online!

Nie można znaleźć dobrego sposobu na usunięcie któregokolwiek ², który zajmuje 3/9 bajtów. W przeciwnym razie jest to dość proste

Wyjaśnienie

²           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

Java 8, 72 bajty

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

Wypróbuj online.

Wyjaśnienie:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.