Trouvez la plus longue série de true dans une liste de booléens. Renvoie la même liste, avec toutes les autres vérités falsifiées.
Entrée sortie
Une liste; tout format habituel (par exemple, une liste délimitée sous forme de chaîne).
Détails
Vrai et faux peuvent être tout ce que votre langue utilise généralement pour ces valeurs, ou les entiers 1 et 0. Si vous utilisez des caractères uniques, la liste peut être une concaténation (par exemple, 10001
).
S'il y a une égalité pour la course la plus longue, gardez toutes les courses égales vraies et falsifiez toutes les courses plus courtes.
Exemples
input ↦ output
1,0,1,0,1 ↦ 1,0,1,0,1
1,1,0,1,1,0,1 ↦ 1,1,0,1,1,0,0
1,1,0,1,1,1,0,1,1 ↦ 0,0,0,1,1,1,0,0,0
1,1,1 ↦ 1,1,1
0,0,1 ↦ 0,0,1
0,0 ↦ 0,0
1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,1,0,1,1,1,1,0,0,1,0 ↦ 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0
(directement depuis /programming//q/37447114 )
code-golf
array-manipulation
msh210
la source
la source
Haskell,
59,58,55, 64 octetsNote amusante, cela fonctionne sur n'importe quelle liste de valeurs où
falsy < truthy
. AlorsFalse/True
,0/1
,'f'/'t'
, etc.Remarque:
Comme plusieurs personnes l'ont souligné (y compris
@proud haskeller
et@nimi
), la version précédente a échoué sur une liste de toutes les valeurs de falsification. L'ajout de.([1<2]:)
a corrigé cela, comme suggéré par@proud haskeller
. Je laisse l'explication la même pour l'instant, car je pense que cela a toujours du sens. Si quelqu'un commente et demande une explication de la modification, je la modifierai.Explication:
Je vais d'abord désugar sans le
group
, puis l'ajouter à nouveau. Tout d'abord, je trouve que les mots sont souvent plus agréables aux yeux que les symboles, donc je vais faire quelques substitutions. (Notez que=<<
c'est «chic», donc cela s'applique différemment pour les listes et les fonctions. J'appellebind
la version de=<<
pour les fonctions.)Les derniers détails sont ceux qui
x <$ list
remplacent chaque élément dulist
avecx
etgroup list
divisent lelist
haut en morceaux d'éléments égaux. Alorsgroup [1, 1, 2, 3, 3, 3] == [[1, 1], [2], [3, 3, 3]]
.Pour résumer le tout, la fonction divise la liste de valeurs en groupes de seulement vrai et groupes de seulement faux. Ensuite, pour chaque groupe, remplacez chaque élément par le résultat de la déclaration
this is the biggest group
(le plus grand groupe detrue
sera le plus grand) et concaténez les groupes.Quatre octets enregistrés par
@Zgarb
la source
(\y->(maximum g==y)<$y)
par((<$)=<<(==maximum g))
. Je ne l'ai pas testé cependant.f
par la fonction sans point((=<<)=<<(=<<)(<$).(==).maximum).group
. Enregistre trois octets et est totalement illisible!b=(=<<);b b(b(<$).(==).maximum).group
est encore un octet plus court. Je n'ai jamais rien vu de tel auparavant au golf Haskell :)(:[t])
avant le maximum ou quelque chose de similaireRétine,
474336Essayez-le en ligne! ou essayez tous les cas de test
Merci à msh210 pour avoir joué au golf 4 octets!
Un grand merci également à Martin pour 7 octets!
Explication:
Remplacez tous les
0
s par!
s. Ceci est fait pour1
raccourcir les groupes de s correspondants , comme maintenant1!
et!1
aura une limite de mot (\b
) entre eux, qui correspond également au début ou à la fin de la chaîne.Il s'agit d'une option de configuration indiquant qu'après avoir appliqué l'expression régulière après le backtick à l'entrée, dans chaque correspondance, traduire chaque caractère ascii imprimable en un
0
caractère.Cette expression régulière correspond à des groupes de
1
s qui sont entourés de zéros, mais ne peut correspondre à un1
suivi de lui-même nulle part dans la chaîne. Ce sont les groupes non maximaux qui seront falsifiés. De plus, cela correspond également aux!
caractères que nous avons ajoutés pour les reconvertir en0
s.la source
MATL, 14 octets
Essayez-le en ligne!
Version modifiée avec tous les cas de test
Explication
la source
Python 2, 62 octets
Testez-le sur Ideone .
Comment ça marche
s.split('0')
divise la chaîne d'entrée est en courses de zéro ou plus 1 « sPour chaque exécution t , nous vérifions si
t+'1'
est une sous-chaîne de s .Si c'est le cas, la course n'est pas maximale,
t+'1'in s
retourne True ,1-(t+'1'in s)
retourne 1 - True = 0 et la course est remplacée par une course de 0 de même longueur.Si ce n'est pas le cas, la course est maximale,
t+'1'in s
retourne False ,1-(t+'1'in s)
retourne 1 - False = 1 et la course est remplacée par une course de 1 de même longueur, c'est-à-dire par elle-même.Enfin,
'0'.join
restaure tous les 0 supprimés .la source
J, 25 octets
Il s'agit d'un verbe monadique qui prend et renvoie un tableau 0-1. Utilisez-le comme ceci:
Explication
la source
;.
.Pyth,
26242321 octetsSuite de tests.
1/0
outrue/false
en entrée.true/false
en sortie.Explication
Précédent 23 octets
Suite de tests.
1/0
outrue/false
en entrée.1/0
en sortie.Précédent 24 octets
Suite de tests.
1/0
outrue/false
en entrée.1/0
en sortie.26 octets précédents
Suite de tests.
1/0
outrue/false
en entrée.1/0
en sortie.la source
Jr.b,N&YNrQ8)9qReSJJ
ouJrm,hd*FdrQ8 9qReSJJ
. Les deux versions économisent un octet. Ou allez encore plus fou avecJrXR1*FdrQ8 9qReSJJ
et économisez deux. ;-)Oracle SQL 12.1,
137135 octetsNon golfé
La saisie utilise des caractères uniques. Ex: '1100111'
la source
Mathematica ,
4641Fonctionne sur les listes de
0
et1
. Je pensais avoir assez bien réussi jusqu'à ce que je regarde les autres réponses!Explication pour la version à 46 caractères; Je mettrai à jour quand je ne peux pas l'améliorer davantage.
Une explication de ce code a été demandée.
Un équivalent sans code-golf (en utilisant les formulaires d'opérateur de la version 10) est:
Cela signifie une fonction composée de cinq étapes (sous-fonctions) appliquées dans l'ordre de haut en bas.
Split
: décompose en séries d'éléments identiques: {1,1,0,1,1,0,1} ↦ {{1,1}, {0}, {1,1}, {0,0}}Map[# Tr@# &]
: Pour chaque sous-liste (Map
) multipliez-la (#
) par sa somme (trace vectorielle,Tr
): {1,1} ↦ {2, 2}# - Max[1, #] &
soustrayez de chaque élément la valeur maximale apparaissant n'importe où dans la liste des listes, ou une, la plus élevée des deux. (L'un gère le cas de tous les zéros.)UnitStep
: égal à 0 pour x <0 et 1 pour x> = 0, appliqué à chaque élément.Apply[Join]
: joindre les sous-listes en une seule liste. Pourrait également être fait avecFlatten
ouCatenate
, mais en bref, ilJoin@@
est plus concis.la source
C,
135129 octetsEssayez en ligne
Non golfé
la source
JavaScript (ES6), 56 octets
Fonctionne en vérifiant toutes les séries de 1 et en remplaçant les caractères par 0 à moins que la série ne soit (également) la plus longue, comme mesuré en recherchant dans la chaîne une série plus longue de 1.
Solution récursive précédente de 72 octets:
Ne fait rien s'il n'y a pas d'exécutions de 1 (c.-à-d. 1 seul maximum). Sinon, soustrayez-en un
1
à chacun1
ou à l' un d'eux , puis appelez-le récursivement sur les cycles les plus courts, puis ajoutez-en un1
aux cycles (désormais tout aussi longs). Le nombre d'appels récursifs est inférieur de un à la durée de la plus longue exécution.la source
Julia, 51 octets
Essayez-le en ligne!
Comment ça marche
replace
trouve toutes les exécutions d'un ou plusieurs 1 dans la chaîne d'entrée s via l'expression régulièrer"1+"
et appelle le lambdat->map(c->c-contains(s,"1"t),t)
pour déterminer la chaîne de remplacement.Le lambda mappe
c->c-contains(s,"1"t)
tous les caractères dans la course de ceux t .Si
"1"t
(concaténation) est une sous-chaîne de s , la course n'est pas maximale,contains
retourne vrai etc-contains(s,"1"t)
retourne '1' - vrai = '0' , en remplaçant tous les 1 de cette course par 0 .Si
"1"t
(concaténation) n'est pas une sous-chaîne de s , l'exécution est maximale,contains
renvoie faux etc-contains(s,"1"t)
renvoie «1» - faux = «1» , laissant l'exécution non modifiée.la source
APL, 22 caractères
En anglais (de droite à gauche en blocs):
la source
Java 8, 205 octets
Il s'agit d'une expression lambda pour
Function<String,String>
:entrée / sortie est un
String
où true est représenté par 1 et false est représenté par 0. Aucun délimiteur ne sépare les valeurs.code avec explication:
voir ideone pour les cas de test
la source
Clojure, 137 octets
Commence par partitionner l'entrée en zéros et uns consécutifs et les mappe en «tuples» du premier élément des partitions et du nombre d'éléments. Il répète ensuite le nombre nécessaire de zéros ou de uns, selon qu'il s'agit de la séquence de longueur maximale de uns ou non.
Moins golfé:
la source
Perl 5, 68 octets
67, plus 1 pour
-pe
au lieu de-e
Attend et imprime une chaîne (concaténation) de 0 et de 1.
la source