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 n
jest 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 golf golfowy , więc wygrywa najkrótszy kod w bajtach w każdym języku.
code-golf
number
decision-problem
ETHprodukcje
źródło
źródło
Odpowiedzi:
Haskell , 23 bajty
EDYTOWAĆ:
$
.Anonimowa funkcja przyjmuje
Int
i zwraca aChar
.Dane wyjściowe dotyczą
'1'
liczb trójkątnych i'0'
innych.Wypróbuj online!
((!!)$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
źródło
(!!)$show.(10^)=<<[0..]
.Python , 24 bajty
Wypróbuj online!
Wyjścia
False
dla liczb trójkątnych,True
dla reszty. Sprawdza, czy8*n+1
jest 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ą.źródło
(1<<10000)**.5
: OverflowError: int za duży, aby go przekonwertować na zmiennoprzecinkowyGalaretka , 4 bajty
Wypróbuj online!
W jaki sposób?
źródło
/
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.Siatkówka , 10 bajtów
Dane wejściowe są jednostkowe. Dane wyjściowe to
0
lub1
.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
(.)\1
celu 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:
źródło
(^|1\1)+$
działa?+
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.\G
!Python 2 , 25 bajtów
Sprawdza, czy ( 8x + 1 ) jest liczbą kwadratową.
Wypróbuj online!
źródło
Mathematica, 16 bajtów
Zasadniczo port rozwiązania xnor w Pythonie . Wyjścia
True
dla liczb trójkątnych, wFalse
przeciwnym razie.źródło
JavaScript (ES6),
3027 bajtówZaoszczędzono 2 bajty dzięki kamoroso94
Przypadki testowe
Pokaż fragment kodu
Wersja nierekurencyjna (ES7), 19 bajtów
Odpowiedź Portu Adnana .
źródło
f=(n,k=1)=>n>0?f(n-k,k+1):!n
?k
.undefined
wartości początkowej ; Twoja edycja była przyjemnością przeczytać po tym, jak samodzielnie dotarłem do twojego wcześniejszego rozwiązania.CJam , 11 bajtów
Wyjścia
1
dla trójkątnych, w0
przeciwnym razie.Wypróbuj online!
Wyjaśnienie
Rozważ wejście
21
.źródło
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:
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)
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
źródło
Galaretka , 5 bajtów
Wypróbuj online!
tło
Niech n będzie wejściem. Jeśli n jest k- tą trójkątną liczbą, to mamy
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
źródło
PowerShell ,
3130 bajtówWypró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.
źródło
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ą
n
na 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ę
1
tak, abyśmy otrzymywali kolejne liczby całkowite za każdym razem, gdy uruchamiamy, dla drugiego stosu ustawiamy ją0
tak, aby nigdy nie zmieniać różnicy, to znaczy, że zawsze pozostaje 1. Oto jak ustawiony jest stos na początku, gdzien
jest dane wejściowe: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
1
liczbę trójkątną i liczbę0
inną niż trójkątna.Kod z adnotacjami
Oto 50-bajtowe rozwiązanie, które mi się podoba.
Wypróbuj online!
źródło
Cubix , 23
2425bajtów0 za prawdę i nic
0za 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!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\.uO@
odzwierciedla dolną powierzchnię, brak operacji, zawracanie, wyjście i zatrzymanie.@
zatrzymaj się;qWs)/su
odejmują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.źródło
.
na kostce, ale1
w kodzie.05AB1E ,
76 bajtówEDYCJA : Dzięki @Dennis: Zapisałem bajt, ponieważ zapomniałem o operatorze przyrostowym
Wypróbuj online!
n
jest trójkątny, jeślisqrt(8n + 1)
jest liczbą całkowitąJak to działa
źródło
t.ï
mogą to byćŲ
dni dzisiejsze, które są wbudowanym narzędziem sprawdzającym, czy liczba jest kwadratem.Perl 6 , 17 bajtów
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+...+$_)
.źródło
Alice ,
3822 bajtówWiele bajtów zaoszczędzonych dzięki Martinowi i Leo
Kończy się nowa linia. Wyjścia
1
dla trójkątnych, w0
przeciwnym 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ę
gdzie
i
io
są w trybie porządkowym.Rozważ dane wejściowe
21
jako przykład.źródło
...h*-no@
)Japt ,
107 bajtówZaoszczędź 3 bajty dzięki produktom @Luke i @ETH
Wypróbuj online!
Wyjaśnienie:
Wyjaśnienie:
Wypróbuj online!
źródło
*8Ä ¬u1 c
dla 9B (wyjścia 0, jeśli wejście jest trójkątne, 1 w przeciwnym razie)u1 c
nav1
, jak sądzę (przełączanie wyjść)R ,
2319 bajtówPodobne podejście jak inne odpowiedzi. Sprawdza, czy
8x+1
jest to idealny kwadrat.-4 bajty dzięki Giuseppe i MickyT.
Wypróbuj online!
źródło
!
zamiast==0
!(8*scan()+1)^.5%%1
MATL , 5 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
t:Ys=a
. Zapomniałem om
:-)m
dopóki nie zobaczyłem tej odpowiedzi . Zabawne, że obie odpowiedzi są prawie identyczne: DPartia, 72 bajty
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.
źródło
JavaScript (ES7),
1918 bajtówOd mojej odpowiedzi do powiązanego pytania .
Dane wyjściowe
false
dla liczb trójkątnych lubtrue
dla innych niż trójkątne, jak dopuszcza PO.Spróbuj
źródło
n=>(8*n+1)**.5%1>0
(który odwróciłby dane wyjściowe)PHP, 30 bajtów
Drukuje 1 za prawdę, a nic za fałsz
Wypróbuj online!
fmod
PHP, 37 bajtów
Drukuje 1 za prawdę, a nic za fałsz
Wypróbuj online!
źródło
Mathematica, 28 bajtów
źródło
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.Pari / GP , 18 bajtów
Wypróbuj online!
Istnieje wbudowana funkcja sprawdzania, czy liczba jest liczbą wielokątną, ale jest o jeden bajt dłużej.
Pari / GP , 19 bajtów
Wypróbuj online!
źródło
Excel,
3122 bajtów9 bajtów zapisanych dzięki Octopus
Wyjścia
TRUE
dla liczb trójkątnych. IndziejFALSE
. Sprawdza, czy8*n+1
jest to idealny kwadrat.źródło
=MOD(SQRT(8*A1+1),1)=0
oszczędza kilka bajtówBrachylog , 5 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Fouriera , 26 bajtów
Wypróbuj online!
źródło
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
źródło
APL (Dyalog) , 6 bajtów
Wypróbuj online!
Wyjaśnienie
Dane wyjściowe
0
dla false i1
true.źródło
TI-BASIC,
107 bajtów-3 dzięki @lirtosiast
Włącza dane wejściowe
X
. Sprawdza, czy√(8X+1)
jest liczbą całkowitąźródło
not(fPart(√(8Ans+1
?