Défi:
Écrivez une fonction ou un programme qui accepte une liste de valeurs booléennes et retourne toutes les plages de True.
Cas de test:
f [F] = []
f [T] = [[0,0]]
f [T,T,F,T] = [[0,1],[3,3]]
f [F,T,T,F,F,T,T,T] = [[1,2],[5,7]]
f [F,T,T,F,F,F,T,T,T,T] = [[1,2],[6,9]]
f [T,T,F,F,F,T,T,T,T,T,T,T,T,T,T,F] = [[0,1],[5,14]]
f [F,F,T,T,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T] = [[2,3],[12,19],[33,54],[93,94]]
Règles:
- Vous pouvez choisir la façon dont l'entrée est codée, par exemple une liste, un tableau, une chaîne, etc.
- La sortie doit être codée comme une liste de listes ou comme une chaîne qui les affiche, donc des tableaux, des listes, des tuples, des matrices, des vecteurs, etc.
- Les valeurs booléennes doivent être codées sous forme de constantes, mais sinon, toute simple conversion de T / F en constantes souhaitées est autorisée
- EDIT: eval ou similaire pendant l'exécution EST autorisé.
- N'oubliez pas d'expliquer comment l'entrée est transmise au programme / fonction et donnez son entrée / sortie pour les cas de test
- Conversion au format d'entrée souhaité non compté
- Les failles standard sont interdites
- Si votre langue a une fonction pour ce faire, ce n'est pas autorisé
- Je n'accepterai pas ma propre soumission
- EDIT: le format de sortie est flexible. Si vous n'imprimez pas de liste ou similaire, les valeurs de plage doivent être séparées par un caractère non numérique et des plages distinctes également.
Notation:
- Le score est en octets, sauf s'il ne convient pas à votre langue (comme les codels dans Piet)
- Le score le plus bas gagne
Il y a une bonne flexibilité en entrée et en sortie, mais les solutions où T / F sont remplacées par des fonctions qui font tout le travail sont interdites.
Débogage:
Si vous écrivez le vôtre dans Haskell ou si vous pouvez l'appeler depuis Haskell, ce qui suit vérifiera votre fonction / programme:
import Test.QuickCheck
tf = cycle [True,False]
gen l = foldl (++) [] $ map (\i -> [tf!!i | x<-[1..i]]) l
putIn (a,b) l = zipWith (||) l [(a <= p) && (p <= b) | p <- [0..length l]]
putAllIn rs len = foldr putIn [False|i<-[1..len]] rs
main = print $ quickCheck (check functionNameGoesHere)
code-golf
array-manipulation
Michael Klein
la source
la source
Réponses:
Pyth,
1716 octetsUtilise une certaine magie de compteur post-assignation fantaisie avec un encodage de longueur de course.
Prend l'entrée comme un tableau de
0
s et1
s, par exemple[1, 1, 0, 1, 0]
. Sorties comme dans le défi, par exemple[[0, 1], [3, 3]]
.Suite de tests
la source
Pyth, 18 octets
Suite de tests
Vrai est représenté comme
1
, Faux comme0
.Les plages sont représentées de manière inclusive.
la source
Rétine ,
823427 octetsLa ligne vide doit contenir un seul espace.
L'entrée est une chaîne plate de
_
pour vrai et:
pour faux. La sortie est constituée de paires séparées par des espaces, chacune sur une ligne distincte.Essayez-le en ligne.
Explication
Le golf lourd de 82 à 27 octets a été possible par un choix intelligent de la représentation du vrai et du faux. J'ai choisi un caractère de mot
_
, (qui n'est pas un chiffre) pour vrai et un caractère non-mot,,:
(qui n'a pas besoin d'être échappé) pour faux. Cela me permet de détecter les extrémités des plages comme limites de mots.Nous faisons correspondre une limite de mot. Nous voulons remplacer cette frontière par l'indice correspondant de la valeur véridique. En principe, c'est assez facile avec la
$#
fonction récente de Retina , qui compte le nombre de captures d'un groupe. Nous capturons simplement chaque personnage devant cette position dans un groupe. En comptant ces caractères, nous obtenons la position. Le seul hic, c'est que les extrémités de la plage sont maintenant décalées d'une unité. Nous voulons en fait l'index du personnage devant le match. Cela est également facilement corrigé en faisant correspondre éventuellement un_
qui n'est pas capturé, sautant ainsi un caractère lorsque nous sommes à la fin d'une plage.Maintenant, nous remplaçons tous les traits de soulignement par un espace. Autrement dit, nous insérons un espace entre le début et la fin de chaque plage, tout en nous débarrassant des traits de soulignement.
Cela laisse les deux points (et nous devons encore séparer les paires). Nous faisons cela en divisant la chaîne entière en lignes autour de chaque deux-points. Le
S
mode de partage actif et le_
supprime les segments vides de telle sorte que les lignes vides ne reçoivent pas des tonnes de lignes doubles.la source
Python 2, 69 octets
Exemple de sortie:
Une approche directe, pas intégrée. Suit la valeur actuelle
x
et la valeur précédentep
. Lorsque ceux-ci sont différents, nous avons changé de série. Lors du basculement0
vers1
, imprime l'index en coursi
. Lors du basculement1
vers0
, imprime l'index actuel moins un suivi d'un point-virgule.C'est
if
assez malodorant. Peut-être que la récursivité serait mieux,la source
MATL , 17
1820octetsUtilise la version actuelle (9.1.0) du langage / compilateur.
L'entrée est une chaîne contenant des caractères
T
etF
. La sortie est un tableau à deux lignes, où chaque colonne indique une plage utilisant l'indexation 1, qui est la langue par défaut.Merci à Stewie Griffin d' avoir supprimé 2 octets.
Exemple
Explication
Il est basé sur une simple expression régulière:
la source
Octave, 43 octets
find(diff([0,x,0]))
recherche toutes les positions où le tableau d'entrée change entre vrai et faux. En remodelant cela en une matrice 2 par n, nous obtenons deux choses: les changements de vrai à faux et de faux à vrai sont divisés en deux rangées. Cela permet de soustraire 1 et 2 de chacune de ces lignes. Il est nécessaire de soustraire 1 de la ligne un car Octave est indexé 1 et non indexé zéro. Il est nécessaire de soustraire 2 de la ligne deux car lafind(diff())
recherche la position de la première fausse valeur, tandis que nous voulons la dernière vraie valeur. La partie de soustraction n'est possible que dans Octave, pas dans MATLAB.la source
CJam,
2725 octetsAttend une entrée comme
TTFTFT
. Essayez-le en ligne .Explication
la source
Japt,
343125 octetsEssayer une nouvelle approche a vraiment fonctionné cette fois.
Essayez-le en ligne!
L'entrée est une chaîne avec
F
pourfalse
etT
pourtrue
. La sortie est un tableau de tableaux; la représentation sous forme de chaîne le fait ressembler à un seul tableau.Comment ça marche
Remarque: je vois maintenant que plusieurs personnes avaient déjà développé cet algorithme, mais je l'ai découvert indépendamment.
Version non concurrente, 22 octets
Dans le dernier commit GitHub , j'ai ajouté une nouvelle fonctionnalité: un interligne
;
définit les variablesA-J,L
sur différentes valeurs.A
est défini sur un tableau vide, éliminant ainsi la nécessité de le créer manuellement.la source
Haskell, 74 octets
Exemple d'utilisation:
map(\l->(fst$l!!0,fst$last l)).wordsBy(not.snd).zip[0..] $ [True,False,True,True,False]
->[(0,0),(2,3)]
.Comment ça marche:
la source
J, 26 octets
Il s'agit d'un verbe monadique sans nom (fonction unaire) qui renvoie un tableau 2D ou des entiers. Il est utilisé comme suit.
Explication
la source
Rubis, 39
Exemple d'appel:
C'est
..
ainsi que Ruby représente les plages inclusives.La seule chose intéressante ici est de savoir comment obtenir l'index de la fin de la plage. C'est étrange. Je crée dynamiquement une expression régulière qui correspond au dernier caractère de la plage, puis à tous les caractères suivants et à la fin de la chaîne afin de forcer la correspondance correcte. Ensuite, j'utilise
=~
pour obtenir l'index de cette expression régulière dans la chaîne d'origine.Vous pensez qu'il pourrait y avoir un moyen plus court de le faire dans Ruby en utilisant les indicateurs -naF.
la source
JavaScript (ES6), 59
Une fonction anonyme, entrée sous forme de chaîne
T
etF
, renvoyant la sortie sous forme de tableau de tableauxTESTER
la source
𝔼𝕊𝕄𝕚𝕟, 18 caractères / 28 octets
Try it here (Firefox only).
Explication
la source
Haskell, 62 octets
Prend en entrée une liste de 0 et de 1.
Compte tenu de la liste
l
, la remplit avec 0 des deux côtés et calcule la liste indexée des paires consécutives. Par exempleEnsuite, extrayez les indices correspondant aux éléments consécutifs
(0,1)
et(1,0)
, qui sont les débuts des blocs de 0 et 1, soustrayez 1 des débuts de 0 pour obtenir les fins de 1, et zippez les résultats.la source
f l=(\s->zip[i|(i,0,1)<-s][i-1|(i,1,0)<-s])$zip3[0..](0:l)$l++[0]
.Pyth,
1918 octetsExplication:
Essayez-le ici .
la source
Perl, 47 octets
Avec les options perlrun suivantes
-lpe
:Alternative où la sortie est séparée par ligne (34 octets):
la source
Python 2, 108 octets
Cas de test:
Il existe certainement une solution plus courte que celle-ci, mais cela fonctionne.
la source
Haskell: 123 octets (exemple, ne peut pas gagner)
Moins golfé:
la source
allTrue s e = and (subList s e)
ou peut-êtreallTrue = (and.) . sublist
.all (==True) (subList s e)
c'est très clair.CJam, 30 octets
Entrée sous forme de tableau de style CJam
0
s et1
s. Sortie sous forme de tableau de paires de style CJam.Exécutez tous les cas de test. (Prend soin de la conversion des formats d'entrée.)
la source
Japt, 27 octets
Il doit y avoir un moyen de jouer au golf ...
Quoi qu'il en soit, c'est la même chose que ma réponse.
la source
APL, 17 caractères
Dans
⎕IO←0
et⎕ML←3
. En anglais:⍵×⍳⍴⍵
: mettre à zéro les éléments du vecteur d'index tant que l'argument où l'argument est faux⍵⊂
: couper au début de chaque série de vérités et jeter les fausses(↑,↑∘⊖)¨
: prendre le premier et le dernier élément de chaque sous-tableaula source
PowerShell, 82 octets
Solution Regex, utilisant les propriétés de l'objet MatchInfo .
Exemple
la source
Mathematica, 45 octets
Pas particulièrement intéressant; utilise une fonction intégrée.
la source
Clojure, 109 caractères
La première chose qui m'est venue à l'esprit, basée sur
reduce
etpartition-by
.Cas de test simple (correspond
T
àtrue
etF
àfalse
):la source