Interpréter les plages lâches
ListSharp est un langage de programmation interprété qui possède de nombreuses fonctionnalités, l'une de ces fonctionnalités est un créateur de plage basé sur 1 index qui fonctionne comme ceci:
Vous définissez une plage comme (INT) TO (INT)
ou juste (INT)
où les deux ou le seul int peuvent aller de la valeur min à max int32
Ensuite, vous pouvez utiliser ces plages pour extraire des éléments d'un tableau sans craindre de dépasser ses limites
par conséquent:
1 TO 5
génère: {1,2,3,4,5}
3
génère: {3}
Les plages peuvent être additionnées à l'aide de l' AND
opérateur
1 TO 5 AND 3 TO 6
génère: {1,2,3,4,5,3,4,5,6}
rappelez-vous que cela fonctionne aussi avec des nombres négatifs
3 TO -3
génère: {3,2,1,0,-1,-2,-3}
Le défi est le suivant:
Contribution
Un tableau de caractères et la clause range précédemment définie sous forme de chaîne
Production
Les éléments aux 1 emplacements basés sur l'index de la plage (les index non existants / négatifs se traduisent par un caractère vide)
Comment gagner
En tant que défi de code-golf , vous êtes censé créer le programme avec le nombre d'octets le plus court pour gagner
Il a été souligné que les caractères vides n'existent pas, vous devriez donc les ignorer (je ne les ai montrés ici que pour les rendre plus faciles à comprendre mais cela a dérouté les gens)
Cas de test:
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"
la source
"0 TO 2"
=>{'H', 'e', 'l'}
?3 TO 3
jamais une entrée et quelle est la sortie attendue?AND
ing plusieurs plages. De plus, vous n'avez pas répondu si nous pouvons utiliser l'indexation à base zéro, qui est standard dans la plupart des langues.Réponses:
Python 2 -
239211210 octetsMerci à @ mbomb007 et @Cyoce d' avoir approfondi cette solution!
Approche directe. Générateurs essayés et une version récursive, mais ils ne pouvaient pas battre le simple pour chaque boucle. Je suis un joueur de golf, donc cela peut très probablement être amélioré un peu. De plus, le principal défaut de cet extrait est que la plage en tant qu'objet liste est à nouveau calculée à chaque fois qu'un élément est récupéré du tableau de caractères (voir dernière ligne, compréhension de la liste). Cela signifie
r(s)
est exécutélen(r(s)) + 1
fois.Code non golfé:
Cas de test:
Production:
la source
if
sur la même ligne et les séparer par des points-virgules. Et supprimez l'espace dedans[x] for
. En outre,1if b else-1
peut être remplacé par une ou l' autreb and 1or-1
ou2*bool(b)-1
d'enregistrer un octet.lambda
, car ce n'est pas récursif.t+=[int(x)]
canbecomet+=int(x),
Groovy (
9997 octets)Essayez-le ici: https://groovyconsole.appspot.com/edit/5155820207603712
Explication:
.replaceAll(" TO ","..")
- Remplacez le to par une gamme traditionnelle..replaceAll(" AND ", ",")
- Remplacez tous les ands par une virgule."[${...}]"
- Entourez-le de la notation "liste" dans Groovy.Eval.me(...)
- Évaluez la chaîne en tant que code Groovy..flatten()
- Aplatissez le mélange de matrice 2D et de matrice 1D en une matrice 1D..collect{v[it]}
- Collectez les indices du tableau dans une structure unique.Voici une solution de
115113 octets supprimant les valeurs nulles de la sortie: https://groovyconsole.appspot.com/edit/5185924841340928Voici une solution de 117 octets si vous dites qu'elle DOIT être indexée à 1 au lieu de 0: https://groovyconsole.appspot.com/edit/5205468955803648
Si vous voulez que j'échange l'original pour celui de 113/117 octets, faites-le moi savoir.
la source
Eval.me(...)
jusqu'à présent; étant donné que l'utiliser dans la pratique serait ridiculement précaire, ce qui est toujours cool à savoir.C #, 342 octets
Méthode non golfée:
Programme complet avec cas de test:
Une solution naïve, utilisant une liste de caractères, qui utilise
' '
comme un caractère vide et fait le travail. Espérant s'améliorer bientôt.la source
Scala, 165 octets
Explication:
la source
Python 2,
156155 octetsMa réponse a des idées similaires à la réponse de 1Darco1 , mais en utilisant une approche différente dès le départ (découpage de chaînes plutôt que listes), cela s'est avéré un peu plus court. Il serait de quatre octets plus court si l'indexation 0 était autorisée.
Essayez-le en ligne
Heureusement, je peux analyser des chaînes contenant des espaces en nombres entiers. Indexation négative dans les index Python à partir de la fin de la chaîne, donc j'utilise
i[-1]
soit la même valeur quei[0]
la deuxième valeur, s'il y en a une. Ensuite, je dois ajuster toutes les valeurs de plage négatives à plus négatives, afin qu'elles ne gâchent pas le découpage. La multiplication des valeurs négatives par11**9
(2357947691
) tiendra compte des plages en utilisant la valeur min entière. Ensuite, coupez simplement la chaîne en utilisant la tranche inverse si la plage est inversée.Avec indexation zéro (151 octets):
la source
range
approche est fondamentalement juste une forme super verbeuse d'exactement cela. Et vous vous êtes même débarrassé de toute laif"T"in x: else:
partie. +1R, 142 octets
En supposant que j'ai bien compris le défi, je suppose que
r
c'est la clause de plage prédéfinie au format chaîne et que le tableau d'entrée ("Hello world", dans les exemples) est lu à partir de stdin.Quelques cas de test:
Non golfé / expliqué
Ligne 1
R a un bon opérateur infixe
:
qui génère des séquences.1:5
donne[1, 2, 3, 4, 5]
et0:-2
donne[0, -1, -2]
. Donc, nous remplaçons laTO
clause dans la plage lâche par:
.L'interprétation
AND
n'est qu'une concaténation. Nous pouvons utiliser la fonctionc
pour cela, qui peut facilement prendre un nombre arbitraire d'arguments, séparés par des virgules. Nous remplaçons doncAND
par,
puis envelopper le tout dans
c(
,)
.Cela donne une chaîne de caractères qui pourrait ressembler
c( 1 : 5 , 7 )
. Nous appelonsparse
à convertir pour taper "expression" puiseval
à évaluer l'expression. La séquence de nombres résultante est ensuite réaffectée à la variabler
.Ligne 2
Maintenant, pour la partie laide - traiter les chaînes en R, qui devient rapidement désordonné. D'abord, nous définissons
e
comme une chaîne vide (nous en aurons besoin plus tard).Nous lisons dans stdin et convertissons la chaîne de caractères en un tableau de caractères individuels en divisant la chaîne vide. (Par exemple, nous passons de "Hi" à ["H", "i"].) Cela renvoie une liste de longueur 1, nous devons donc demander le premier élément
[[1]]
pour obtenir un tableau avec lequel nous pouvons travailler. Ugh, je vous ai prévenu que c'était désordonné.Les index R commencent à 1 et ont une fonctionnalité intéressante avec des nombres négatifs. Supposons que ce
x
soit['a', 'b', 'c']
. Appelerx[1]
sans surprise revient'a'
. L'appelx[-1]
renvoie toutx
sauf l' index1
, c'est-à-dire['b', 'c']
. C'est une fonctionnalité intéressante, mais cela signifie que nous devons être prudents avec nos indices négatifs pour ce problème. Donc pour l'instant, nous renvoyons simplement les éléments du tableau d'entrée avec index>0
, et attribuons le résultat ào
.Ligne 3
Cependant, il y a un problème! Pour les indices supérieurs à la longueur du tableau, R renvoie simplement des
NA
valeurs. Nous en avons besoin pour renvoyer des chaînes vides. Donc , nous redéfinissons les élémentso
pour lesquelsis.na(o)
estTRUE
d'être la chaîne vide.Ligne 4
Enfin, comment gérer les indices négatifs (et nuls)? Ils ont tous besoin de retourner la chaîne vide, donc nous répétons la chaîne vide N fois, où N est le nombre d'indices qui le sont
<1
.Enfin, nous concaténons le précédemment défini
o
à cette liste (potentiellement vide).la source
JavaScript (ES6), 141
Fonction sans nom avec 2 paramètres, le premier étant le tableau de caractères (peut être une chaîne non plus), le second la chaîne contenant la définition de la plage.
La valeur de retour est un tableau où chaque élément peut être soit un seul caractère, soit la valeur js
undefined
. Une fois stratifié, cela se traduit par une séquence de caractères séparés par des virgules ayant undefined indiqué comme le caractère "vide" - comme les cas de test dans la première version de la question.L' utilisation ,
.join
vous pouvez obtenir un résultat de chaîne similaire à la sortie de cas de test dans la version actuelle de la question.Moins golfé
Tester
la source
Perl - 110 octets
Appel du script dans la ligne de commande avec la chaîne comme premier argument et la plage comme second.
Désobscurci:
la source
Python 2, 146 octets
Tous les tests sont à idéone
Fractionne la clause,
s
sur "ET", fractionne chacune des sous-clauses résultantes sur "TO", convertit les chaînes résultantes enint
utilisantmap
. Les résultats auront chacun 1 ou 2 éléments (1 si aucun "TO" n'était présent dans la sous-clause).Construit des plages basées sur 0 pour chacune d'elles en utilisant le paramètre d'étape de plage comme 1 ou -1 en inspectant les valeurs aux index 0 et -1 (une liste avec une entrée a cette entrée aux deux index).
Exécute ces plages et construit une liste de la sortie, si les index fournis sont dans la plage (
if 0<=i<len(a)
).la source
Gelée ,
28 2725 octetsTryItOnline (fonctionnera également avec une chaîne au lieu d'un tableau de caractères)
Comment?
la source
Clojure
232230229 octetsOh quel monstre j'ai créé ... Mais en réalité c'était 260 quand j'étais sur le point de le soumettre.
Edit: retiré d' un espace de
#(get r %_"")
,(if_(< f t)
et(take-nth 2_%)
(comme indiqué_
).Moins golfé:
Utilise
clojure.string/split
pour diviser par "ET" et "",take-nth
supprime "TO" entre les entiers, la correspondance d'arguments de fonction gère le cas de 1 ou 2 arguments et c'est tout.Convention d'appel:
(f "Hello World" "1 TO 3 AND 2 AND 8 TO 2")
la source
#
caractères.#
? Je l'ai essayé sans succès, il est "fusionné" avec le jeton précédent. Oh, encore un espace à retirer avant%
là.