Bestimmen Sie anhand einer Liste positiver Ganzzahlen die Anzahl der Dreiecke, die wir so bilden können, dass ihre Seitenlängen durch drei verschiedene Einträge in der Eingabeliste dargestellt werden.
(Inspiration kommt von CR .)
Einzelheiten
- Ein Dreieck kann gebildet werden, wenn alle Permutationen der drei Seitenlängen die strenge Dreieckungleichung erfüllen(Dies bedeutet, dass , und alle gelten müssen.)
- Die drei Seitenlängen müssen an unterschiedlichen Positionen in der Liste erscheinen, müssen aber nicht unbedingt paarweise unterschiedlich sein.
- Die Reihenfolge der drei Zahlen in der Eingabeliste spielt keine Rolle. Betrachten wir eine Liste
a
und die drei Zahlena[i], a[j], a[k]
(woi,j,k
paarweise verschieden sind), dann werden(a[i],a[j],a[k]), (a[i],a[k],a[j]), (a[j], a[i], a[k])
usw. alle als das gleiche Dreieck betrachtet. - Die Eingabeliste kann mindestens 3 Einträge enthalten.
- Sie können davon ausgehen, dass die Eingabeliste aufsteigend sortiert ist.
Beispiele
Ein kleines Testprogramm finden Sie hier auf Try it online!
Input, Output:
[1,2,3] 0
[1,1,1] 1
[1,1,1,1] 4
[1,2,3,4] 1
[3,4,5,7] 3
[1,42,69,666,1000000] 0
[12,23,34,45,56,67,78,89] 34
[1,2,3,4,5,6,7,8,9,10] 50
Für die Eingabe ist [1,2,3,...,n-1,n]
dies A002623 .
Für die Eingabe von [1,1,...,1]
(Länge n
) ist dies A000292 .
Für die Eingabe der ersten n
Fibonacci-Zahlen ( A000045 ) ist dies A000004 .
[1,1,1,1]
dass 4 "verschiedene" Dreiecke[1,1,1]
ausgewählt werden können, indem drei der Einsen verwendet werden. Aber es ist nicht 24, weil die drei Einsen ungeordnet gewählt sind, dh es ist eine Teilmenge von drei Indizes und keine geordnete Liste?Antworten:
R ,
62524034 BytesProbieren Sie es online!
Port von Luis Mendos Octave-Lösung
Da
a<=b<=c
ist die Dreieckbedingung äquivalent zua+b-c>0
. Dasa+b-c
wird prägnant durch das Matrixprodukt erfasst[1,1,-1] * X
, wobeiX
die 3-Kombinationen des Eingabearrays sind.In den Kommentaren gab es viele Verbesserungsvorschläge von 3 verschiedenen Personen:
Robert S. für den Vorschlag
scan
.Robin Ryder für die Vorschläge zur Verbesserung der Dreiecksungleichung und diese ungerade, bei der die Eingabe in absteigender Reihenfolge erfolgen muss (was nur zeigt, wie wichtig ein flexibles Eingabeformat ist).
und schlussendlich Nick Kennedy für Folgendes:
R , 40 Bytes
Probieren Sie es online!
quelle
x[3]<x[1]+x[2]
entspricht2*x[3]<sum(x)
: 51 Bytes[
Alias ist schlau , räumt den Ansatz wirklich auf.Stax ,
87 BytesDanke an rekursiv für -1!
Führen Sie es aus und debuggen Sie es unter staxlang.xyz!
Entpackt (8 Bytes) und Erklärung:
Das ist ein ordentlicher Trick. Wenn Sie eine Folge von Anweisungen haben, die immer zu 0 oder 1 führt, und Sie die Elemente aus einem Array zählen müssen, die am Ende Ihres Programms das wahrheitsgemäße Ergebnis liefern,
F..+
ist ein Byte kürzer als{..f%
.Angenommen, die ursprüngliche Liste ist aufsteigend sortiert. Setzen Sie ohne diese Annahme ein
o
am Anfang für 8 Bytes.quelle
r3SFE+<+
packt bis 7. Es verwendet eine foreach-Schleife, um die Filterergebnisse hinzuzufügen. Addition ist eine der Operationen, die ein No-Op ist, wenn nur ein einzelnes Element vorhanden ist.Haskell , 49 Bytes
Probieren Sie es online!
Generiert rekursiv alle Untersequenzen von
l
(umgekehrt) und prüft, welche Länge-3-Einsen Dreiecke bilden.50 Bytes
Probieren Sie es online!
Dieselbe Idee, die Untersequenzen mit zu generieren
mapM
, indem jeder Wertl
entweder auf sich selbst (include) oder0
(exclude) abgebildet wird .50 Bytes
Probieren Sie es online!
Versucht jeden Partitionspunkt, das mittlere Element zu nehmen
b
.51 Bytes
Probieren Sie es online!
Die Funktion
q=scanr(:)[]
generiert die Liste der Suffixe. Eine Menge Ärger entsteht, wenn Sie berücksichtigen müssen, dass gleiche Elemente die richtige Anzahl von Malen enthalten.52 Bytes
Probieren Sie es online!
Die Hilfsfunktion
q=scanr(:)[]
generiert die Liste der Suffixe.57 Bytes
Probieren Sie es online!
quelle
Brachylog , 11 Bytes
Probieren Sie es online!
Möglicherweise habe ich vergessen, die sortierte Eingabe in meiner alten Lösung zu nutzen:
Brachylog ,
181715 BytesProbieren Sie es online!
quelle
Perl 6 , 35 Bytes
Probieren Sie es online!
Erläuterung
Es ist ein Whatever-Code, dh eine kurze Notation für Lambda-Funktionen (das funktioniert nur in sehr einfachen Fällen). Jedes
*
ist ein Platzhalter für ein Argument. Also nehmen wir die Liste der Längen (die am ersten erscheint*
), machen alle Kombinationen von 3 Elementen (sie kommen immer in der gleichen Reihenfolge wie in der ursprünglichen Liste heraus, was bedeutet, dass die Kombinationen auch sortiert sind), reduzieren die Liste, und nimm dann die Liste 3-mal-3 und filter (grep
) nur die Triplets, die erfüllen*+*>*
, dh die Summe der ersten beiden Argumente ist größer als das dritte. Das gibt alle Drillinge und wir zählen sie schließlich, indem wir den numerischen Kontext mit a erzwingen+
.(Natürlich müssen wir es nur für den Fall von "Summe von zwei kleineren> dem größten" testen. Wenn dies zutrifft, gilt das andere trivial, wenn dies nicht zutrifft, bezeichnet das Triplett nicht die richtigen Dreieckslängen und wir tun es nicht muss weiter schauen.)
quelle
Netzhaut , 55 Bytes
Probieren Sie es online! Link enthält Testfälle, wobei jedoch die Werte im fünften Fall reduziert wurden, damit der Vorgang heute beendet werden kann. Setzt sortierte Eingabe voraus. Erläuterung: Regexe mögen es nicht wirklich, mehr als eine Sache abzugleichen. Ein normaler Regex könnte alle Werte finden, die ein kürzester Abschnitt eines Dreiecks sein könnten. Die
v
Option von Retina hilft hier nicht weiter, außer um einen Lookahead zu vermeiden. Diew
Option von Retina ist jedoch etwas hilfreicher, da sowohl das kürzeste als auch das längste Bein gleichzeitig gefunden werden können. Dies ist jedoch nicht genug für diese Herausforderung, da möglicherweise mehrere Mittelbeine vorhanden sind.Konvertieren Sie die Eingabe in Unary.
Für jede eingegebene Nummer ...
... erstellen Sie eine Zeile, deren ursprüngliches Array ab dieser Nummer abgeschnitten ist.
$'
bedeutet normalerweise die Zeichenfolge nach dem Abgleich,<
ändert sie jedoch so, dass sie die Zeichenfolge nach dem vorherigen Trennzeichen bedeutet, sodass keine 2 Bytes mehr verschwendet werden$&
. Jede Zeile repräsentiert daher alle möglichen Lösungen, wobei diese Nummer als kürzester Abschnitt verwendet wird.Suchen Sie für jede dieser Linien alle möglichen mittleren und längsten Beine, stellen Sie jedoch sicher, dass der Unterschied kleiner als das erste Bein ist. Geben Sie
_
für jede passende Beinkombination ein aus.Zählen Sie die Gesamtzahl der gefundenen Dreiecke.
quelle
Python 3 , 73 Bytes
Probieren Sie es online!
quelle
Python 2 , 72 Bytes
Probieren Sie es online!
73 Bytes
Probieren Sie es online!
quelle
05AB1E ,
12109 BytesMein erstes Mal mit 05AB1E! Danke an [Grimy] für -1!
Probieren Sie es online! oder Testsuite
Ein direkter Port meiner Stax-Antwort. Holen Sie sich alle Kombinationen von drei Einträgen und zählen Sie diejenigen, die möglicherweise Dreiecke bilden könnten. Es ist dieser zählende Teil, der mich wirklich erwischt hat. Ich gebe dort eine Menge Bytes aus. Ich bin fest entschlossen, dort ein Anfängerfehler zu sein.
quelle
ì
vor dem Filter (jeweils umkehren) anstelle desŠ
(dreifachen Austauschs) innerhalb des Filters verwendet habe. Alternativ können Sie auchε...}O
anstelle von verwendenʒ...}g
, aber die Anzahl der Bytes bleibt gleich. PS: Ihre Byteanzahl von 10 und TIO ist korrekt, aber Ihre tatsächliche Antwort enthält immer noch einen unnötigen Verweis,y
der entfernt werden kann. :) Schöne erste Antwort, also +1 von mir.3.ÆʒRÆd_}g
nur das gleiche bytecount.3.Æʒ`α›}g
ist 9.JavaScript (ES6), 63 Byte
Probieren Sie es online!
quelle
Oktave / MATLAB, 33 Bytes
Probieren Sie es online!
quelle
Zsh , 66 Bytes
Probieren Sie es online!
Relativ einfach, unter Ausnutzung der sortierten Eingabe und Inkrementierung des
for
Headers (die Inkrementierung erfolgt einmal pro übergeordneter Schleife).quelle
Excel VBA,
171164152 Bytes-26 Bytes dank TaylorScott
Die Eingabe liegt im Bereich
A:A
des aktiven Blattes. Die Ausgabe erfolgt in das unmittelbare Fenster.Da hiermit jede Kombination jeder Zelle in einer Spalte betrachtet wird, die 2 bis 20 Zellen hoch ist (was fast 2 bis 60 Kombinationen entspricht), ist dieser Code ... nicht schnell. Sie könnten es viel schneller machen, aber auf Kosten von Bytes.
quelle
()
in der Sub - Anweisung, um den Raum inDebug.? r
und fallenNext:Next:Next
aufNext k,j,i
. Abgesehen davon - nun, es macht immer noch 2 ** 60 Kombinationen, aber es funktioniertr=r-(a+b>c)*(b+c>a)*(c+a>b)
Kohle , 17 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Setzt sortierte Eingabe voraus. Erläuterung:
quelle
Japt
-x
, 9 BytesVersuch es
Versuch es
quelle
Wolfram Language (Mathematica) ,
37-35BytesProbieren Sie es online!
quelle
Ruby , 41 Bytes
Probieren Sie es online!
quelle
Pyth , 14 Bytes
Probieren Sie es online!
Alternative (auch 14 Bytes):
quelle
Perl 5 (
-p
),5552 Bytesmit Regex Backtracking, -3 Bytes dank @Cows Quacksalber mit
^
anstelle von(?!)
Fail und Backtracking.oder
TIO
quelle
(?!)
sein^
?Gelee , 9 Bytes
Probieren Sie es online!
Ein monadischer Link, der eine sortierte Liste von Ganzzahlen als Argument verwendet und die Anzahl der Dreiecke zurückgibt.
Erläuterung
Alternative 9s:
quelle
J , 40 Bytes
Probieren Sie es online!
quelle
Bash , 123 Bytes
Probieren Sie es online!
Ein lustiger.
quelle
SNOBOL4 (CSNOBOL4) , 181 Bytes
Probieren Sie es online!
Rohe GewaltO ( n3) Algorithmus. Nimmt die Eingabe als durch neue Zeilen getrennte Liste und gibt die Anzahl der Dreiecke oder eine leere Zeile für aus
0
. Dies ist wahrscheinlich zulässig, da SNOBOL die leere Zeichenfolge wie0
bei numerischen Berechnungen behandelt.quelle
C (clang) 83 Bytes
Probieren Sie es online!
1 Dank an @ceilingcat gespeichert
quelle