Hilfe! Ich scheine in einigen meiner Arrays ein störendes Echo zu haben, und ich würde es gerne loswerden. In diesem Fall wiederholt sich das ursprüngliche Array irgendwo in der Mitte, wodurch die Werte addiert werden.
Zum Beispiel [ 422, 375, 527, 375, 859, 451, 754, 451 ]
enthält das Array ein Echo von sich selbst wie folgt:
[ 422, 375, 527, 375, 859, 451, 754, 451 ] <-- array with echo (input)
[ 422, 375, 105, 0, 754, 451 ] <-- original array (output)
[ 422, 375, 105, 0, 754, 451 ] <-- echo of original array
Beispiel 2:
[ 321, 526, 1072, 899, 6563, 798, 7038, 3302, 3032, 3478, 1806, 601 ] <-- input
[ 321, 526, 751, 373, 5812, 425, 1226, 2877, 1806, 601 ] <-- output
[ 321, 526, 751, 373, 5812, 425, 1226, 2877, 1806, 601 ]
Es ist auch möglich, dass das Array kein Echo enthält. In diesem Fall wird das ursprüngliche Array zurückgegeben:
Beispiel 3:
[ 623, 533, 494, 382 ] <-- input
[ 623, 533, 494, 382 ] <-- output
Herausforderung:
Entfernen Sie ein Array, das möglicherweise ein Echo enthält, und geben Sie das Array ohne Echo zurück.
Eingang:
- Ein Array, eine Liste, eine durch Trennzeichen getrennte Zeichenfolge, Lochkarten oder ein für Ihre Plattform geeignetes Äquivalent mit drei oder mehr Ganzzahlen im Bereich von mit mindestens einem Element .
- Das Echo kann nicht am ersten oder nach dem letzten Element beginnen.
- Das Echo tritt innerhalb des Eingangs nur einmal oder gar nicht auf.
Ausgabe:
- Ein Array, eine Liste usw. von Ganzzahlen , wobei das Echo entfernt wurde.
- Wenn kein Echo vorhanden ist, geben Sie das ursprüngliche Array zurück.
Regeln und Wertung:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes für jede Sprache.
- Es gelten Standardregeln und Standard-E / A-Regeln .
- Lücken verboten (natürlich).
- Bitte geben Sie einen Link mit einem Test für Ihren Code an ( TIO.run usw.).
- Eine klare Erklärung für Ihre Antwort wird dringend empfohlen.
Testfälle:
Mit Echo:
[ 422, 375, 527, 375, 859, 451, 754, 451 ]
[ 422, 375, 105, 0, 754, 451 ]
[ 321, 526, 1072, 899, 6563, 798, 7038, 3302, 3032, 3478, 1806, 601 ]
[ 321, 526, 751, 373, 5812, 425, 1226, 2877, 1806, 601 ]
[ 4330, 3748, 363, 135, 2758, 3299, 1674, 1336, 4834, 2486, 4087, 1099, 4098, 4942, 2159, 460, 4400, 4106, 1216, 3257, 1638, 2848, 3616, 3554, 1605, 490, 1308, 2773, 3322, 3284, 4037, 7109, 4171, 5349, 2675, 3056, 4702, 4229, 1726, 5423, 6039, 8076, 6047, 7088, 9437, 4894, 1946, 7501, 5331, 3625, 5810, 6289, 2858, 6610, 4063, 5565, 2200, 3493, 4573, 4906, 3585, 4147, 3748, 3488, 5625, 6173, 3842, 5671, 2555, 390, 589, 3553, 3989, 4948, 2990, 4495, 2735, 1486, 3101, 1225, 2409, 2553, 4651, 10, 2994, 509, 3960, 1710, 2185, 1800, 1584, 301, 110, 969, 3065, 639, 3633, 3544, 4268 ]
[ 4330, 3748, 363, 135, 2758, 3299, 1674, 1336, 4834, 2486, 4087, 1099, 4098, 4942, 2159, 460, 4400, 4106, 1216, 3257, 1638, 2848, 3616, 3554, 1605, 490, 1308, 2773, 3322, 3284, 4037, 2779, 423, 4986, 2540, 298, 1403, 2555, 390, 589, 3553, 3989, 4948, 2990, 4495, 2735, 1486, 3101, 1225, 2409, 2553, 4651, 10, 2994, 509, 3960, 1710, 2185, 1800, 1584, 301, 110, 969, 3065, 639, 3633, 3544, 4268 ]
[ 24, 12, 52, 125, 154, 3, 567, 198, 49, 382, 53, 911, 166, 18, 635, 213, 113, 718, 56, 811, 67, 94, 80, 241, 343, 548, 68, 481, 96, 79, 12, 226, 255, 200, 13, 456, 41 ]
[ 24, 12, 52, 125, 154, 3, 567, 198, 25, 370, 1, 786, 12, 15, 68, 15, 88, 348, 55, 25, 55, 79, 12, 226, 255, 200, 13, 456, 41 ]
[ 1, 3, 2 ]
[ 1, 2 ]
[ 0, 1, 3, 2, 0 ]
[ 0, 1, 2, 0 ]
Ohne Echo:
[ 623, 533, 494, 382 ]
[ 623, 533, 494, 382 ]
[ 1141, 1198, 3106, 538, 3442, 4597, 4380, 3653, 1370, 3987, 1964, 4615, 1844, 5035, 2463, 6345, 4964, 4111, 5192, 8555, 5331, 3331, 4875, 6586, 5728, 4532, 5972, 2305, 3491, 6317, 2256, 2415, 5788, 4873, 6480, 2080, 5319, 4551, 6527, 5267, 4315, 2178, 2615, 5735, 5950, 6220, 7114, 6259, 5000, 4183, 6822, 6927, 7150, 8003, 5603, 3154, 8231, 5005, 5743, 6779, 4530, 4029, 5336, 6105, 4777, 6183, 6838, 5725, 6819, 8584, 3142, 3840, 3291, 4284, 2933, 4859, 2906, 5176, 2853, 2110, 2048, 4389, 4501, 2267, 2704, 431, 1495, 2712, 3008, 187, 3487, 630 ]
[ 1141, 1198, 3106, 538, 3442, 4597, 4380, 3653, 1370, 3987, 1964, 4615, 1844, 5035, 2463, 6345, 4964, 4111, 5192, 8555, 5331, 3331, 4875, 6586, 5728, 4532, 5972, 2305, 3491, 6317, 2256, 2415, 5788, 4873, 6480, 2080, 5319, 4551, 6527, 5267, 4315, 2178, 2615, 5735, 5950, 6220, 7114, 6259, 5000, 4183, 6822, 6927, 7150, 8003, 5603, 3154, 8231, 5005, 5743, 6779, 4530, 4029, 5336, 6105, 4777, 6183, 6838, 5725, 6819, 8584, 3142, 3840, 3291, 4284, 2933, 4859, 2906, 5176, 2853, 2110, 2048, 4389, 4501, 2267, 2704, 431, 1495, 2712, 3008, 187, 3487, 630 ]
[ 4791, 1647, 480, 3994, 1507, 99, 61, 3245, 2932, 8358, 6618, 1083, 5391, 3498, 4865, 1441, 3729, 5322, 5371, 6271, 2392, 1649, 5553, 9126, 3945, 2179, 3672, 2201, 4433, 5473, 4924, 6585, 6407, 3862, 6505, 1530, 5293, 4792, 6419, 6739, 3258, 3839, 3891, 7599, 2576, 5969, 5659, 6077, 5189, 1325, 4490, 5694, 6567, 6367, 5724, 5756, 6450, 5863, 4360, 2697, 3100, 3779, 4040, 4653, 1755, 3109, 2741, 3269 ]
[ 4791, 1647, 480, 3994, 1507, 99, 61, 3245, 2932, 8358, 6618, 1083, 5391, 3498, 4865, 1441, 3729, 5322, 5371, 6271, 2392, 1649, 5553, 9126, 3945, 2179, 3672, 2201, 4433, 5473, 4924, 6585, 6407, 3862, 6505, 1530, 5293, 4792, 6419, 6739, 3258, 3839, 3891, 7599, 2576, 5969, 5659, 6077, 5189, 1325, 4490, 5694, 6567, 6367, 5724, 5756, 6450, 5863, 4360, 2697, 3100, 3779, 4040, 4653, 1755, 3109, 2741, 3269 ]
[ 235, 121, 52, 1249, 154, 26, 5672, 1975, 482, 3817, 532, 9104, 1661, 171, 6347, 2124, 1122, 7175, 558, 8101, 667, 934, 798, 2404, 3424, 5479, 672, 4808, 956, 789, 123, 2255, 2549, 200, 126, 4562, 41 ]
[ 235, 121, 52, 1249, 154, 26, 5672, 1975, 482, 3817, 532, 9104, 1661, 171, 6347, 2124, 1122, 7175, 558, 8101, 667, 934, 798, 2404, 3424, 5479, 672, 4808, 956, 789, 123, 2255, 2549, 200, 126, 4562, 41 ]
[ 1, 1, 1, 1, 1 ]
[ 1, 1, 1, 1, 1 ]
[1, 2, 2, 2, 1]
; Ausgabe:[1, 1, 1, 1]
vs.[1, 2, 1]
[1, 2, 3, 1, 2, 3]
,[1, 2, 3, 0, 1, 2, 3]
,[0, 1, 3, 2, 0]
? Aktuelle Antworten stimmen nicht für alle diese Eingaben überein.[1, 1, 1, 1]
vs.[1, 2, 1]
) ist akzeptabel. Ich hatte ursprünglich eine Regel zur Auswahl, nahm sie jedoch im Sandkasten ab, da sie nur für eine kleine Anzahl von Randfällen zu gelten schien.[0, 1, 3, 2, 0]
sollte sein[0, 1, 2, 0]
- ich habe zu den Testfällen hinzugefügt. Eine erwartete Antwort auf die anderen beiden könnte sein,[1, 2, 3]
obwohl ich diese gültigen Testfälle nicht berücksichtigen würde, da sie den Regeln entsprechenthe original array repeats itself somewhere in the middle
.[0,0,0]
(oder ein beliebig großes0
Array von allen ) ein Echo von irgendetwas darstellt oder ob[0,0,0]
(kein Echo) auch für diesen Sonderfall eine gültige Antwort wäre, da es einfach nicht genug Informationen gibt, um zu bestimmen, welches es ist. Ich werde die Regeln aktualisieren, um zu verhindern, dass dies eine gültige Eingabe ist, da dadurch keine vorhandenen Antworten ungültig werden oder geändert werden.Antworten:
MATL , 16 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Polynomdivision für den Sieg!
quelle
Haskell , 167 Bytes
Zunächst ist zu beachten, dass bei einem vorhandenen Echo das Eingabearray eine Faltung eines anderen Arrays mit einem Array des Formulars ist
[1,1],[1,0,1],[1,0,0,1],...
.Dies bedeutet, dass wir dies nur für alle diese Arrays überprüfen müssen. Diskrete Faltung / Entfaltung ist jedoch dasselbe wie polynomielle Multiplikation / lange Division, so dass dies nur eine Implementierung unter Verwendung von Polynomen ist, wobei jedes Mal, wenn möglich, der Quotient zurückgegeben wird.
Ein Trick, der das Ganze ein wenig verkürzte, war, zusätzlich zu den obigen Arrays auch nach
[1]
einem Basisfall zu suchen, denn wenn kein anderes Array funktioniert, funktioniert die Dekonvolution mit[1]
und gibt das ursprüngliche Polynom zurück.Probieren Sie es online!
quelle
JavaScript ,
211171145 BytesProbieren Sie es online aus
40 Bytes von Kevin Cruijssen
Weitere 26 Bytes von Arnauld
Meine erste Code-Golf-Antwort macht potenzielle Offsets ungültig und gibt entweder das ursprüngliche oder das neue Array zurück, je nachdem, was es findet. Wenn jemand weiß, wie man es kürzer macht, lass es mich wissen, es scheint ein lustiges Spiel zu sein.
quelle
++
, Ändern&&
von&
in der ersten Überprüfung, Ändern von beiden.toString()
in+''
usw.) habe ich Ihren Code auf 181 Byte reduziert . Wenn Sie sie noch nicht gesehen haben, sind Tipps zum Golfen in JavaScript und Tipps zum Golfen in allen Sprachen möglicherweise interessant. :)function q(s)
kann seins=>
): 171 Bytes . Genieße deinen Aufenthalt! :)Haskell,
112111110 BytesProbieren Sie es online!
quelle
Wolfram Language (Mathematica) ,
13112912011910298979695 BytesProbieren Sie es online!
−1 byte dank attinat : wir können schreiben
L=Tr[1^#]
anstattL=Length@#
wenn das argument eine liste von zahlen ist.Codeerklärung : Durchlaufen Sie die Schrumpfung
d
(Differenz zwischen Eingabe- und Ausgabelänge). Erstellen Sie für jede Länge der Ausgabeliste eine Liste mit Unbekannten,v={x[1],x[2],...,x[L-d]}
fügen Sie sie sich mit Links- und Rechtspolstern zu lengthL
(PadLeft[v,L]+PadRight[v,L]
) hinzu, setzen Sie diese Summe auf die Eingabeliste und lösen Sie nach Unbekannten aufx[1]...x[L-d]
. Wählen Sie die kürzeste Lösung aus, die zuletzt generiert wurde: Überschreiben Sie die Variable einfachw
jedes Mal, wenn eine Lösung gefunden wird.Ungolf-Version:
quelle
Tr[1^#]
stattLength@#
Jelly ,
2524 BytesProbieren Sie es online!
Ein monadischer Link, der eine Liste von Ganzzahlen aufnimmt und zurückgibt. Technisch gesehen sind die erfolgreichen Ergebnisse in zwei weiteren Listen verschachtelt, aber bei Ausführung als vollständiges Programm ignoriert die implizite Ausgabe an stdout die redundanten Listen.
quelle
Python 2 ,
113123128127123122 BytesProbieren Sie es online!
1 Byte Danke an TFeld ; und 1 Byte Danke an Sebastian Kreft .
Bei jedem Aufruf von
f
konstruieren wir ein potentielles Echo der Längelen(a)-i
. Der erste Teil besteht nur aus den ersteni
Bytes von a; Der Rest wird so berechnet, dass die "Echosumme" für den "überlappenden" Abschnitt der Echosumme korrekt ist (dh die Echosumme ist bis zu korrekta[:-i]
).Dann ergibt der sehr knappe Vergleich ohne Golf:
quelle
e+=[v-e[-i]]
kann seine+=v-e[-i],
i<=len(a)/2
Wolfram-Sprache (Mathematica) , 93 Bytes
Probieren Sie es online!
Gibt das kürzeste in der Liste vorhandene Echo zurück.
quelle
{1,1,1}
und auf{1,0,1}
.{1,1,1}
es kein Echo gibt, müssen Sie das ursprüngliche Array zurückgeben. Denn{1,0,1}
ich würde sagen, das Echo ist,{1}
aber zugeben, es ist ein bisschen unklar, wie die Regeln lauten.PHP , 124 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Python 3 , 111 Bytes
Probieren Sie es online!
Die Lösung basiert auf Ideen von @Chas Brown, wie der rekursiven Struktur und dem Aufbau des Output-Arrays. In der Zwischenzeit werden auch einige Änderungen an den Bewertungskriterien vorgenommen und die for-Schleife in einen Generatorausdruck eingefügt, um eine einzeilige Lösung zu ermöglichen. Die ungolfed Version wird im Folgenden gezeigt. Hier wird das Array
out
bis zum Ende des Eingabe-Arrays berechnet und dann überprüft, ob die letztenl
Elemente alle Null sind. In diesem Fall werden die erstenlen(arr)-l
Elemente als Antwort zurückgegeben, wenn sie alle nicht negativ sind.Ungolfed, nicht rekursive Version
Probieren Sie es online!
quelle
Holzkohle , 62 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Angenommen, es gibt kein Echo.
Probieren Sie alle möglichen Echostartpunkte aus. Hinweis: Möglicherweise habe ich die Frage falsch verstanden und versuche nicht genügend Echogrößen. In diesem Fall
⊘
wäre das nicht erforderlich.Beginnen Sie mit einem Array von Nullen, die dieselbe Größe haben wie der Startpunkt des Echos.
Subtrahieren Sie für jedes Element im ursprünglichen Array das Element im Echo-Array zyklisch davon. Jedes Element im Echo-Array bildet somit die alternierende Summe der voneinander entfernten Elemente.
Wenn alle alternierenden Summen Null sind, speichern Sie dies als möglichen Startpunkt. (Wenn es also mehr als eine Möglichkeit gibt, wird der größtmögliche Startpunkt verwendet.)
Bauen Sie das Echo-Array auf, indem Sie Elemente nach dem Startpunkt vom entsprechenden zuvor berechneten Element subtrahieren.
Für implizite Ausgabe in separate Zeilen in Zeichenfolge umwandeln.
quelle