Schreiben Sie eine Funktion (z. B. placeAt
), die ein Array nicht negativer Ganzzahlen und einen Index, der eine nicht negative Ganzzahl ist, verwendet. Es sollte eine 1 am angegebenen Index platzieren und möglicherweise andere Einträge um einen Punkt verschieben, um diesen Punkt zu räumen, wobei Nullen für leere Punkte stehen.
- Wenn der Eintrag am gewünschten Index 0 ist, füllen Sie ihn mit einer 1.
- Suchen Sie andernfalls nach der nächsten 0 links vom Index. Verschieben Sie die Einträge um eine Stelle nach links in diese 0, um Platz zu schaffen, und füllen Sie dann den Index mit einer 1.
- Wenn links keine 0 steht, gehen Sie genauso nach rechts.
- Wenn beides nicht möglich ist (dh wenn es keine 0 gibt), geben Sie das Array unverändert zurück.
Die Elemente sind 0-indiziert. Der Funktionsname kann beliebig sein.
Beispiele:
(Buchstaben stehen für positive ganzzahlige Werte.)
[a, b, 0, c, d, 0] placeAt 2 // output [a, b, 1, c, d, 0] place 2 is 0, just fill
[a, b, 0, c, d, 0] placeAt 3 // output [a, b, c, 1, d, 0] place 3 is filled, shift items left
[a, b, 0, c, d, 0] placeAt 0 // output [1, a, b, c, d, 0] place 0 is filled, can't shift left, shift items right
[a, b, 0, c, d, 0] placeAt 1 // output [a, 1, b, c, d, 0] place 1 is filled, can't shift left, shift items right
[0, a, b, 0, c, d, 0] placeAt 2 // output [a, b, 1, 0, c, d, 0] place 2 is filled, shift items left
[0, a, b, 0, c, d, 0] placeAt 4 // output [0, a, b, c, 1, d, 0] place 4 is filled, shift items left (notice you keep shifting up until a 0)
[0, 2, 0, 2] placeAt 3 // output [0, 2, 2, 1] place 3 is filled, shift items left
Dies ist eine Code-Golf-Herausforderung. Der kürzeste Eintrag am Ende von 9 Tagen gewinnt.
0
?[0, 2, 0, 2] placeAt 3
ist es legal ausgeben[2, 0, 2, 1]
? Muss der Code tatsächlich eine aufgerufene Funktion seinplaceAt
? Beachten Sie, dass einige Sprachen nicht genau Funktionen haben. "Ausnahme auslösen" gilt möglicherweise auch nicht für einige Sprachen. Ich würde vorschlagen, eine Ausgabe zuzulassen, die auf einen Fehler hinweist.[2, 0, 2, 1]
ist auch keine legale Ausgabe, da Sie immer so wenige Elemente wie möglich verschieben sollten und die Funktion beliebig benennen können.Antworten:
JavaScript (ES6), 85
Testen Sie das Ausführen des Snippets in einem EcmaScript 6-kompatiblen Browser (insbesondere nicht in Chrome, nicht in MSIE. Ich habe in Firefox getestet, Safari 9 könnte funktionieren).
(Ich habe dies gefunden, ohne auf eine der anderen Antworten zu achten. Jetzt sehe ich, dass es der von Eisbahnen sehr ähnlich ist. Dennoch ziemlich kürzer. Wahrscheinlich bekomme ich für diese Antwort nicht viele positive Stimmen.)
quelle
splice
ist besser als mein KommaJulia, 122 Bytes
Nur eine naive Implementierung der Spezifikation, um die Dinge in Gang zu bringen.
Ungolfed:
quelle
JavaScript (ES6), 98 Byte
Ziemlich der gleiche Ansatz wie meine CoffeeScript-Antwort, aber ich schließe bis zum Äußersten kurz, um eine zu speichern
return
Aussage :Erläuterung
Zur einfacheren Erklärung habe ich meinen Code etwas neu angeordnet:
Hier sind einige Informationen zur JS-Kurzschlussbewertung.
Demo
Derzeit funktioniert diese Demo aufgrund der Verwendung von ES6 nur in Firefox und Edge:
quelle
f(['a', 'b', 0, 'c', 'd', 0], 2)
[a..b]
.f(['a', 'b', 0, 'c', 'd', 0], 1)
Ruby, 208 Bytes
quelle
.rindex 0
jedes Mal ein Byte speichern können. Sie können auch einige Bytes speichern, indem Sie einen Proc anstelle einer Methode verwenden, die nicht einmal benannt werden muss :->a,i{...}
. Das if / elsif / elsif kann wahrscheinlich mit einem verschachtelten ternären Operator gekürzt werden...?...:...?...:...
.Haskell, 119 Bytes
Anwendungsbeispiel:
So funktioniert es: Teilen Sie die Eingabeliste an der angegebenen Position in den linken Teil
a
, das Element an der Position selbstx
und den rechten Teilb
. Wenn es ein0
In gibta++x
, machen Sie Platz bis zum ersten0
in der Rückseite vona++x
. Wenn es ein0
inx++b
, macht es Raum. Wenn überhaupt keine vorhanden sind0
, kombinieren Sie alle Teile unverändert, um die ursprüngliche Liste erneut zu erhalten.quelle
CoffeeScript, 96 Bytes
quelle
Python 2, 102 Bytes
Berechnet den Index der zu entfernenden Null, indem die bis zum Einfügeindex umgekehrte Liste mit dem Teil nach dem Index in normaler Reihenfolge verkettet und dann der Index der ersten Null ermittelt wird. Am Ende wird eine Null hinzugefügt, um
ValueError
Ausnahmen zu vermeiden, wenn keine Null gefunden wird. Dann einfach löschen, einfügen und zurückgeben.quelle
R, 87 Bytes
Erläuterung
Tests
quelle
C #, 265 Bytes
Golf (265 Zeichen)
Mit Leerzeichen und Einkerbungen
Ganzes Programm
Testfälle
quelle
([0, 'a', 'b', 0, 'c', 'd'], 2)
String[] Q, int P
zuString[]Q,int P
.C 154 Bytes
Besteht die angegebenen Testfälle, a ist der Zeiger auf das Array, l ist die Länge des Arrays (ich hoffe, dies bricht den Auftrag nicht), i ist der Index für die Einfügung und c wird intern verwendet. Könnte möglicherweise durch Kombinieren der linken und rechten Suche nach Schleifen verbessert werden.
Beispiel
Ungolfed
Einfach und keine Tricks, die über die Deklaration des K & R-Stils hinausgehen.
quelle