Sie sollten ein Programm oder eine Funktion schreiben, die eine Liste unterschiedlicher Ganzzahlen als Ein- und Ausgabe empfängt oder die Anzahl der Vorkommen der Eingabenummern in der folgenden umgedrehten Zahlenpyramide zurückgibt.
Ausgehend von der ursprünglichen Liste erstellen wir in jedem Schritt eine neue Liste mit den Maximalwerten jedes Paars benachbarter Zahlen (zB 5 1 2 6
wird 5 2 6
). Wir hören auf, wenn die Liste nur eine Nummer enthält.
Die volle Pyramide für 5 1 2 6
ist
5 1 2 6
5 2 6
5 6
6
Die resultierende Anzahl der Vorkommen ist 3 1 2 4
(für 5 1 2 6
).
Eingang
- Eine Liste mit einer oder mehreren Ganzzahlen ohne Wiederholung. (zB
1 5 1 6
ist ungültig.)
Ausgabe
- Eine Liste positiver Ganzzahlen. Das
i
dritte Element der Liste ist die Anzahl der Vorkommen deri
dritten Eingabenummer in der Pyramide.
Beispiele
Eingabe => Ausgabe
-5 => 1
8 4 => 2 1
5 9 7 => 1 4 1
1 2 3 9 8 6 7 => 1 2 3 16 3 1 2
6 4 2 1 3 5 => 6 4 2 1 3 5
5 2 9 1 6 0 => 2 1 12 1 4 1
120 5 -60 9 12 1 3 0 1200 => 8 2 1 3 16 1 4 1 9
68 61 92 58 19 84 75 71 46 69 25 56 78 10 89 => 2 1 39 2 1 27 6 5 1 6 1 2 14 1 12
Dies ist Code-Golf, also gewinnt der kürzeste Eintrag.
Bonus Puzzle: Kannst du das Problem O(n*log n)
rechtzeitig lösen ?
Antworten:
Pyth,
1917 BytesSchauen Sie sich die Online-Demonstration oder die vollständige Testsuite an (erste 4-Byte-Iteration über die Beispiele).
Dieser ist ein bisschen schlauer als der naive Ansatz. Jede Zahl des Dreiecks kann als Maximalwert einer verbundenen Teilmenge von dargestellt werden
Q
. In der ersten Zeile werden die Teilmengen der Länge 1 verwendet, in der zweiten Zeile des Dreiecks die Teilmengen der Länge 2, ...Erläuterung
Um dies ein wenig zu visualisieren.
m.:QhdUQ
und die Eingabe[5, 1, 2, 6]
gibt mir alle möglichen Teilmengen:Und
mmeSk.:QhdUQ
gibt mir jedes ihrer Maxima (was genau den Reihen in der Pyramide entspricht):Pyth,
2322 BytesDies ist nur der einfache Ansatz "Mach, was dir gesagt wird".
Schauen Sie sich die Online-Demonstration oder eine vollständige Testsuite an (erste 4-Byte-Iteration über die Beispiele).
Erläuterung
meSd.:G2
ordnet jedes Paar von[(G[0], G[1]), (G[1], G[2]), ...]
dem maximalen Element zu.Y
ist eine leere Liste,aYG
hängt alsoG
an dieY
.u...QQ
Wendet diese beiden Funktionen (len(Q)
Zeiten) wiederholt an, beginnend mitG = Q
undG
nach jedem Lauf aktualisierend .m/sYdQ
Ordnet jedes Element der Eingabeliste der Anzahl in der reduziertenY
Liste zu.quelle
Python, 81
Eine Lösung zum Teilen und Erobern. Das maximale Element
M
sickert durch die PyramideM
und teilt es in ein Rechteck aus 's und zwei Subpyramiden.Das Gesamtergebnis ist also die Ausgabe für die linke Unterliste, gefolgt vom Bereich des Rechtecks, gefolgt von der Ausgabe für die rechte Unterliste.
Die Eingabevariable
L
wird zum Speichern des Ergebnisses wiederverwendet, sodass die leere Liste der leeren Liste zugeordnet wird.Die Konstrukte in Lösung sind in Python wortreich. Vielleicht kann eine Sprache mit Mustererkennung den folgenden Pseudocode implementieren?
quelle
f@{}=##&@@{};f@{a___,l_,b___}/;l>a~Max~b:={f@{a},Length@{a,0}Length@{b,0},f@{b}}
CJam,
2322 BytesImmer noch auf der Suche nach Golfmöglichkeiten.
Dies ist eine CJam-Funktion. Dies erwartet die Eingabenummern auf dem Stapel und gibt auch die entsprechenden Ausgabezahlen auf dem Stapel zurück. Ein Beispiel:
Blätter
auf stapel.
Ich bin mir ziemlich sicher, dass dies nicht
O(n log n)
rechtzeitig ist.Code-Erweiterung :
Schauen wir uns an einem Beispiel an, wie es funktioniert
5 1 2 6
In der zweiten Reihe
5 1 2 6
wird5 2 6
da jeweils5, 2 and 6
das Maximum aus[5 1], [1 2] and [2 6]
. In der dritten Reihe wird es5 6
weil5 and 6
maximal[5 2] and [2 6]
jeweils. Dies kann jeweils auch als Maximum geschrieben[5 1 2] and [1 2 6]
werden. Ebenso ist für die letzte Reihe6
maximal[5 1 2 6]
.Wir erstellen also im Grunde genommen die Slices der richtigen Länge, beginnend mit dem Slice der Länge
1
, also den ursprünglichen Zahlen, die jeweils in ein Array eingeschlossen sind, bis zum Slice der LängeN
für die letzte Zeile, in derN
die Anzahl der Eingabe-Ganzzahlen angegeben ist.Probieren Sie es hier online aus
quelle
Mathematica, 72 Bytes
quelle
Python, 81
Jeder Eintrag in der Pyramide ist das Maximum der Unterliste auf dem Kegel nach oben. Also generieren wir alle diese Unterlisten, die durch Intervalle
[i,j]
mit indiziert sind0 < i < j <= len(L)
, und zählen, wie oft jedes Element maximal erscheint.Eine kürzere Aufzählung der Teilintervalle würde wahrscheinlich Zeichen sparen. Eine Single-Index-Parametrisierung der Paare
[i,j]
wäre ein plausibler Ansatz.quelle
Pip , 56 + 1 = 57 Bytes
Ich fürchte, ich konkurriere nicht viel mit dem CJam-Voodoo. Ich brauche wohl einen besseren Algorithmus. Mit
-s
flag ausführen, um eine durch Leerzeichen getrennte Ausgabe zu erhalten.Ungolfed, mit Kommentaren:
Die Neudefinition
r
jeder Zeit durch funktioniert wie folgt:quelle
APL (24)
Dies ist eine Funktion, die eine Liste annimmt.
Erläuterung:
{
...}⍵
: Wende die folgende Funktion auf ⍵ an:⍵≡⍬:⍵
: Wenn ⍵ leer ist, gib ⍵ zurück2⌈/⍵
: Erzeugt die nächste Liste⍵,∇
: return ⍵, gefolgt vom Ergebnis der Anwendung dieser Funktion auf die nächste Liste⍵∘.=
: Vergleiche jedes Element in ⍵ mit jedem Element im Ergebnis der Funktion+/
: summiere die Zeilen (die Elemente in ⍵ darstellen)quelle
Haskell, 78 Bytes
Verwendung:
f [68,61,92,58,19,84,75,71,46,69,25,56,78,10,89]
->[2,1,39,2,1,27,6,5,1,6,1,2,14,1,12]
.Wie es funktioniert
quelle
JavaScript, 109 Bytes
Ich denke, ich habe einen interessanten Weg gefunden, aber erst, als mir klar wurde, dass der Code zu lang war, um mithalten zu können. Na ja, poste das trotzdem, falls jemand weiteres Golfpotential sieht.
Ich verwende hier die folgende Formel:
Auf diese Weise muss man nicht die gesamte Pyramide oder Teilmengen davon generieren. (Deshalb dachte ich anfangs, es würde in O (n) laufen, aber Pech, wir brauchen immer noch innere Schleifen.)
quelle
MATLAB: (266 b)
EINGANG
ein Vektor muss die Form haben [abcd ...]
Beispiel:
[2 4 7 11 3]
AUSGABE
Muster tritt auf.
ERLÄUTERUNG:
Wenn [abcd] eine Eingabe ist, berechnet das Programm das Ergebnis ghij als
g = (a> b) + (a> b) (a> c) + (a> b) (a> c) * (a> d) = (a> b) (1+ (a> c) ( 1+ (a> c))))
h = (b> a) + (b> c) + (b> a) (b> c) + (b> c) (b> d) + (b> a) (b> c) (b> d ) = ... 'vereinfacht'
i = (c> b) + (c> d) + (c> b) (c> d) + (c> b) (c> a) + (c> d) (c> b) (c> a ) = ..
j = (d> c) + (d> c) (d> b) + (d> c) (d> b) * (d> a) = ...
quelle
J (49)
Ich nehme an, es gibt Raum für Verbesserungen ...
quelle