Lose Bereiche interpretieren
ListSharp ist eine interpretierte Programmiersprache mit vielen Funktionen. Eine dieser Funktionen ist ein auf einem Index basierender Range Creator, der folgendermaßen funktioniert:
Sie definieren einen Bereich als (INT) TO (INT)
oder genau dort, (INT)
wo beide oder der einzelne int von min bis max int32-Wert gehen können
Dann können Sie diese Bereiche verwenden, um Elemente eines Arrays zu extrahieren, ohne befürchten zu müssen, seine Grenzen zu überschreiten
deshalb:
1 TO 5
erzeugt: {1,2,3,4,5}
3
erzeugt: {3}
Bereiche können mit dem AND
Operator addiert werden
1 TO 5 AND 3 TO 6
erzeugt: {1,2,3,4,5,3,4,5,6}
Denken Sie daran, dass dies auch bei negativen Zahlen funktioniert
3 TO -3
erzeugt: {3,2,1,0,-1,-2,-3}
Die Herausforderung ist folgende:
Eingang
Ein Zeichenarray und die zuvor definierte Range-Klausel als Zeichenfolge
Ausgabe
Die Elemente an den 1 indexbasierten Positionen des Bereichs (nicht vorhandene / negative Indizes werden in ein leeres Zeichen übersetzt)
Wie gewinnt man
Als Code-Golf- Herausforderung soll das Programm mit der kürzesten Anzahl von zu gewinnenden Bytes erstellt werden
Es wurde darauf hingewiesen, dass leere Zeichen nicht existieren, deshalb sollten Sie sie ignorieren (ich habe sie hier nur gezeigt, um das Verständnis zu erleichtern, aber es verwirrt die Leute).
Testfälle:
input array is:
{'H','e','l','l','o',' ','W','o','r','l','d'}
range clause:
"1 TO 3" => "Hel"
"5" => "o"
"-10 TO 10" => "Hello Worl"
"0 AND 2 AND 4" => "el"
"8 TO 3" => "oW oll"
"-300 AND 300" => ""
"1 TO 3 AND 3 TO 1" => "HelleH"
"-20 TO 0 AND 1 AND 4" => "Hl"
quelle
"0 TO 2"
=>{'H', 'e', 'l'}
?3 TO 3
jemals ein Input sein und was ist der erwartete Output?AND
Mehrfachbereiche. Sie haben auch nicht geantwortet, ob wir eine auf Null basierende Indizierung verwenden können, die in den meisten Sprachen Standard ist.Antworten:
Python 2 -
239211210 BytesVielen Dank an @ mbomb007 und @Cyoce für das weitere Golfen dieser Lösung!
Unkomplizierter Ansatz. Versuchte Generatoren und eine rekursive Version, aber sie konnten das Einfache nicht für jede Schleife übertreffen. Ich bin ein Golf-Neuling, daher kann dies höchstwahrscheinlich einiges verbessert werden. Der Hauptfehler dieses Snippets besteht auch darin, dass der Bereich als Listenobjekt jedes Mal neu berechnet wird, wenn ein Element aus dem Zeichenarray abgerufen wird (siehe letzte Zeile, Listenverständnis). Das heißt
r(s)
wirdlen(r(s)) + 1
mal ausgeführt .Ungolfed-Code:
Testfälle:
Ausgabe:
quelle
if
in die gleiche Zeile setzen und mit Semikolons trennen. Und entfernen Sie den Raum in[x] for
. Auch1if b else-1
kann ersetzt werden entweder mitb and 1or-1
oder2*bool(b)-1
ein Byte zu speichern.lambda
, da er nicht rekursiv ist.t+=[int(x)]
canbecomet+=int(x),
Groovy (
99 bis97 Bytes)Versuchen Sie es hier: https://groovyconsole.appspot.com/edit/5155820207603712
Erläuterung:
.replaceAll(" TO ","..")
- Ersetzen Sie das bis durch einen herkömmlichen Bereich..replaceAll(" AND ", ",")
- Ersetzen Sie alle und durch ein Komma."[${...}]"
- Umgeben Sie es mit der "Listen" -Notation in Groovy.Eval.me(...)
- Bewerten Sie den String als Groovy-Code..flatten()
- Reduzieren Sie die Mischung aus 2D-Array und 1D-Array zu einem 1D-Array..collect{v[it]}
- Sammeln Sie die Indizes aus dem Array in einer einzigen Struktur.Hier ist eine
115113-Byte-Lösung, die Nullen aus der Ausgabe entfernt: https://groovyconsole.appspot.com/edit/5185924841340928Hier ist eine 117-Byte-Lösung, wenn Sie sagen, dass sie bei 1 statt bei 0 indiziert werden MUSS: https://groovyconsole.appspot.com/edit/5205468955803648
Wenn Sie möchten, dass ich das Original gegen das 113/117-Byte-1 austausche, lassen Sie es mich wissen.
quelle
Eval.me(...)
bis jetzt getan hat. in der Praxis wäre es lächerlich unsicher, noch eine coole Sache zu wissen.C #, 342 Bytes
Ungolfed-Methode:
Volles Programm mit Testfällen:
Eine naive Lösung unter Verwendung einer Zeichenliste, die
' '
als Leerzeichen verwendet wird und die Aufgabe erledigt. Ich hoffe, mich bald zu verbessern.quelle
Scala, 165 Bytes
Erläuterung:
quelle
Python 2,
156155 BytesMeine Antwort hat einige ähnliche Ideen wie die Antwort von 1Darco1 , aber durch die Verwendung eines anderen Ansatzes von Anfang an ( Aufteilen von Zeichenfolgen anstelle von Listen) wurde sie deutlich kürzer. Es wäre vier Bytes kürzer, wenn die Indizierung mit 0 zulässig wäre.
Probieren Sie es online aus
Glücklicherweise kann ich Zeichenfolgen, die Leerzeichen enthalten, in ganze Zahlen zerlegen. Negative Indizierung in Python-Indizes ab dem Ende der Zeichenfolge, daher verwende ich
i[-1]
entweder den gleicheni[0]
oder den zweiten Wert, falls vorhanden. Dann muss ich auf alle negativen Bereichswerte einstellen mehr negativ, so werden sie nicht verwirren mit dem Aufschneiden. Wenn Sie negative Werte mit11**9
(2357947691
) multiplizieren, werden Bereiche mit einem ganzzahligen Mindestwert berücksichtigt. Schneiden Sie dann einfach die Zeichenfolge mit dem umgekehrten Schnitt, wenn der Bereich umgekehrt ist.Mit Null-Indexierung (151 Bytes):
quelle
range
Ansatz ist im Grunde nur eine super wortreiche Form von genau dem. Und du hast sogar den ganzenif"T"in x: else:
Teil losgeworden . +1R, 142 Bytes
Unter der Annahme, dass ich die Herausforderung richtig verstanden habe, gehe ich hier davon aus, dass
r
es sich um die vordefinierte Range-Klausel im String-Format handelt und dass das Eingabearray (in den Beispielen "Hello world") aus stdin gelesen wird.Einige Testfälle:
Ungolfed / erklärt
Linie 1
R hat einen netten Infix-Operator,
:
der Sequenzen erzeugt.1:5
gibt[1, 2, 3, 4, 5]
und0:-2
gibt[0, -1, -2]
. Daher ersetzen wir dieTO
Klausel im losen Bereich durch:
.Dolmetschen
AND
ist nur Verkettung. Wir können dafür die Funktion verwendenc
, die in der Lage ist, eine beliebige Anzahl von Argumenten durch Kommas zu trennen. So ersetzen wirAND
mit,
und dann wickeln die ganze Sache in
c(
,)
.Dies ergibt eine Zeichenkette, die so aussehen könnte
c( 1 : 5 , 7 )
. Wir rufenparse
auf, in den Typ "expression" umzuwandeln und danneval
den Ausdruck auszuwerten. Die resultierende Zahlenfolge wird dann der Variablen neu zugewiesenr
.Zeile 2
Nun zum hässlichen Teil - Umgang mit Strings in R, die schnell chaotisch werden. Zuerst definieren wir
e
eine leere Zeichenkette (wir werden diese später brauchen).Wir lesen aus stdin und konvertieren die Zeichenkette in ein Array einzelner Zeichen, indem wir die leere Zeichenkette aufteilen. (ZB gehen wir von "Hi" nach ["H", "i"].) Dies gibt eine Liste der Länge 1 zurück, also müssen wir nach dem ersten Element fragen
[[1]]
, um ein Array zu erhalten, mit dem wir arbeiten können. Ugh, ich habe dich gewarnt, das war chaotisch.R-Indizes beginnen bei 1 und haben eine nette Funktion mit negativen Zahlen. Angenommen,
x
ist['a', 'b', 'c']
. Es istx[1]
nicht überraschend, wenn Sie anrufen'a'
. Das Aufrufenx[-1]
gibt allex
außer index zurück1
, dh['b', 'c']
. Dies ist eine coole Funktion, bedeutet aber, dass wir mit unseren negativen Indizes für dieses Problem vorsichtig sein müssen. Im Moment geben wir nur die Elemente des Eingabearrays mit Index zurück>0
und weisen das Ergebnis zuo
.Zeile 3
Es gibt jedoch ein Problem! Bei Indizes, die länger als das Array sind, gibt R nur
NA
Werte zurück. Wir brauchen es, um leere Zeichenketten zurückzugeben. Also haben wir die Elemente neu zu definieren ,o
für dieis.na(o)
istTRUE
die leere Zeichenkette zu sein.Zeile 4
Wie gehen wir mit den negativen (und Null-) Indizes um? Sie alle müssen die leere Zeichenfolge zurückgeben, daher wiederholen wir die leere Zeichenfolge N-mal, wobei N die Anzahl der Indizes ist, die vorhanden sind
<1
.Schließlich verknüpfen wir die zuvor definierte
o
Liste mit dieser (möglicherweise leeren) Liste.quelle
JavaScript (ES6), 141
Unbenannte Funktion mit 2 Parametern, wobei der erste das Zeichenarray ist (kann auch eine Zeichenfolge sein), der zweite die Zeichenfolge, die die Bereichsdefinition enthält.
Der Rückgabewert ist ein Array, in dem jedes Element entweder ein einzelnes Zeichen oder der js-Wert sein kann
undefined
. Wenn diese Zeichenfolge als String definiert ist, wird eine Folge von durch Kommas getrennten Zeichen als "leeres" Zeichen angezeigt - als Testfälle in der ersten Version der Frage.Mit
.join
können Sie ein Zeichenfolgenergebnis erhalten, das der Testfallausgabe in der aktuellen Version der Frage ähnelt.Weniger golfen
Prüfung
quelle
Perl - 110 Bytes
Aufrufen des Skripts in der Befehlszeile mit der Zeichenfolge als erstem Argument und dem Bereich als zweitem.
Enttarnt:
quelle
Python 2, 146 Bytes
Alle Tests sind auf ideone
Teilt die Klausel
s
auf "AND", teilt jede der resultierenden Unterklauseln auf "TO", konvertiert die resultierenden Zeichenfolgen inint
usingmap
. Die Ergebnisse enthalten entweder 1 oder 2 Elemente (1, wenn in der Unterklausel kein "TO" vorhanden war).Erstellt für jeden dieser Bereiche 0-basierte Bereiche unter Verwendung des Schrittparameters range als 1 oder -1, indem die Werte bei den Indizes 0 und -1 überprüft werden (eine Liste mit einem Eintrag enthält diesen Eintrag bei beiden Indizes).
Durchläuft diese Bereiche und erstellt eine Liste der Ausgabe, wenn die bereitgestellten Indizes in range (
if 0<=i<len(a)
) sind.quelle
Jelly ,
28 2725 BytesTryItOnline (funktioniert auch mit einem String anstatt mit einem Array von Zeichen)
Wie?
quelle
Clojure
232230229 BytesOh, was für ein Monster, das ich erschaffen habe ... Aber eigentlich war das 260, als ich es einreichen wollte.
Edit: entfernt , um einen Raum aus
#(get r %_"")
,(if_(< f t)
und(take-nth 2_%)
(als_
).Weniger golfen:
Verwendet
clojure.string/split
, um durch "AND" und "" zu teilen,take-nth
löscht "TO" zwischen ganzen Zahlen, der Funktionsargumentvergleich behandelt den Fall von 1 oder 2 Argumenten und das ist es.Aufrufkonvention:
(f "Hello World" "1 TO 3 AND 2 AND 8 TO 2")
quelle
#
Zeichen.#
? Ich habe es ohne Erfolg versucht, es wird mit dem vorherigen Token "zusammengeführt". Oh, noch ein Platz, den du vorher entfernen musst%
.