Czy ta liczba jest trójkątna?

33

Wyzwanie

Biorąc pod uwagę dodatnią liczbę całkowitą, określ, czy jest to liczba trójkątna, i odpowiednio wyślij jedną z dwóch stałych, odrębnych wartości.

Definicja

Liczba trójkątna to liczba, którą można wyrazić jako sumę kolejnych liczb całkowitych dodatnich, zaczynając od 1. Można je również wyrazić wzorem n(n + 1) / 2, w którym njest pewna liczba całkowita dodatnia.

Przypadki testowe

Prawda:

1
3
6
10
15
21
55
276
1540
2701
5050
7626
18915
71253
173166
222111
303031
307720
500500
998991

Falsy:

2
4
5
7
8
9
11
16
32
50
290
555
4576
31988
187394
501500
999999

Zasady

  • Wpis może być funkcją lub programem.
  • Możesz założyć, że wejście jest dodatnią liczbą całkowitą poniżej 10 6 .
  • Musisz wybrać dwa stałe, różne wyniki, aby rozróżnić dwie kategorie.

To jest , więc wygrywa najkrótszy kod w bajtach w każdym języku.

ETHprodukcje
źródło
1
Powiązane , powiązane .
ETHprodukcje
Powiązane
Kudłaty
Dlaczego nie podałeś zera?
Neil
1
@Neil Chciałem zminimalizować liczbę możliwych przypadków krawędzi, a obsługa zera jest jednym z nich, który moim zdaniem nie był zbyt ważny. Czy uważasz, że byłoby lepiej, gdyby zerowe trzeba było obsłużyć? (Na przykład odpowiedź Jelly kończy się na zero)
ETHprodukcje

Odpowiedzi:

21

Haskell , 23 bajty

EDYTOWAĆ:

  • -1 bajt: @ xnor pozbył się nawiasów za pomocą $.

Anonimowa funkcja przyjmuje Inti zwraca a Char.

Dane wyjściowe dotyczą '1'liczb trójkątnych i '0'innych.

(!!)$show.(10^)=<<[0..]

Wypróbuj online!

  • Użyj jako ((!!)$show.(10^)=<<[0..]) 998991.
  • Generuje liczby 1, 10, 100, 1000, ..., konwertuje je na ciągi i łączy je. Następnie indeksuje do powstałego nieskończonego ciągu

    "1101001000100001000001000000...
Ørjan Johansen
źródło
6
Pomysłowa metoda! Możesz zapisać bajt za pomocą (!!)$show.(10^)=<<[0..].
xnor
20

Python , 24 bajty

lambda n:(8*n+1)**.5%1>0

Wypróbuj online!

Wyjścia Falsedla liczb trójkątnych, Truedla reszty. Sprawdza, czy 8*n+1jest to idealny kwadrat. Python weźmie idealne kwadraty, aby uzyskać dokładne liczby całkowite bez względu na to, jak duże, więc nie występują problemy z liczbą zmiennoprzecinkową.

xnor
źródło
3
(1<<10000)**.5: OverflowError: int za duży, aby go przekonwertować na zmiennoprzecinkowy
isaacg
@isaacg Wyzwanie nie wymaga tak dużych danych wejściowych: „Możesz założyć, że wartość wejściowa jest dodatnią liczbą całkowitą poniżej 10 ^ 6”
trichoplax
1
@trichoplax Myślę, że kwestionowałem twierdzenie Xnora w tekście. Zgadzam się, że przesyłanie jest w porządku.
isaacg
13

Galaretka , 4 bajty

R+\ċ

Wypróbuj online!

W jaki sposób?

R+\ċ - Main link: n
R    - range(n)   -> [1,2,3,...,N]
  \  - cumulative reduce by:
 +   -   addition -> [1,3,6,...,T(N)]
   ċ - count occurrences of right (n) in left -> 1 if triangular, 0 otherwise
Jonathan Allan
źródło
Dziwię się, że skumulowane zmniejszenie nie powoduje automatycznego utworzenia zasięgu. Czy kryje się za tym jakiś projekt?
ETHprodukcje
Nie jestem w 100% pewien, ale myślę, że byłoby to konieczne (przynajmniej obecnie) przez zmniejszenie operacji dyadycznej, co spowodowałoby zwiększenie zasięgu.
Jonathan Allan
... w rzeczywistości nawet to nie wydaje się mieć zastosowania (np. to vs to . Wydaje się, że implementacja szybkiego łącza zastępuje taki, że iterowalność nie tworzy zakresu, nawet jeśli operacja dynamiczna definiuje to jako argument. Pinged Dennis do pola ten :)
Jonathan Allan
@ETHproductions /i \prawdopodobnie były jednymi z pierwszych pięciu metod szybkiego wprowadzania, które poprzedzały pomysł użycia argumentów liczb całkowitych w zakresie.
Dennis
13

Siatkówka , 10 bajtów

(^1|1\1)+$

Dane wejściowe są jednostkowe. Dane wyjściowe to 0lub 1.

Wypróbuj online! (Jako zestaw testów, który dla wygody wykonuje konwersję dziesiętną na unarską).

Wyjaśnienie

Jest to najbardziej podstawowe ćwiczenie w referencjach. Większość ludzi zna rereferencje wyrażeń regularnych, np. W (.)\1celu dopasowania powtarzanego znaku. Jednak niektóre bardziej zaawansowane smaki pozwalają na użycie odwołania wstecznego przed lub w grupie, do której się odnosi. W takim przypadku jest to zwykle nazywane odniesieniem do przodu. Może to mieć sens, jeśli odwołanie zostanie powtórzone. Może nie być dobrze zdefiniowane przy pierwszej iteracji, ale przy kolejnych iteracjach późniejsza lub otaczająca grupa uchwyciła coś i może być ponownie użyta.

Jest to najczęściej używane do implementowania powtarzających się wzorców na jednorzędowych ciągach. W tym przypadku próbujemy dopasować dane wejściowe jako sumę kolejnych liczb całkowitych:

(        # This is group 1, which we'll repeat 1 or more times.
  ^1     #   Group 1 either matches a single 1 at the beginning of the string.
|        # or
  1\1    #   It matches whatever the previous iteration matched, plus another
         #   1, thereby incrementing our counter.
         # Note that the first alternative only works on the first iteration
         # due to the anchor, and the second alternative only works *after*
         # the first iteration, because only then the reference is valid.
)+
$        # Finally, we make sure that we can exactly hit the end of the
         # string with this process.
Martin Ender
źródło
1
Dlaczego nie (^|1\1)+$działa?
Leaky Nun
3
Silniki wyrażeń regularnych @LeakyNun mają optymalizację polegającą na tym, że przestają powtarzać grupę, jeśli była pusta n razy, gdzie n jest minimum używanego kwantyfikatora (w twoim przypadku 1; jeśli minimum wynosi 0, to i tak zostanie wypróbowane raz) . Jeśli zmienisz +się {2,}, to powinno działać. Ta optymalizacja zapobiega nieskończonym pętlom, ale jest też jedyną rzeczą, która sprawia, że ​​regex .NET nie jest sam w sobie Turing-complete.
Martin Ender
To właśnie zaoszczędziło mi 70 bajtów: codegolf.stackexchange.com/a/118387
Neil
Zrób te 74 bajty, dzięki \G!
Neil
8

Mathematica, 16 bajtów

OddQ@Sqrt[1+8#]&

Zasadniczo port rozwiązania xnor w Pythonie . Wyjścia Truedla liczb trójkątnych, w Falseprzeciwnym razie.

ngenisis
źródło
7

JavaScript (ES6), 30 27 bajtów

Zaoszczędzono 2 bajty dzięki kamoroso94

f=(n,k)=>n>0?f(n+~k,-~k):!n

Przypadki testowe

Wersja nierekurencyjna (ES7), 19 bajtów

Odpowiedź Portu Adnana .

x=>(8*x+1)**.5%1==0
Arnauld
źródło
Dopiero teraz widzę, że edytowałeś 19-bajtowe rozwiązanie w swojej odpowiedzi na kilka minut przed wysłaniem mojego . Czy powinienem usunąć mój? Jaka jest ogólnie przyjęta etykieta?
Kudłaty
1
@Shaggy Nie sądzę, żeby to był prawdziwy problem. Moja „główna” odpowiedź naprawdę jest rekurencyjna.
Arnauld
Zmniejszyć do 28 bajtów za pomocą f=(n,k=1)=>n>0?f(n-k,k+1):!n?
kamoroso94
1
@ kamoroso94 Thanks! Zaktualizowano Trzeci bajt został zapisany przez pominięcie inicjalizacji k.
Arnauld
Eleganckie użycie bitowego NOT jako inkrementatora dla undefinedwartości początkowej ; Twoja edycja była przyjemnością przeczytać po tym, jak samodzielnie dotarłem do twojego wcześniejszego rozwiązania.
apsillers
6

CJam , 11 bajtów

ri2*_mQ_)*=

Wyjścia 1dla trójkątnych, w 0przeciwnym razie.

Wypróbuj online!

Wyjaśnienie

Rozważ wejście 21.

ri               e# Input integer.             STACK: 21
  2*             e# Multiply by 2.             STACK: 42
    _            e# Duplicate.                 STACK: 42, 42
     mQ          e# Integer square root.       STACK: 42, 6
       _)        e# Duplicate, increment.      STACK: 42, 6, 7
         *       e# Multiply.                  STACK: 42, 42
          =      e# Equal?                     STACK: 1
Luis Mendo
źródło
6

Brain-Flak , 40 bajtów

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

Wheat Wizard i ja mieliśmy pojedynek na to pytanie. Kiedy zdecydowaliśmy się opublikować nasze rozwiązania, byliśmy związani 42 bajtami, ale znalazłem 2-bajtowy golf jego rozwiązania. Zdecydowaliśmy, że będzie się liczyć jako remis (moje rozwiązanie jest poniżej).

Wypróbuj online!

Wyjaśnienie:

# Set up the stacks like this:  -input
                                     1     -input
                                     1          1
(([{}](((()))<>))<>)                 ^

# Output 1 for triangular and 0 for non-triangular 
{<>({}({}({})))}{}{}

Aby uzyskać pełne wyjaśnienie, zobacz odpowiedź Kreatora pszenicy .


Brain-Flak , 42 bajty

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

Wyjścia 0\n(dosłowna nowa linia) dla prawdy, a pusty ciąg dla fałszu.

Chodzi o to, aby odjąć 1, a następnie 2, a następnie 3 aż do wejścia. Jeśli trafisz 0, to wiesz, że jest to trójkątna liczba, więc możesz się tam zatrzymać.

Wypróbuj online! (prawda)
Wypróbuj online! (falsy)

# Push -input on both stacks. One is a counter and the other is a running total
(([({})])<>)

# Count up from -input to 0
{
  # Push the new total which is: (counter += 1) + total (popped) + input (not popped)
  # This effectively adds 1, then 2, then 3 and so on to the running total
  (({}())<>{}({}))
  # If not 0
  {
    # Push to 0s and switch stacks to "protect" the other values
    ((<>))
  # End if
  }
  # Pop the two 0s, or empty the stack if we hit 0
  {}{}
# End loop
}

Oto 46 bajtowe rozwiązanie, które uznałem za interesujące.

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

Wyjścia 0\n (dosłowna nowa linia) dla prawdy, pusty ciąg dla fałszu.

Chodzi o to, aby odliczać od danych wejściowych kolejne liczby, po jednym na raz. Np input - (1) - (1,1) - (1,1,1). Za każdym razem, gdy odejmujemy, jeśli nie mamy jeszcze 0, zostawiamy dodatkową wartość na stosie. W ten sposób, jeśli mamy 0 i nadal odejmujemy, kiedy pop, usuwamy ostatnią wartość ze stosu. Jeśli dane wejściowe były liczbą trójkątną, zakończymy dokładnie na 0 i nie wstawimy 0.

Wypróbuj online! truey
Wypróbuj online! fałsz

# Implicit input (call it I)

# Until we reach 0, or the stack is empty
{
  # Add 1 to the other stack and push it twice. This is our counter.
  <>(({}()))
  # While counter != 0
  {
    # counter -= 1
    ({}[()]
    # if I != 0 
    <>{
      # I -= 1, and push 0 to escape the if
      (<({}[()])>)
    # End if
    }
    # Pop from the stack with I. This is either the 0 from the if, or I
    {}
    # Get ready for next loop End while
    <>)
  # End While
  }
  # Pop the counter that we were subtracting from
  {}<>
# End Until we reach 0, or the stack is empty.
}
Riley
źródło
6

Galaretka , 5 bajtów

×8‘Ʋ

Wypróbuj online!

tło

Niech n będzie wejściem. Jeśli n jest k- trójkątną liczbą, to mamy

n=k(k+1)2)k2)+k-2)n=0k=12)(-1±1+8n),

co oznacza, że ​​będzie naturalne rozwiązanie wtedy i tylko wtedy, gdy 1 + 8n jest nieparzystym, idealnym kwadratem. Oczywiście, sprawdzanie parzystości 1 + 8n nie jest wymagane.

Jak to działa

×8‘Ʋ  Main link. Argument: n

×8     Yield 8n.
  ‘    Increment, yielding 8n + 1.
   Ʋ  Test if the result is a perfect square.
Dennis
źródło
5

PowerShell , 31 30 bajtów

"$args"-in(1..1e6|%{($s+=$_)})

Wypróbuj online!

Ładna i powolna metoda brutalnej siły. Zrób tablicę każdej sumy od 1 do 10 6 i sprawdź, czy jest tam argument.

briantist
źródło
5

Brain-Flak , 42 bajty

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

Wypróbuj online!

Wyjaśnienie

Celem tego programu jest utworzenie stanu na dwóch stosach i wykonywanie stałej operacji na obu stosach, aż jeden z nich będzie zerowy, a następnie możemy generować dane wyjściowe w zależności od tego, na którym stosie się znajdujemy. Jest to podobne do programów, które określają znak liczby. Programy te umieszczane są nna jednym stosie i-n drugi, dodając jeden i zamieniając stosy, aż jeden ze stosów wyniesie zero. Jeśli liczba była ujemna na pierwszym miejscu, pierwszy stos osiągnie zero, jeśli liczba była dodatnia, drugi stos osiągnie zero.

Tutaj tworzymy dwa stosy, jeden odejmujący kolejne liczby od danych wejściowych i jeden, który po prostu odejmuje jeden. Ten, który odejmuje kolejne liczby, zakończy się tylko wtedy, gdy liczba będzie trójkątna (w przeciwnym razie przejdzie po prostu zero i przejdzie do wartości ujemnych). Drugi zawsze kończy się dla dowolnej liczby dodatniej, ale zawsze robi to wolniej niż pierwszy, dlatego liczby inne niż trójkątne kończą się na tym stosie.

Jak więc ustawić stosy, aby ta sama operacja odejmowała kolejne liczby od siebie i odejmowała jedną od drugiej? Na każdym stosie mamy wejście na górze, aby można było sprawdzić, poniżej mamy różnicę, a poniżej różnicę różnic. Za każdym razem, gdy uruchamiamy, dodajemy „różnicę różnicy” do zwykłej „różnicy” i odejmujemy ją od danych wejściowych. Dla stosu, który sprawdza trójkątność, ustawiamy naszą podwójną różnicę 1tak, abyśmy otrzymywali kolejne liczby całkowite za każdym razem, gdy uruchamiamy, dla drugiego stosu ustawiamy ją 0tak, aby nigdy nie zmieniać różnicy, to znaczy, że zawsze pozostaje 1. Oto jak ustawiony jest stos na początku, gdzie njest dane wejściowe:

-n  -n
 0   1
 1   0

Kiedy w końcu zakończymy, możemy użyć tych różnic, aby sprawdzić, na którym stosie się znajdujemy, podnosimy dwie górne wartości i otrzymujemy 1liczbę trójkątną i liczbę 0inną niż trójkątna.


Kod z adnotacjami

(([{}](<((())<>)>))<>) Set up the stack
{                      While
 <>                    Switch stacks
 ({}({}({})))          Add bottom to second to bottom, add second to bottom to top
}                      End while
{}{}                   Pop the top two values

Oto 50-bajtowe rozwiązanie, które mi się podoba.

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

Wypróbuj online!

Kreator pszenicy
źródło
5

Cubix , 23 24 25 bajtów

I1Wq/)s.;0..s;p-?\.+O@u

0 za prawdę i nic 0 za falsey. Brutuje siły, zwiększając licznik, dodając do sumy łącznej i porównując z danymi wejściowymi. Teraz spróbuj dopasować go do kostki 2x2x2. Zrobił to!

    I 1
    W q
/ ) s . ; 0 . .
s ; p - ? \ . +
    O @
    u .

Wypróbuj online!

  • / Zastanów się twarzą w twarz.
  • I10\ uzyskaj liczbę całkowitą, wciśnij 1 (licznik), wciśnij 0 (suma) i odbij
  • +s;p-pętla ciała. Dodaj sumę i licznik, upuść poprzednią sumę, zwiększ dane wejściowe i odejmij
  • ? Przetestuj wynik odejmowania
    • Dla 0 wyników kontynuacja na wprost \.uO@ odzwierciedla dolną powierzchnię, brak operacji, zawracanie, wyjście i zatrzymanie.
    • Aby uzyskać pozytywny wynik, skręć w prawo w dolną powierzchnię i @ zatrzymaj się
    • Aby uzyskać wynik ujemny, skręć w lewo ;qWs)/suodejmując kroplę, umieść dane na dole, przesuń w lewo, licznik i sumę swapu, licznik przyrostów, odbijaj, sumę swapu i licznik, zawróć w kierunku głównego korpusu pętli.
MickyT
źródło
Tak kusząco blisko ... ten ostatni bajt wymaga jednak dużego wysiłku i sprytu.
ETHprodukcje
Tak, myślałem, że go mam, ale jest nieuchwytny
MickyT
1
@ETHproductions znalazł bajt
MickyT
Twój kod i rozłożona kostka wydają się różne, prawy dolny róg znajduje się .na kostce, ale 1w kodzie.
Wheat Wizard
@WheatWizard Dzięki za to, zła edycja z mojej strony
MickyT
4

05AB1E , 7 6 bajtów

EDYCJA : Dzięki @Dennis: Zapisałem bajt, ponieważ zapomniałem o operatorze przyrostowym

8*>t.ï

Wypróbuj online!

njest trójkątny, jeśli sqrt(8n + 1)jest liczbą całkowitą

Jak to działa

8* # multiply implicit input by 8
  > # add one
   t # sqrt
    .ï # is integer
Neil A.
źródło
Prawdopodobnie nie było jeszcze w tym czasie dostępne, ale t.ïmogą to być Ųdni dzisiejsze, które są wbudowanym narzędziem sprawdzającym, czy liczba jest kwadratem.
Kevin Cruijssen
4

Perl 6 , 17 bajtów

{$_∈[\+] 1..$_}

Sprawdza tylko, czy $_dane wejściowe do funkcji są równe dowolnemu z elementów trójkątnej redukcji dodawania (1, 1+2, ..., 1+2+...+$_).

Sean
źródło
4

Alice , 38 22 bajtów

Wiele bajtów zaoszczędzonych dzięki Martinowi i Leo

/ i \ 2 * .2RE.h * -n / o @

Kończy się nowa linia. Wyjścia 1dla trójkątnych, w 0przeciwnym razie.

Wypróbuj online!

Wyjaśnienie

To używa tego samego podejścia, co moja odpowiedź CJam , tylko niezgrabnie. W postaci zlinearyzowanej program staje się

i2*.2RE.h*-no@

gdzie ii osą w trybie porządkowym.

Rozważ dane wejściowe 21jako przykład.

i         Input integer                       STACK: 21
2*        Multiply by 2                       STACK: 42
.         Duplicate                           STACK: 42, 42
2RE       Integer square root                 STACK: 42, 6
.         Duplicate                           STACK: 42, 6, 6
h         Increment                           STACK: 42, 6, 7
*         Multiply                            STACK: 42, 42
-         Subtract                            STACK: 0
n         Logical negation                    STACK: 1
o         Output integer                      STACK:
@         End program
Luis Mendo
źródło
Moja pierwsza odpowiedź Alice
Luis Mendo
1
Mam wrażenie, że można to z grubsza zmniejszyć o połowę za pomocą jednej ze fantazyjnych struktur kontrolnych Martina ...
ETHproductions
Więc czy ja ... :-)
Luis Mendo
Mój pierwszy golf Alice: Ten sam kod, 23 bajty
Nitrodon
Byłby to bardziej „standardowy” układ dla tego rodzaju programu . To powiedziawszy, możesz pozbyć się 1 na stosie i po prostu wypisać logiczną negację odejmowania (tj. ...h*-no@)
Leo
4

Japt , 10 7 bajtów

Zaoszczędź 3 bajty dzięki produktom @Luke i @ETH

*8Ä ¬v1

Wypróbuj online!

Wyjaśnienie:

*8Ä ¬v1
    ¬    // Square root of:
*8       //   Input * 8
  Ä      //   +1
     v1  // Return 1 if divisible by 1; Else, return 0

õ å+ øU

Wyjaśnienie:

õ å+ øU
õ           // Create a range from [1...Input]
  å+        // Cumulative reduce by addition
     øU     // Does it contain the input?

Wypróbuj online!

Oliver
źródło
Pytanie wymaga dwóch stałych odrębnych wyjść.
xnor
*8Ä ¬u1 cdla 9B (wyjścia 0, jeśli wejście jest trójkątne, 1 w przeciwnym razie)
Łukasz
@Luke Możesz zmienić u1 cna v1, jak sądzę (przełączanie wyjść)
ETHproductions
7 bajtów? Miły! Jakoś tego nie zauważyłem, publikując swoje własne, podobne rozwiązanie w ostatniej chwili. Daj mi znać, jeśli chcesz, żebym go usunął.
Kudłaty
4

R , 23 19 bajtów

Podobne podejście jak inne odpowiedzi. Sprawdza, czy 8x+1jest to idealny kwadrat.
-4 bajty dzięki Giuseppe i MickyT.

!(8*scan()+1)^.5%%1

Wypróbuj online!

Robert S.
źródło
2
możesz użyć !zamiast==0
Giuseppe
Jest to bardzo miłe, ponieważ jest również wektoryzowane!
Giuseppe,
1
Myślę, że można także pozbyć się zewnętrznych wsporników!(8*scan()+1)^.5%%1
MickyT,
3

MATL , 5 bajtów

t:Ysm

Wypróbuj online!

Wyjaśnienie:

t       % Duplicate input
 :      % Range(1, input)
  Ys    % Cumulative sum. This will push the first *n* triangular numbers
    m   % ismember. Pushes true if the input is contained within the array we just pushed
DJMcMayhem
źródło
Miałem zamiar pisać t:Ys=a. Zapomniałem o m:-)
Luis Mendo
1
@LuisMendo, o których nie wiedziałem, mdopóki nie zobaczyłem tej odpowiedzi . Zabawne, że obie odpowiedzi są prawie identyczne: D
DJMcMayhem
3

Partia, 72 bajty

@set/aj=i=0
:l
@if %1% gtr %j% set/aj+=i+=1&goto l
@if %1==%j% echo 1

Wyjście 1 w przypadku sukcesu, nic w przypadku niepowodzenia. Działa również na zero, choć z jakiegoś powodu nie jest wymagane przez pytanie.

Neil
źródło
3

JavaScript (ES7), 19 18 bajtów

Od mojej odpowiedzi do powiązanego pytania .

Dane wyjściowe falsedla liczb trójkątnych lub truedla innych niż trójkątne, jak dopuszcza PO.

n=>(8*n+1)**.5%1>0

Spróbuj

f=
n=>(8*n+1)**.5%1>0
oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>

Kudłaty
źródło
Myślę, że możesz zapisać bajt za pomocą n=>(8*n+1)**.5%1>0(który odwróciłby dane wyjściowe)
ETHprodukcje
@ETHproductions: OK, o ile na to pozwalasz. Czy robienie tego jest zwykle dozwolone?
Kudłaty
1
To kwalifikuje się jako „dwa stałe, różne wyniki”, więc tak. Inne wyzwania związane z podejmowaniem decyzji mogą jednak wymagać prawdy / fałszu.
ETHprodukcje
3

PHP, 30 bajtów

Drukuje 1 za prawdę, a nic za fałsz

<?=fmod(sqrt(8*$argn+1),2)==1;

Wypróbuj online!

fmod

PHP, 37 bajtów

Drukuje 1 za prawdę, a nic za fałsz

<?=($x=sqrt($q=2*$argn)^0)*$x+$x==$q;

Wypróbuj online!

Jörg Hülsermann
źródło
3

Mathematica, 28 bajtów

!Accumulate@Range@#~FreeQ~#&
J42161217
źródło
Polecam zastąpienie 7!przez #. Po pierwsze, jest krótszy; co ważniejsze, obecne rozwiązanie nie jest poprawne, ponieważ sztucznie nakłada ograniczenie na wielkość danych wejściowych, na których pracuje.
Greg Martin
1
OP mówi: „Możesz założyć, że wartość wejściowa jest dodatnią liczbą całkowitą poniżej 10 ^ 6”. Ale podoba mi się twój pomysł i wezmę go, chociaż mój daje właściwy wynik dla każdego przypadku przy użyciu listy 5040 elementów, ale twój najgorszy przypadek potrzebuje listy 999999 elementów. Dzięki za wskazówkę!
J42161217
1
Ups, przepraszam, nie widziałem komentarza OP! Tak, istnieją pewne „przewrotne” bodźce w grze w golfa kodowego: te 1-bajtowe oszczędności są ważniejsze w kwestii gry w golfa niż cała wydajność na świecie :)
Greg Martin
3

Excel, 31 22 bajtów

9 bajtów zapisanych dzięki Octopus

Wyjścia TRUEdla liczb trójkątnych. Indziej FALSE. Sprawdza, czy 8*n+1jest to idealny kwadrat.

=MOD(SQRT(8*B1+1),1)=0
Wernisch
źródło
1
=MOD(SQRT(8*A1+1),1)=0oszczędza kilka bajtów
Octopus
2

Brachylog , 5 bajtów

≥ℕ⟦+?

Wypróbuj online!

Wyjaśnienie

≥ℕ⟦+?
≥ℕ     There is a number from 0 to {the input} inclusive
  ⟦    such that the range from 0 to that number
   +   has a sum
    ?  that equals the input

źródło
2

Python - 52 bajty

Uwaga: Wiem, że pozostałe dwie odpowiedzi w języku Python są znacznie krótsze, ale jest to oldskulowy sposób, bardziej ręczny algorytm

n=input();i=s=0
while s<n:s=(i*i+i)/2;i+=1
print s>n
Pan Xcoder
źródło
2

APL (Dyalog) , 6 bajtów

⊢∊+\∘

Wypróbuj online!

Wyjaśnienie

⊢∊+\∘
                       Creates a range from 1 to the right_argument
  +\                    Cumulative sum of this range; 1 1+2 1+2+3 .. 1+2+..+n. These are the triangular numbers
⊢∊                      Does the right argument belong to this list of integers in this cumulative sum

Dane wyjściowe 0dla false i 1true.

Kritixi Lithos
źródło
2

TI-BASIC, 10 7 bajtów

-3 dzięki @lirtosiast

:not(fPart(√(8Ans+1

Włącza dane wejściowe X. Sprawdza, czy √(8X+1)jest liczbą całkowitą

Scott Milner
źródło
Dlaczego nie not(fPart(√(8Ans+1?
lirtosiast
@lirtosiast To zadziała, dzięki!
Scott Milner,