Inspiriert von einer Frage bei Stack Overflow. Der Titel hier ist ganz und gar meine Schuld.
Die Herausforderung
Ersetzen Sie bei einer Liste positiver Ganzzahlen mit mindestens zwei Einträgen jede Zahl durch das Minimum aller Einträge, die sich selbst ausschließen.
Testfälle
[4 3 2 5] -> [2 2 3 2]
[4 2 2 5] -> [2 2 2 2]
[6 3 5 5 8] -> [3 5 3 3 3]
[7 1] -> [1 7]
[9 9] -> [9 9]
[9 8 9] -> [8 9 8]
Regeln
Der Algorithmus sollte theoretisch für alle Eingabegrößen (größer als eins) und Werte (positive ganze Zahlen) funktionieren. Es wird akzeptiert, wenn das Programm durch Zeit, Speicher oder Datentypen begrenzt ist und daher nur für Zahlen bis zu einem bestimmten Wert oder für Eingabegrößen bis zu einem bestimmten Wert funktioniert.
Programme oder Funktionen sind in jeder Programmiersprache zulässig . Standardlücken sind verboten.
Die Eingabe kann auf jede vernünftige Weise erfolgen . und mit jedem Format. Gleiches gilt für die Ausgabe. Eingabe- und Ausgabeformate können unterschiedlich sein.
Kürzester Code in Bytes gewinnt.
quelle
[4 3 2 2 5]
ausgegeben werden?[4 3 2 2 5]
die Ausgabe[2 2 2 2 2]
(dies ist ähnlich wie im zweiten Testfall)Antworten:
Jelly ,
965 BytesProbieren Sie es online!
Überprüfen Sie alle auf einmal! (leicht verändert)
Ich bin mir ziemlich sicher, dass Dennis das übertreiben kann.
Wie es funktioniert
Der Algorithmus ist ziemlich kompliziert. Beobachten wir, was dies bewirkt
[4,2,2,5]
.Erstens verwenden wir
J
zu erhalten[1,2,3,4]
. Beachten Sie, dass Jelly die 1-Indexierung verwendet.Dann sehen wir
ṙ
. Es werden zwei Argumente benötigt: ein Array und eine Ganzzahl. Das Array wird um den durch die Ganzzahl angegebenen Betrag nach links gedreht. Hierṙ
sehen Sie[4,2,2,5]
links und[1,2,3,4]
rechts (mehr dazu im Tutorial ). In Jelly werden Befehle implizit vektorisiert. Daher wird dieser Befehl für jedes einzelne Element auf der rechten Seite ausgeführt, weshalb wir ein 2D-Array erstellen würden:Daher
[4,2,2,5]ṙ[1,2,3,4]
wird[[4,2,2,5]ṙ1,[4,2,2,5]ṙ2,[4,2,2,5]ṙ3,[4,2,2,5]ṙ4]
, was wird:Beachten Sie, dass sich die ursprünglichen Elemente in der letzten Zeile befinden, da wir in dieser Zeile um einen Betrag nach links gedreht haben, der der Länge des Arrays entspricht. Aus diesem Grund
Ṗ
entfernen wir als Nächstes diese Zeile, sodass die Spalten die Auflistungen von sind Die Elemente des Arrays, die sich nicht am aktuellen Index befinden:Die folgende Operation
«/
ist ebenfalls ziemlich kompliziert. Erstens wird«
das Minimum der beiden links und rechts angezeigten Zahlen zurückgegeben. Zum Beispiel5«3
kehrt zurück3
. Wenn nun die beiden Argumente Arrays sind, würde es vektorisieren, wie ich oben gesagt habe. Was das heißt es[1,5,2,3]«[4,1,5,2]
würde das werden[1«4,5«1,2«5,3«2]
was ist[1,1,2,2]
. Nun/
istreduce
, was bedeutet , dass wir den Betrieb über jede Zeile bis zum Ende tun. Zum Beispiel[1,2,3,4]+/
würde werden((1+2)+3)+4
, was die Summe des Arrays ist[1,2,3,4]
.Wenn wir also
«/
auf das gerade erhaltene 2D-Array anwenden , erhalten wir:was aufgrund der Vektorisierung äquivalent wäre zu:
Dies berechnet das Minimum jedes Arrays ohne das Element am Index.
quelle
Python 2 , 41 Bytes
Probieren Sie es online!
Für jedes Element
x
prüfen wir, obx==min(l)
. Wenn nicht, wirdFalse
dies so behandelt, als würde0
es als Listenindex verwendetsorted(l)
, um das kleinste Element zu erhalten. Ansonsten ist esTrue
auch bekannt als1
das zweitkleinste Element geben, denn das Element selbst kleinste ist und sollte ignoriert werden.quelle
False
konvertiert wird0
undTrue
konvertiert wird,1
sind wirklich cool und sollte prahlen über ^ W ^ WexplainedGelee , 5 Bytes
Probieren Sie es online!
Wie?
quelle
Haskell ,
424139 BytesBEARBEITEN:
f
Nimmt eine Liste von ganzen Zahlen (oder einen beliebigenOrd
Typ) und gibt eine Liste zurück.Probieren Sie es online!
f
rekursiv beim Drehen der Liste.x
ist das erste Listenelement undy
der Rest. Da die Rekursion unendlich ist, zu die Ergbnisse Bedürfnisse abgeschnitten werden:fst<$>zip...y
ist eine kürzere Art zu sagentake(length y)...
.quelle
@
und die Listen Flip sein Reißverschluss:f l@(x:y)=fst<$>zip(minimum...)l
.f(h:t)=minimum t:(fst<$>zip(f(t++[h]))t)
Oktave, 26 Bytes
Ein ähnlicher Ansatz wie in verwendet diese Antwort , die die gleiche wie sein geschieht dies .
Ich bin nicht wirklich ein Fan davon, nur andere Antworten zu portieren. Deshalb möchte ich bemerken, dass ich eine ähnliche Idee hatte, bevor ich die anderen sah.
Erläuterung:
Jonathan Allan hat bereits eine gute Erklärung für den Jelly-Code geliefert, daher wird hier das Octave-Bit behandelt und warum es funktioniert (und in MATLAB nicht funktioniert).
Dies funktioniert in MATLAB nicht, da Inline-Zuweisungen und direkte Indizierung nicht funktionieren.
sort(x)(1)
gibt einen Fehler in MATLAB aus, nicht das erste Element im sortierten Vektor.quelle
Haskell, 41 Bytes
Anwendungsbeispiel:
([]#) [4,3,2,5]
->[2,2,3,2]
. Probieren Sie es online!Beginnen Sie mit einem leeren Akku
a
und durchsuchen Sie die Eingabeliste. Das nächste Element in der Ausgabeliste ist das Minimum des Akkumulatorsa
und alle bis auf das erste Element der Eingabeliste (->c
), gefolgt von einem rekursiven Aufruf, wobei das erste Elementb
zum Akkumulator und hinzugefügt wirdc
. Stoppen Sie, wenn Sie das Ende der Eingabeliste erreicht haben.quelle
JavaScript (ES6),
5046 BytesBearbeiten: 4 Bytes dank @Arnauld gespeichert.
quelle
a=>a.map(x=>Math.min(...a.filter(y=>x!=y)))
für 43 Bytes.3,3,3,3
a=>a.map((_,i)=>Math.min(...a.filter(_=>i--)))
für 46 tun .Brachylog ,
1312 BytesProbieren Sie es online!
1 Byte dank @ ais523 gespeichert.
Erläuterung
Wir nutzen die Tatsache, dass
⊇
Teilmengen von den größten zu den kleinsten vereinheitlicht werden. Zum Beispiel für[1,2,3]
sind die Untergruppen erhalten wir in dieser Reihenfolge:[1,2,3], [1,2], [1,3], [2,3], [1], [2], [3], []
.Wir können sehen, dass es sich bei den Teilmengen
[1,2], [1,3], [2,3]
um die handelt, von denen wir das Minimum wollen, sie sind jedoch in umgekehrter Reihenfolge im Vergleich zur Eingabeliste (daher die↔
). Wir können diese Untergruppen nur auswählen, indem wir die erstenlength(Input) + 1
Untergruppen suchen , die alle + die gesamte Liste zuerst enthalten. Wir verwerfen die gesamte Liste mitb
.quelle
Eigentlich 13 Bytes
Verwendet die gleiche Technik, die auch xnor entdeckt hat .
Probieren Sie es online!
Erläuterung:
quelle
R,
4631 Bytesimplementiert Stewie Griffins Lösung in R, leider ist meine ursprüngliche Idee 50% länger! Liest immer noch die Liste von stdin, gibt aber jetzt einen viel besser lesbaren numerischen Vektor zurück.
Probieren Sie es online!
alte Implementierung:
liest in der liste von stdin. Ein negativer Index
l[-x]
schließt das Element aus der Liste aus undmatch(l,l)
gibt den Index des ersten Vorkommens jedes Elements der Liste zurück. Gibt eine Liste zurück.quelle
Python 2, 51 Bytes
Ich weiß, dass es bereits eine bessere Python-Lösung gibt, aber ich möchte noch meine veröffentlichen.
Probieren Sie es online aus
quelle
Mathematica 34 Bytes
quelle
PowerShell ,
68 bis59 ByteProbieren Sie es online!
Ich bin ziemlich zuversichtlich, dass es verkürzt werden kann, ich werde es weiter untersuchen
quelle
C 85 Bytes
Das erste Argument ist das ganzzahlige Eingabearray. Das zweite Argument ist das Ausgabe-Integer-Array. Das dritte Argument ist die Anzahl der Elemente für beide Arrays.
Sehen Sie , wie es online funktioniert .
quelle
Perl 6 ,
26 2419 Bytes26
Beachten Sie, dass
∖
U + 2216 nicht\
U + 5C istVersuch es
Versuch es
24
Versuch es
19
Versuch es
26
Ich habe die "ausgefallenen" Unicode- Operatoren anstelle der ASCII-Entsprechungen verwendet, da sie vor sich ein Leerzeichen benötigt hätten, damit sie nicht als Teil des
.Bag
Methodenaufrufs analysiert würden .24
19
(Die 24- und 19-Byte-Golfplätze wurden von einer Jelly- Implementierung inspiriert. )
quelle
Clojure,
36816271 BytesNeueste (sollte nicht wirklich in Eile einreichen):
Probieren Sie es online aus .
Aaaund dieses hat einen Fehler (62 Bytes), zipmap erzeugt eine ungeordnete Karte, so dass dies bei größeren Eingaben nicht die richtige Reihenfolge ergibt.
v
wird eigentlich für nichts verwendet, ist aber kürzer alsi (keys c)
.Vorher bei 81 Bytes:
Probieren Sie es online aus .
Probieren Sie es online aus .
Oh Teufel mit dem Original (36 Bytes) funktioniert nicht, wenn die minimale Anzahl wiederholt wird,
[4 2 2 5]
ergibt sich ,[2 4 4 2]
da beide2
s entfernt werden :(#{i}
ist die Menge, die nur enthälti
. Sie gibti
für andere die Wahrheit und für andere die Falschheit zurück, was bedeutet, dass das Minimum aus allen anderen Zahlen in der Eingabeliste berechnet wird.Probieren Sie es online aus .
quelle
Pyth,
87 Bytes-1 Byte dank @isaacg
Versuch es!
quelle
d
am Ende entfernen - es ist implizit ausgefüllt.PHP, 72 Bytes
Online Version
quelle
PHP, 47 Bytes
quelle
Scala, 37 Bytes
l
ist eine Sammlung von Int.Testfälle:
Dies kann wahrscheinlich immer noch gespielt werden. Ich konnte keinen kürzeren Weg finden, um ein Element aus einer Liste zu entfernen als
l diff Seq(l(i))
quelle
C #, 36 Bytes
Nimmt die Elemente (i) und sucht in den Elementen ohne das aktuelle Element nach dem Minimalwert.
Es ist irgendwie traurig, dass einige andere Versuche nicht funktionieren, da wir mit primitiven Typen arbeiten und daher keine Listen mit Referenzen zum Vergleichen der Elemente von haben.
quelle
PowerShell ,
4938 Bytes-11 bytes dank mazzy
Probieren Sie es online!
Verbesserung der schönen Antwort von Sinusoid . Spart 10 Bytes, indem explizite Ausgaben verwendet werden, anstatt ein Array zu erstellen. Indiziert in das sortierte Array entweder Punkt 0 (dh kleinster Wert) oder Punkt 1, wenn die Bedingung wahr ist.
quelle
Perl 5, 43 Bytes
Entspricht der Python-Lösung. Perls hat
sort
leider die falsche Standardeinstellung für Zahlen (die einen expliziten Komparator erfordert) undmin
ist nicht integriert, macht dies aber fast wett, indemsub
es kürzer alslambda
,map$_,
kürzer alsx for x in
und implizit aus Return- und Args-Listen besteht.quelle
Ruby, 30 Bytes
Sortieren Sie für jedes Element das Array, entfernen Sie das aktuelle Element und greifen Sie auf das erste Element des verbleibenden Arrays zu.
Es ist eine anonyme Funktion, die folgendermaßen verwendet werden kann:
quelle
CJam, 15 Bytes
Im Wesentlichen eine Übersetzung von xnors Algorithmus in CJam.
Dies ist ein unbenannter Block, der ein Array aus dem Stapel entnimmt und das Ergebnis im Stapel belässt.
Erläuterung:
quelle
05AB1E , 5 Bytes
Port von @xnors Python 2 Antwort .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Java 8, 119 Bytes
Port von @xnors Python 2 Antwort .
Ändert das Eingabe-Array, anstatt ein neues zurückzugeben, um Bytes zu sparen.
Probieren Sie es online aus.
Erläuterung:
quelle
APL (Dyalog Extended) , 7 Bytes
Port of Xnors Python 2 Antwort. Benötigt
⎕IO←0
:Probieren Sie es online!
Erläuterung:
quelle
Haskell , 76 Bytes
Dies ist erheblich länger als die früheren Haskell-Einträge, aber es ist das erste, das nur eine lineare Anzahl von Vergleichen und eine lineare Menge zusätzlicher Arbeit ausführt.
Probieren Sie es online!
Erläuterung
!
benötigt zwei Argumente: ein laufendes Minimum und eine nicht leere Liste. Es gibt den Mindestwert in der Liste und das Ergebnis der Verarbeitung der angegebenen Liste unter Verwendung des laufenden Mindestwerts zurück.quelle
MathGolf ,
97 BytesProbieren Sie es online!
Erläuterung
Im Grunde genommen eine Portierung von Kevin Cruijssens 05AB1E-Antwort, aber ich verliere 2 Bytes, weil ich Dinge explizit tun muss.
quelle