Herausforderung
Bestimmen Sie bei einer positiven Ganzzahl, ob es sich um eine Dreieckszahl handelt, und geben Sie dementsprechend einen von zwei konstanten, unterschiedlichen Werten aus.
Definition
Eine Dreieckszahl ist eine Zahl, die als Summe aufeinanderfolgender positiver Ganzzahlen ab 1 ausgedrückt werden kann. Sie kann auch mit der Formel ausgedrückt werden n(n + 1) / 2
, bei der n
es sich um eine positive Ganzzahl handelt.
Testfälle
Wahrheit:
1
3
6
10
15
21
55
276
1540
2701
5050
7626
18915
71253
173166
222111
303031
307720
500500
998991
Falsch:
2
4
5
7
8
9
11
16
32
50
290
555
4576
31988
187394
501500
999999
Regeln
- Ihr Eintrag kann eine Funktion oder ein Programm sein.
- Sie können annehmen, dass die Eingabe eine positive ganze Zahl unter 10 6 ist .
- Sie müssen zwei konstante, unterschiedliche Ausgaben auswählen, um die beiden Kategorien zu unterscheiden.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes in jeder Sprache.
code-golf
number
decision-problem
ETHproductions
quelle
quelle
Antworten:
Haskell , 23 Bytes
BEARBEITEN:
$
.Eine anonyme Funktion, die eine nimmt
Int
und eine zurückgibtChar
.Die Ausgabe erfolgt
'1'
für Dreieckszahlen und'0'
für andere.Probieren Sie es online!
((!!)$show.(10^)=<<[0..]) 998991
.Erzeugt die Zahlen 1, 10, 100, 1000, ..., konvertiert diese in Zeichenfolgen und verkettet sie. Indiziert dann in die resultierende unendliche Zeichenfolge
quelle
(!!)$show.(10^)=<<[0..]
.Python , 24 Bytes
Probieren Sie es online!
Ausgänge
False
für Dreieckszahlen,True
für den Rest. Prüft, ob8*n+1
es sich um ein perfektes Quadrat handelt. Python verwendet perfekte Quadrate, um ganzzahlige Gleitkommazahlen zu erhalten, egal wie groß sie sind. Es gibt also keine Gleitkommazahlen.quelle
(1<<10000)**.5
: OverflowError: int zu groß, um in float konvertiert zu werdenGelee , 4 Bytes
Probieren Sie es online!
Wie?
quelle
/
und gehörten\
wahrscheinlich zu den ersten fünf zu implementierenden Quicks, die vor der Idee standen, ganzzahlige Argumente in range zu setzen.Retina , 10 Bytes
Die Eingabe ist unär. Ausgang ist
0
oder1
.Probieren Sie es online! (Als Testsuite, die der Einfachheit halber Dezimal-Unär-Konvertierungen durchführt.)
Erläuterung
Dies ist die grundlegendste Übung bei Vorwärtsreferenzen. Die meisten Leute sind mit Rückreferenzen in Regex vertraut, zB
(.)\1
um einem wiederholten Zeichen zu entsprechen. In einigen fortgeschrittenen Varianten können Sie jedoch einen Rückverweis vor oder innerhalb der Gruppe verwenden, auf die er sich bezieht. In diesem Fall spricht man normalerweise von einer Vorwärtsreferenz. Dies kann sinnvoll sein, wenn der Verweis wiederholt wird. Möglicherweise ist es bei der ersten Iteration nicht genau definiert, aber bei nachfolgenden Iterationen hat die spätere oder umgebende Gruppe etwas erfasst und kann wiederverwendet werden.Dies wird am häufigsten verwendet, um wiederkehrende Muster für unäre Zeichenfolgen zu implementieren. In diesem Fall versuchen wir, die Eingabe als Summe aufeinanderfolgender Ganzzahlen abzugleichen:
quelle
(^|1\1)+$
?+
zu ändern{2,}
, sollte es funktionieren. Diese Optimierung verhindert Endlosschleifen, aber es ist auch das einzige, was verhindert, dass .NET regex für sich genommen vollständig ist.\G
!Python 2 , 25 Bytes
Überprüft, ob ( 8x + 1 ) eine quadratische Zahl ist.
Probieren Sie es online!
quelle
Mathematica, 16 Bytes
Im Wesentlichen eine Portierung der Python-Lösung von xnor . Ansonsten Ausgabe
True
für DreieckszahlenFalse
.quelle
JavaScript (ES6),
3027 Bytes2 Bytes dank kamoroso94 gespeichert
Testfälle
Code-Snippet anzeigen
Nicht rekursive Version (ES7), 19 Byte
Antwort von Port of Adnan .
quelle
f=(n,k=1)=>n>0?f(n-k,k+1):!n
?k
.undefined
Anfangswert; Ihre Bearbeitung war eine Freude zu lesen, nachdem ich unabhängig zu Ihrer vorherigen Lösung gelangt war.CJam , 11 Bytes
Ausgänge
1
für Dreieck,0
sonst.Probieren Sie es online!
Erläuterung
Betrachten Sie die Eingabe
21
.quelle
Brain-Flak , 40 Bytes
Wheat Wizard und ich hatten ein Duell um diese Frage. Als wir beschlossen, unsere Lösungen zu veröffentlichen, waren wir mit 42 Bytes gebunden, aber ich fand einen 2-Byte-Golf seiner Lösung. Wir haben uns entschieden, dass dies als Gleichstand gelten würde (meine Lösung ist unten).
Probieren Sie es online!
Erläuterung:
Eine vollständige Erklärung finden Sie in der Antwort von Wheat Wizard .
Brain-Flak , 42 Bytes
Ausgaben
0\n
(Literal Newline) für Truthy und die leere Zeichenfolge für Falsy.Die Idee ist, 1, 2 und 3 bis zum Eingang zu subtrahieren. Wenn Sie 0 drücken, wissen Sie, dass dies eine dreieckige Zahl ist, sodass Sie dort anhalten können.
Probieren Sie es online! (ehrlich)
Probieren Sie es online! (falsch)
Hier ist eine 46-Byte-Lösung, die ich interessant fand.
Ausgaben
0\n
(Literal Newline) für Truthy, die leere Zeichenfolge für Falsy.Die Idee ist, von der Eingabe durch aufeinanderfolgende Zahlen jeweils 1 abwärts zu zählen. Eg
input - (1) - (1,1) - (1,1,1)
. Jedes Mal, wenn wir subtrahieren, wenn wir noch nicht bei 0 sind, belassen wir einen zusätzlichen Wert auf dem Stapel. Auf diese Weise entfernen wir den letzten Wert auf dem Stapel, wenn wir bei 0 sind und immer noch subtrahieren, wenn wir Pop ausführen. Wenn die Eingabe eine Dreieckszahl war, werden wir genau bei 0 enden und die 0 nicht einfügen.Probieren Sie es online! truthy
Online ausprobieren! falsch
quelle
Gelee , 5 Bytes
Probieren Sie es online!
Hintergrund
Sei n die Eingabe. Wenn n die k- te Dreieckszahl ist, haben wir
Das heißt, es wird eine natürliche Lösung geben, wenn 1 + 8n ein ungerades, perfektes Quadrat ist. Es ist offensichtlich nicht erforderlich , die Parität von 1 + 8n zu überprüfen .
Wie es funktioniert
quelle
PowerShell ,
31 -30 ByteProbieren Sie es online!
Nette und langsame Brute-Force-Methode. Machen Sie aus jeder Summe von 1 bis 10 6 ein Array und prüfen Sie, ob das Argument darin enthalten ist.
quelle
Brain-Flak , 42 Bytes
Probieren Sie es online!
Erläuterung
Das Ziel dieses Programms ist es, einen Status für zwei Stapel zu erstellen und eine konstante Operation für beide Stapel durchzuführen, bis einer von ihnen Null ist. Abhängig davon, auf welchem Stapel wir uns befinden, können wir dann ausgeben. Dies ähnelt Programmen, die das Vorzeichen einer Zahl bestimmen. Diese Programme legen
n
einen Stapel-n
auf den anderen und fügen einen hinzu und wechseln die Stapel, bis einer der Stapel Null ist. Wenn die Zahl an erster Stelle negativ war, schlägt der erste Stapel auf Null, wenn die Zahl positiv war, schlägt der andere Stapel auf Null.Hier erstellen wir zwei Stapel, von denen einer fortlaufende Zahlen von der Eingabe abzieht, und einer, von dem nur einer abgezogen wird. Diejenige, die fortlaufende Zahlen subtrahiert, endet nur, wenn die Zahl dreieckig ist (andernfalls passiert sie nur Null und geht weiter ins Negative). Die andere endet immer für eine positive Zahl, jedoch immer langsamer als die erste, sodass nicht dreieckige Zahlen auf diesem Stapel enden.
Wie richten wir also Stapel so ein, dass dieselbe Operation aufeinanderfolgende Zahlen voneinander subtrahiert und aufeinanderfolgende subtrahiert? Auf jedem Stapel haben wir die Eingabe oben, damit in überprüft werden kann, unten haben wir die Differenz und unten haben wir die Differenz der Differenz. Bei jedem Durchlauf addieren wir die "Differenz der Differenz" zur regulären "Differenz" und subtrahieren diese von der Eingabe. Für den Stapel, der auf Dreieckigkeit prüft, setzen wir unseren doppelten Unterschied
1
so, dass wir bei jeder Ausführung aufeinanderfolgende ganze Zahlen erhalten, für den anderen Stapel setzen wir ihn0
so, dass wir den Unterschied nie ändern, das heißt, er bleibt immer 1. Hier ist wie der Stack am Anfang aufgebaut ist, won
ist die Eingabe:Wenn wir endlich fertig sind, können wir diese Unterschiede nutzen, um zu überprüfen, auf welchem Stapel wir uns befinden. Wir platzieren die ersten beiden Werte und erhalten sie
1
für eine dreieckige und0
eine nicht dreieckige Zahl.Kommentierter Code
Hier ist eine 50-Byte-Lösung, die ich auch mag.
Probieren Sie es online!
quelle
Cubix , 23
2425Bytes0 für wahr und nichts
0für falsch. Brutes Forces durch Inkrementieren des Zählers, Addieren der kumulativen Summe und Vergleichen mit der Eingabe.Versuchen Sie nun, es auf einen 2x2x2-Würfel zu setzen.Geschafft!Probieren Sie es online!
/
Reflektiere zu Gesicht.I10\
Holen Sie sich eine Ganzzahl-Eingabe, drücken Sie 1 (Zähler), drücken Sie 0 (Summe) und reflektieren Sie+s;p-
Schleifenkörper. Addiere Summe und Zähler, lösche vorherige Summe, erhöhe Eingabe und subtrahiere?
Testen Sie das Ergebnis der Subtraktion\.uO@
reflektieren Sie auf die Unterseite, No-Op, U-Turn, Output und Stop.@
halten Sie an;qWs)/su
Drop-Subtraktion nach links drehen , die Eingabe nach unten setzen, nach links verschieben, Zähler und Summe tauschen, Zähler inkrementieren, reflektieren, Summe und Zähler tauschen, auf den Hauptschleifenkörper drehen.quelle
.
auf dem Würfel, jedoch1
in Ihrem Code.05AB1E ,
76 BytesEDIT : Danke an @Dennis: Ein Byte gespeichert, weil ich den Inkrementoperator vergessen habe
Probieren Sie es online!
n
ist dreieckig, wennsqrt(8n + 1)
es sich um eine ganze Zahl handeltWie es funktioniert
quelle
t.ï
kann sich inŲ
diesen Tagen um eine integrierte Funktion handeln, mit der überprüft werden kann, ob eine Zahl ein Quadrat ist.Perl 6 , 17 Bytes
Überprüft nur, ob
$_
die Eingabe für die Funktion mit einem der Elemente der dreieckigen Additionsreduktion übereinstimmt(1, 1+2, ..., 1+2+...+$_)
.quelle
Alice ,
3822 BytesDank Martin und Leo konnten viele Bytes eingespart werden
Es gibt einen nachgestellten Zeilenumbruch. Ausgänge
1
für Dreieck,0
sonst.Probieren Sie es online!
Erläuterung
Dies verwendet den gleichen Ansatz wie meine CJam-Antwort , nur ungeschickter. In linearisierter Form wird das Programm
wo die
i
undo
eigentlich im ordinalen Modus sind.Betrachten Sie die Eingabe
21
als Beispiel.quelle
...h*-no@
) ausgebenJapt ,
107 Bytes3 Bytes gespart dank @Luke und @ETHproductions
Probieren Sie es online!
Erläuterung:
Erläuterung:
Probieren Sie es online!
quelle
*8Ä ¬u1 c
für 9B (gibt 0 aus, wenn die Eingabe dreieckig ist, andernfalls 1)u1 c
zuv1
, glaube ich (schaltet die Ausgänge)R ,
2319 BytesÄhnliches Vorgehen wie bei anderen Antworten. Prüft, ob
8x+1
es sich um ein perfektes Quadrat handelt.-4 bytes danke Giuseppe und MickyT.
Probieren Sie es online!
quelle
!
anstelle von verwenden==0
!(8*scan()+1)^.5%%1
MATL , 5 Bytes
Probieren Sie es online!
Erläuterung:
quelle
t:Ys=a
. Vergessen überm
:-)m
bis ich diese Antwort sah .Batch, 72 Bytes
Gibt 1 bei Erfolg aus, nichts bei Misserfolg. Funktioniert auch für Null, obwohl dies aus irgendeinem Grund von der Frage nicht verlangt wird.
quelle
JavaScript (ES7),
19 bis18 ByteVon meiner Antwort auf eine verwandte Frage .
Ausgänge
false
für Dreieckszahlen odertrue
für nicht-Dreieckszahlen, wie vom OP zugelassen.Versuch es
quelle
n=>(8*n+1)**.5%1>0
(was die Ausgaben umkehren würde)PHP, 30 Bytes
Gibt 1 für wahr und nichts für falsch aus
Probieren Sie es online!
fmod
PHP, 37 Bytes
Gibt 1 für wahr und nichts für falsch aus
Probieren Sie es online!
quelle
Mathematica, 28 Bytes
quelle
7!
durch#
. Erstens ist es kürzer; Noch wichtiger ist, dass die aktuelle Lösung nicht korrekt ist, da sie die Größe der Eingabe, an der sie arbeitet, künstlich einschränkt.Pari / GP , 18 Bytes
Probieren Sie es online!
Es ist eine integrierte Funktion zum Testen, ob eine Zahl eine polygonale Zahl ist, die jedoch ein Byte länger ist.
Pari / GP , 19 Bytes
Probieren Sie es online!
quelle
Excel,
3122 BytesDank Octopus 9 Bytes gespart
Ausgänge
TRUE
für Dreieckszahlen. ElseFALSE
. Prüft, ob8*n+1
es sich um ein perfektes Quadrat handelt.quelle
=MOD(SQRT(8*A1+1),1)=0
spart ein paar BytesBrachylog , 5 Bytes
Probieren Sie es online!
Erläuterung
quelle
Fourier , 26 Bytes
Probieren Sie es online!
quelle
Python - 52 Bytes
Hinweis: Ich weiß, dass die anderen beiden Python-Antworten viel kürzer sind, aber dies ist die alte Art und Weise, eher ein manueller Algorithmus
quelle
APL (Dyalog) , 6 Bytes
Probieren Sie es online!
Erläuterung
Ausgaben
0
für false und1
für true.quelle
TI-BASIC,
107 Bytes-3 danke an @lirtosiast
Übernimmt die Eingabe
X
. Prüft, ob√(8X+1)
eine ganze Zahl istquelle
not(fPart(√(8Ans+1
?