Einführung:
(Quelle: Wikipedia )
Wenn wir einen Regenbogen betrachten, hat er immer die Farben von oben nach unten:
Rot; Orange; Gelb; Grün; Blau; Indigo; violett
Wenn wir uns diese einzelnen Ringe ansehen, ist der rote Ring natürlich größer als der violette Ring.
Darüber hinaus ist es auch möglich, zwei oder sogar drei Regenbogen gleichzeitig zu haben.
All dies oben kombiniert wird in dieser Herausforderung verwendet:
Herausforderung:
Ausgehend von einer Liste von Ganzzahlen der exakten Größe 7, wobei jeder Wert die Farbpartikel angibt, die zur Bildung von Regenbögen zur Verfügung stehen (wobei der größte Index Rot und der kleinste Index Violett angibt), geben Sie die Anzahl der Regenbögen aus, die gebildet werden können.
Ein einzelner Ganzzahl-Regenbogen muss mindestens 3x Violett, 4x Indigo, 5x Blau, 6x Grün, 7x Gelb, 8x Orange, 9x Rot haben. Ein zweiter Regenbogen darüber ist sogar größer als der rote Ring des ersten Regenbogens (einschließlich eines Zwischenraums zwischen ihnen), sodass mindestens 11x Violett, 12x Indigo, 13x Blau, 14x Grün, 15x Gelb, 16x Orange benötigt werden , 17x rot zusätzlich zu dem, was der erste Regenbogen benutzt. Der dritte Regenbogen startet wieder bei 19x Violett.
Beispiel:
Input-Liste: [15,20,18,33,24,29,41]
Output:2
Warum? Wir haben 15x Violett und wir brauchen mindestens 3 + 11 = 14 für zwei Regenbogen. Wir haben 20 Indigos und wir brauchen mindestens 4 + 12 = 16 für zwei Regenbogen. Wir haben genug Farben für zwei Regenbögen, aber nicht genug, um drei Regenbögen zu formen. Die Ausgabe ist also 2
.
Herausforderungsregeln:
- Die Ganzzahlen im Input-Array sind garantiert nicht negativ (
>= 0
). - Die Eingabeliste hat garantiert die Größe 7 genau.
- Wenn sich keine Regenbogen bilden können, geben wir aus
0
. - Das Eingabe- und Ausgabeformat ist flexibel. Kann eine Liste oder ein Array von Dezimalzahlen sein, kann aus STDIN entnommen werden. Die Ausgabe kann eine Rückgabe einer Funktion in einem beliebigen sinnvollen Ausgabetyp sein oder direkt an STDOUT gesendet werden.
Mindestanzahl der Farben für die n
Anzahl der Regenbogen:
Amount of Rainbows Minimum amount per color
0 [0,0,0,0,0,0,0]
1 [3,4,5,6,7,8,9]
2 [14,16,18,20,22,24,26]
3 [33,36,39,42,45,48,51]
4 [60,64,68,72,76,80,84]
5 [95,100,105,110,115,120,125]
etc...
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Es wird außerdem dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.
Testfälle:
Input: [15,20,18,33,24,29,41]
Output: 2
Input: [3,4,5,6,7,8,9]
Output: 1
Input: [9,8,7,6,5,4,3]
Output: 0
Input: [100,100,100,100,100,100,100]
Output: 4
Input: [53,58,90,42,111,57,66]
Output: 3
Input: [0,0,0,0,0,0,0]
Output: 0
Input: [95,100,105,110,115,120,125]
Output: 5
Input: [39525,41278,39333,44444,39502,39599,39699]
Output: 98
0,0,0,0,0,0,0
Rand-Fall aber :( (es passt nicht mit der 1-Gap-Logik)Antworten:
Pyth , 14 Bytes
Testsuite!
Wie?
Algortihm
Lassen Sie uns zunächst die Formel ableiten, auf der diese Antwort basiert. Nennen wir die Funktion, die die erforderliche Menge an Farbpartikeln ergibt , wobei n die Anzahl der Schichten und i der Index der Farbe ist, basierend auf 0. Zunächst stellen wir fest, dass wir nur für die n- te Schicht ( in diesem Fall ist n 1-indiziert) L ( n , i ) = i + 3 + 8 ( n - 1 ) Farbpartikel benötigen . Vor diesem Hintergrund fassen wir die Ergebnisse der einzelnen Schritte zusammenC(n,i) n i nth n L(n,i)=i+3+8(n−1) für jede Schicht k :L(k,i) k
C ( n , i ) = ( i + 3 ) n
Daher wissen wir jetzt, dass die maximale Anzahl möglicher Schichten, nennen wir es , die Ungleichung C ( k , i ) ≤ I i erfüllen muss , wobei I i das i- te Element der Eingabeliste ist.k C(k,i)≤Ii Ii ith
Implementierung
Dies implementiert die Funktion und iteriert ( ) über die Eingabeliste, wobei k der Index (0-basiert) und b das Element ist. Für jeden Wert sucht das Programm die erste positive ganze Zahl T, für die b < C ( T , i ) ist (die logische Negation von C ( T , i ) ≤ b , die Bedingung, die wir zuvor hergeleitet haben), und findet dann das minimale Ergebnis und die minimalen Dekremente es. Auf diese Weise, statt für die höchste ganze Zahl von sucht , die tut eine Bedingung erfüllen, die wir für die niedrigsten suchen , die nicht der Fall istC k b T b<C(T,i) C(T,i)≤b und subtrahiere eins davon, um den Versatz von 1 auszugleichen.
.e
quelle
Python 2 ,
6461 BytesProbieren Sie es online!
Jede Farbe des Regenbogens wird
(3+i)+n*8
für Ebenen
und Farbe verwendeti
(0 = Violett usw.)Die Summe x Schichten ist daher:
(3*i)*x + 8*x*(x+1)
.Wir lösen einfach nach n und nehmen den Minimalwert.
Gerettet:
quelle
05AB1E ,
181716 Bytes-1 Byte dank Magic Octopus Urn
Probieren Sie es online!
Die für n Regenbogen benötigte Farbmenge beträgt n (4n + [-1, 0, 1, 2, 3, 4, 5]) .
quelle
[ND4*6Ý<+*¹›1å#N
funktioniert, aber ich weiß nicht warum. -1 Byte obwohl.N>
muss, weil du es¾>
vorher getan hast .JavaScript (ES6), 49 Byte
Probieren Sie es online!
Wie?
Zum Golfen beginnen wir jedoch mit
n === undefined
negativen Werten vonn
danach und verwenden diese . Die erste Iteration ist immer erfolgreich, da die rechte Seite der Ungleichung zu bewertet wirdNaN
. Daher ist der erste aussagekräftige Test der zweite mitn == -1
.quelle
Jelly , 18 Bytes
Probieren Sie es online!
Verwendet die Erklärung in Okx '05AB1E-Antwort.
quelle
Excel VBA, 78 Bytes
Anonyme Funktion, die Eingaben aus dem Bereich von
[A1:G1]
und Ausgaben in das VBE-Direktfenster übernimmt .quelle
Holzkohle , 21 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erklärung: Berechnet direkt die Anzahl der Regenbögen, die mit jeder Farbe möglich sind, mit einer Formel, die ich unabhängig abgeleitet habe, die jedoch mit der @ TField-Formel übereinstimmt.
quelle
JavaScript (Node.js) , 54 Byte
Port von @TFeld antworten
Probieren Sie es online!
quelle
Gelee , 14 Bytes
Das war schwer!
Ein monadischer Link, der eine Liste mit sieben ganzen Zahlen akzeptiert, die eine ganze Zahl ergibt, die Anzahl der möglichen Regenbogen.
Probieren Sie es online! Oder sehen Sie sich die Testsuite an .
Wie?
Leider scheint jede naive Methode 16 Bytes zu benötigen, eine solche Methode ist
Ṃɓ_J×¥H÷‘H<¬Ȧð€S
jedoch, wie sich herausstellt, die hier verwendete Methode ist sowohl effizienter als auch kürzer!Diese Methode baut mehr als genug Regenbogenstapel auf, da die Partikelanzahl, einschließlich der ultravioletten Bänder , hoch ist, und addiert 1 für jeden Stapel, der möglich ist.
Der Test für die Möglichkeit besteht darin, zu überprüfen, dass es nur eine einzige Bande gibt, die NICHT möglich ist, vorausgesetzt, wir benötigen einige ultraviolette Bandenpartikel, die jedoch mit Null versehen wurden.
quelle
§ỊS
!05AB1E , 14 Bytes
Probieren Sie es online!
Eine geschlossene Lösung, die keine zusätzliche Schleife anstelle der Karte erfordert. Dies funktioniert, indem die Formel meiner Pyth-Antwort an die Indizierungskonvention von 05AB1E angepasst und dann aufgelöst wirdn , was dem Algorithmus von TFeld entspricht .
Pyth-Algorithmus ⟶ 05AB1E Algorithmus
Es gibt viele Methoden, mit denen man diese Herausforderung in 05AB1E lösen kann. Deshalb habe ich ein paar ausprobiert, und dies stellte sich als die kürzeste heraus. Wenn wir die oben genannte Formel aus meiner Pyth-Antwort übernehmen und berücksichtigen, dass 05AB1E die 1-Indizierung verwendet, können wir unsere Funktion wie folgt aufbauen:
Gleichsetzen mit dem Element der Eingabe (ich ) am Index ich und wenn wir es in standardmäßiger (quadratischer) Polynomnotation schreiben, haben wir:
Beachten Sie, dass diese Gleichheit nicht genau ist (aber ich kenne derzeit keine Möglichkeit, dies formeller zu formulieren) und dass die Lösungen für diese Gleichung Gleitkommazahlen ergeben. Wir beheben dies jedoch, indem wir eine Bodenteilung anstelle einer präzisen Unterteilung verwenden später. Wie auch immer, mit unserem Argumente weiterhin auf, die meisten von Ihnen sind wahrscheinlich sehr vertraut mit den Lösungen von solchen Gleichung , also hier haben wir es:
Wieichich ist immer positiv, ( i - 2 )2+ 16 Iich------------√≥ i - 2 , also die "- "case macht nicht viel sinn, denn das wäre auch nicht 2 - i - i + 2 = 4 - 2 i , das ist negativ für i ≥ 2 oder 2 - i - 2 + i = 4 , was konstant ist. Daraus können wir schließenn wird gegeben durch:
Welches ist genau die Beziehung, die diese Antwort implementiert.
quelle
C ++,
127125 BytesKevin Cruijssen hat 2 Bytes gespart.
Probieren Sie es online!
Die Funktion verwendet ein Array im C-Stil mit sieben Zoll und gibt ein int zurück.
Der Algorithmus ist ziemlich unkompliziert (und wurde bereits einige Male beschrieben, daher folgt hier eine weitere Beschreibung, hauptsächlich für mein eigenes Sehvergnügen). Lassenc sei der Farbindex (0 ≤ c ≤ 6 ), so dass sich die erforderliche Anzahl von Partikeln bildet n -th ( n ≥ 1 ) Regenbogenteil dieser Farbe ist yc( n ) = ( c + 3 ) + 8 ( n - 1 ) und die Gesamtmenge der zu bildenden Teilchen n Regenbogenteile der Farbe sind dann Y.c( n ) = ∑nk = 1yc( k ) = n ( c + 3 ) + 8 n ( n - 1 )2 . Jetzt haben wir ein Ungleichungssystemxc≥ Yc( n ) (wo xc ist die Elemente des Eingabe-Arrays), die uns eine Reihe von Obergrenzen auf gibt n :
Was übrig bleibt, wird einfach durchlaufenxc und finde das Minimum.
Erläuterung:
quelle
for(int c=0;c<7;c++){int q=c-1;q=(std::sqrt(q*q+16*x[c])-q)/8;o=o>q?q:o;}
dazu:for(int c=0,q;c<7;c++,o=o>q?q:o)q=(std::sqrt(--c*c-c+16*x[++c]))/8;
. Könnten Sie vielleicht auch einen TIO-Link mit Testcode bereitstellen ?