Eine Fortsetzung dieser Frage .
Aufgabe
Bestimmen Sie bei einer Reihe positiver Ganzzahlen das größte Element k, für das:
Es existiert ein positiver ganzzahliger Abstand n , so dass das Element in dem Array, das sich n- mal links oder rechts von k befindet, gleich n ist .
Es wird garantiert, dass das Array mindestens ein Element enthält, das diese Bedingung erfüllt.
Der kürzeste Code (in Bytes) gewinnt. Sie können das gewünschte E / A-Format auswählen.
Beispiel
Angesichts der Eingabe
[4, 6, 7, 9, 3, 6, 5, 7, 2]
Die zulässigen Werte sind:
- Die
4
, da es eine7
7 Positionen auf der rechten Seite befindet - Das erste
6
, da es3
3 Positionen auf der rechten Seite gibt - Die
3
, da es eine4
4 Positionen auf der linken Seite befindet - Die
5
, da es eine2
2 Positionen auf der rechten Seite befindet - Das zweite
7
, da es3
3 Positionen zu seiner Linken gibt.
Der größte dieser Werte ist 7
.
Testfälle
[1, 13] → 13
[2, 9, 8, 3, 72, 2] → 8
[5, 28, 14, 5, 6, 3, 4, 7] → 14
[1, 3, 5, 15, 4, 1, 2, 6, 7, 7] → 7
[5, 1, 3, 5, 2, 5, 5, 8, 5, 1, 5, 1, 2, 3] → 5
[5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5] → 10
Antworten:
Gelee , 9 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
05AB1E , 21 Bytes
Erläuterung
Probieren Sie es online!
quelle
Haskell,
615755 BytesAnwendungsbeispiel:
(f.zip[0..]) [5,28,14,5,6,3,4,7]
->14
.(Mehr oder weniger) eine direkte Implementierung der Definition: Für jeden Index
n
der Eingabelistex
behalten Siea := x!!n
bei , ob es einen Index gibt,i
in demb := x!!i
equalsabs(n-i)
. Finde das Maximum.Edit: @xnor speicherte zwei Bytes. Vielen Dank!
quelle
x
, sollte es kürzer sein, eine Funktion in zu definierenz
und in zu komponierenzip[0..]
.Gelee , 10 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Python 3,
858072 BytesEdit: -8 Bytes dank @Dennis
quelle
EXCEL:
32 bis30 Bytes=MAX(IF(A:A-ROW(A:A)<0,A:A,0))
Ich kann immer noch nicht glauben, dass ich es so kurz habe ...
So verwenden Sie es:
Fügen Sie es in JEDE Zelle ein, AUSSER in die Zellen von Spalte A. Drücken Sie nach dem Einfügen während der Bearbeitung
control
+shift
+enter
, um es korrekt einzugeben.Tragen Sie Ihre Werte in Spalte A ein, 1 Wert pro Zelle (gemäß CSV-Eintrag).
Wenn Sie herausfinden möchten, wie das funktioniert, habe ich in meinen Tipps zum Golfen in Excel einen zusätzlichen Tipp hinterlegt .
quelle
JavaScript (ES6), 61 Byte
quelle
Perl, 45 Bytes
Beinhaltet +2 für
-ap
Geben Sie Zahlen in einer Zeile auf STDIN ein:
largest.pl
:Ein weiteres Byte kann durch Ersetzen gewonnen werden
^P
durch das Literal-Steuerzeichen gewonnen werden. Dies führt jedoch zu einer Warnung bei STDERR für aktuelle Perls.Geht davon aus
largest number + array length < 2^32
quelle
Pyth,
1917 BytesVielen Dank an @ Pietu1998 für -2 Bytes
Ein Programm, das eine Liste in STDIN eingibt und das Ergebnis druckt.
Probieren Sie es online aus
Wie es funktioniert
quelle
}#
ist das gleiche wie@
. Wenn Sie das letzte Bit neu anordnen, können Sie auch das letzte Bit,-kb+bk
entfernen,k
seit es von Pyth automatisch eingefügt wurde.MATL, 13 Bytes
Die Eingabe muss ein Spaltenvektor sein. Das heißt, die Eingabe erfolgt wie bei [1; 2; 3] durch Semikolons oder wie bei [1,2,3] durch ein Transponierungs-Häkchen am Ende durch Kommas getrennt.
Probieren Sie es online!
Alle Testfälle: (A) , (B) , (C) , (D) , (E) , (F)
Vielen Dank an Suever für Vorschläge im MATL-Chatroom , um 2 Zeichen zu speichern.
Erläuterung:
Die Gesamtstrategie entspricht meiner Octave / MATLAB-Antwort, in der das Grundkonzept erklärt wird: https://codegolf.stackexchange.com/a/94161/42247
Der spezifische Code in dieser MATL-Antwort setzt sich wie folgt zusammen:
Der Kern der Methode ist die Konstruktion der Toeplitz-Matrix, deren ij'ter Eintrag abs (ij) ist. Wir konstruieren zunächst die Toeplitz-Matrix mit den Einträgen abs (i-1) +1 mit dem Toeplitz-Befehl YT von MATL wie folgt:
Um zu sehen, wie dies funktioniert, rufen wir den Eingabevektor für diesen Codeausschnitt 'v' auf. Das 'n' findet die Länge von v, dann ':' konstruiert den Vektor 1: Länge (v). Als nächstes macht das 't' eine weitere Kopie von 1: Länge (v) auf dem Stapel; Diese zusätzliche Kopie wird aufgrund eines bekannten Fehlers in der YT-Funktion in MATL (dem MATL-Äquivalent von toeplitz ()) benötigt, bei dem zwei Kopien der Eingabe anstelle von 1 erwartet werden. Dann nimmt YT die zwei Kopien dieses Vektors 1 : Länge (v) vom Stapel und ergibt daraus die abs (ij) +1 Toeplitz-Matrix.
Jetzt müssen wir 1 von dieser Matrix subtrahieren, um die Toeplitz-Matrix mit den Einträgen abs (ij) zu erhalten, und die ij-Positionen finden, an denen diese abs (ij) Toeplitz-Matrix gleich der Matrix aller Spaltenvektoren ist, die Spaltenkopien der Eingabe enthalten Vektor v. Dies geschieht wie folgt:
Das erste 't' erstellt eine zusätzliche Kopie der Eingabe und speichert diese im Stapel. Das 'n: tYT' erzeugt die Toeplitz-Matrix wie oben beschrieben und gibt sie in den Stapel aus. Dann subtrahiert 'q' 1 von der Toeplitz-Matrix und '=' führt den Vergleich der Elementgleichheit zwischen der abs (ij) -Matrix und dem Vektor durch, dessen Spalten Kopien der Eingabe sind. Beachten Sie, dass wir durch den Vergleich eines Spaltenvektors mit einer Matrix implizit die Broadcast-Regeln von MATLAB / MATL nutzen (der Spaltenvektor im Vergleich wird kopiert, um eine Matrix zu erstellen, ohne Befehle auszugeben).
Schließlich müssen wir die Zeilenindizes i finden, wo es eine Spalte j gibt, so dass der ij-te Eintrag in der oben konstruierten Matrixdifferenz gleich 1 ist, dann den Wert des Eingangsvektors erhalten, der diesen Indizes entspricht, und dann das Maximum nehmen. Dies geschieht in den folgenden drei Schritten:
1) Finden Sie die Indizes für jede Zeile, die eine Nicht-Null enthält:
2) Extrahieren Sie die Elemente des Eingabevektors, die diesen Indizes entsprechen:
3) Finde das maximale Element und gib es zurück:
quelle
YT
hat sich in Release 20.2.2 geändert . Jetzt wird standardmäßig 1 Eingabe verwendet (was im Allgemeinen nützlicher ist). Das erspart Ihnen hier zwar 1 Byte (t
vorher entfernenYT
), kann aber nicht ausgenutzt werden, da die Änderung der Sprache die Herausforderung nachholt. Dies hat jedoch zur Folge, dass Ihre Antwort in der neuen Version, die jetzt in TIOn:
durchf
Ruby, 66 Bytes
quelle
Oktave / MATLAB, 40 Bytes
Die Eingabe muss ein Spaltenvektor sein.
Danke an Luis Mendo für die Vorschläge, 3 Bytes zu sparen (siehe Kommentar)
Vielen Dank an Suever für die Vorschläge zum Speichern von 4 weiteren Bytes (Ersetzen von ~~ (sum ()) durch any ())
Erläuterung:
Bei gegebenem Eingangsvektor v ist dieses Problem gleichbedeutend mit dem Finden aller Lösungen i, j der folgenden diskreten Gleichung:
Dabei ist abs () die Absolutwertfunktion. Jedes v (i), für das diese Gleichung gelöst ist, ist eine der Kandidatenlösungen, über die wir maximieren können.
Als diskrete Funktion von i und j können alle Möglichkeiten für die linke Seite in der Toeplitz-Matrix angeordnet werden, die ungefähr so aussieht:
Und da die rechte Seite nicht von i abhängt, können alle Möglichkeiten in einer Matrix angeordnet werden, in der die Spalten alle Kopien der Eingabe sind.
Um alle Lösungen für die Gleichung zu finden, subtrahieren wir diese beiden Matrizen und suchen die Stellen, an denen es eine Null gibt. Die Zeilen, in denen es eine Null gibt, entsprechen den gewünschten Indizes i, in denen es aj gibt, so dass abs (ij) = v (i).
Andere Tricks:
quelle
v
als Spaltenvektor nur das in der Antwort angeben. Außerdem ersetzen Siefind
durch~~
, um zwei weitere Bytes zu sparentoeplitz
(YT
) werden standardmäßig zwei Eingänge (nicht einer) verwendetMathematica, 69 Bytes
Anonyme Funktion. Nimmt eine Liste von Ganzzahlen als Eingabe und gibt eine Ganzzahl als Ausgabe zurück. Ignorieren Sie alle generierten Nachrichten.
quelle
Scala, 94 Bytes
quelle
PHP, 128 Bytes
quelle
Java 7,
125123 Bytes2 Bytes gespart dank @mrco .
Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
,y
. Und ich bin in der Tat zu dem gleichen Schluss in Bezug auf das einzelne ternäre if gekommen. Natürlich ist es möglich, aber Sie werden die Prüfung zweimal durchführen, um sie viel länger zu machen.Java, 118 Bytes
quelle
Python, 58 Bytes
Basierend auf Tony S. Ruby Antwort . Diese Antwort funktioniert in Python 2 und 3. Golfvorschläge sind willkommen.
Ungolfing
quelle
Ruby 56 Bytes
Meine kleinste Rubinlösung.
Ziemlich einfach in Schienen Konsole zu testen
Dies begann bei 63 Bytes, danke für die Vorschläge, die helfen, es zu verkleinern!
quelle
.map
anstelle von.each
(x) if (y)
mit ersetzt werden(y)&&(x)
a<<b
anstelle vona+=[b]
Tatsächlich 17 Bytes
Diese Antwort ist eine aktuelle Portierung meiner Python-Antwort . Golfvorschläge sind willkommen. Probieren Sie es online!
Ungolfing
quelle
T-SQL (SQL Server 2016), 132 Byte
Golf gespielt:
Ungolfed:
Geige
quelle
JavaScript (ES6),
5654 Bytesquelle
Clojure, 68 Bytes
Beispiel:
(map-indexed (juxt - +) [3 4 1 2])
Ist([-3 3] [-3 5] [1 3] [1 5])
(Index+/-
seines Werts), werden diese verwendet, um Werte aus dem ursprünglichen Vektor nachzuschlagen (Standardwert für außerhalb des Bereichs ist0
), und der Maximalwert wird gefunden. Fühlt sich immer noch ein bisschen wortreich an, aber ich muss es zumindest benutzenjuxt
:)quelle