introduction
Je veux trouver la sous-chaîne avec le plus 1
dans une séquence de 0
«et 1
».
Contribution
Votre programme a deux entrées , la séquence et la longueur de la sous-chaîne.
La séquence est un nombre quelconque de 0
«et 1
»:
01001010101101111011101001010100010101101010101010101101101010010110110110
La longueur de la sous-chaîne est un entier positif non nul:
5
Production
Votre programme devrait sortir l'index de départ de la première sous-chaîne de la longueur donnée qui contient le plus 1
. Avec l'entrée ci-dessus, la sortie est:
10
Le premier caractère de la chaîne commence à un index de 0
.
Notation
Le code le plus court gagne!
Règles
- Votre programme doit toujours générer l'index correct pour toute entrée valide.
- Vous pouvez choisir votre méthode d'entrée / sortie à partir de n'importe quelle réponse avec un score positif sur les options par défaut . Veuillez spécifier la méthode que vous choisissez dans votre réponse.
1
, vous sortez la première sous-chaîne que vous avez trouvée. Vous identifiez les sous-chaînes avec l'index du premier caractère de cette sous-chaîne. Est ce que ça aide?Réponses:
Dyalog APL, 11
Essayez-le ici. Usage:
Explication
Il s'agit d'une fonction dyadique (signifiant binaire) qui prend la longueur de la sous-chaîne à gauche et la séquence à droite. Sa structure est la suivante:
Explication par explosion:
À titre d'exemple, prenons
4
et0 1 1 0 1 1 1 0
comme entrées. D'abord, nous leur appliquons la fonction+/
et obtenons2 3 3 3 3
. Ensuite,+
et⌈/
appliqué à ce tableau, donnez-lui et3
, et2 3 3 3 3 ⍳ 3
évaluez à2
, puisque3
premier apparaît comme deuxième élément. Nous soustrayons1
et obtenons1
le résultat final.la source
m
, oùm
est maximale.Rubis, 42
Prend une entrée en l'appelant, par exemple
f['01001010101101111011101001010100010101101010101010101101101010010110110110',5]
Cela compare les sous-chaînes en utilisant leur valeur ASCII totale et renvoie l'index du maximum. Je ne sais pas si
max_by
la spécification Ruby est requise pour être stable, mais il semble que ce soit dans l'implémentation C.la source
Python 2, 56
Accepte un tableau d'entiers, puis la longueur.
la source
[int(s) for s in "010010...0"]
f(ss, 999)
retournera 0 (au lieu de Aucun). Pouvez-vous résoudre ce problème? Cela viole sans doute la règle 1.ss
?None
n'est jamais une sortie souhaitée dans tous les cas car la réponse est un entier.Lot - 222
Batch est évidemment le langage parfait pour ce type d'opération.
Non golfé / disséqué:
La configuration initiale. La variable
s
est la chaîne d'entrée, etl
sera la longueur de la chaîne d'entrée, moins la longueur de la sous-chaîne (initialisée à négatif%2
où%2
est la longueur de sous-chaîne donnée).Obtenez la longueur de l'entrée en
l
utilisant une solution de longueur de chaîne Batch pure - cela modifie la variables
contenant la chaîne d'entrée, nous la définissons donc à nouveau.La valeur de
x
est utilisée pour vérifier quelle sous-chaîne a le plus grand nombre de 1. Commencez une boucle de 0 à la longueur de la chaîne, moins la longueur de la sous-chaîne (variablel
). Récupère la sous-chaîne à partir du point actuel dans la boucle (%%a
),c
est définie comme la chaîne d'entrée commençant par%%a
et prenant%2
(la longueur de sous-chaîne donnée) des caractères. Tous les0
s sont supprimés dec
, puis la valeur dec
est comparée àx
- c'est- à -dire111
est un nombre supérieur à11
ce que nous pouvons simplement utiliser la «chaîne» pour faire une comparaison supérieure à.y
est ensuite défini à l'emplacement actuel dans la chaîne - qui est finalement sorti.Exemple d'utilisation des OP -
la source
C # (Regex), 196
Le regex réel n'est pas si long, mais tous les fluffs nécessaires pour qu'un programme C # compile le double de la taille du code.
La regex réelle, définissant la longueur à 5:
(?=((?<o>1)|0){5})
: Anticipez pour lire 5 caractères sans consommer, et poussez tous1
dans la "pile"o
.(?=[10]{5})(?!((?<-o>1)|0){5})
: À une position qui a 5 caractères devant, il n'y a pas assez d'objets dans la "pile"o
pour sortir, c'est-à-dire que la sous-chaîne a strictement plus1
que ce que nous avons dans la position actuelle.(?!.+(?=[10]{5})(?!((?<-o>1)|0){5}))
: Une position telle que décrite ci-dessus est introuvable pour le reste de la chaîne, c'est-à-dire que toute position a un nombre inférieur ou égal à1
.Prendre le premier résultat donne la réponse, car toutes les sous-chaînes devant lui ont une sous-chaîne en avant avec plus
1
de, et nous avons vérifié que tout index plus grand que l'index actuel a un nombre inférieur ou égal à1
.(Et j'apprends quelque chose de sympa: la "pile" est restaurée lors du retour en arrière).
la source
Pyth , 12
Cela définit une fonction
g
, qui nécessite une liste de nombres et un nombre en entrée. Par exempleVous pouvez le tester ici: Pyth Compiler / Executor
Explication:
Alternative:
la source
ho/<>zNQ\0Uz
Malheureusement, compter sur une chaîne ne convertit pas automatiquement ce que vous recherchez en chaîne :(J,
1514 caractèresla source
Matlab (42)
Soit
s
la chaîne etn
la longueur de la sous-chaîne. Le résultat estr
.Calculez la convolution de
s
avec une séquence d'n
unités, puis trouvez le maximum. La convolution se fait facilement avecconv
, et lamax
fonction renvoie la position du premier maximum. Il est nécessaire de soustraire1
à l'index résultant, car l'indexation Matlab commence à1
, non0
.Golfé:
la source
Haskell,
6462 octetsUsage:
la source
n#l=...
p
. aussi, je pense que0
c'est redondant (bien que les parenthèses ne le soient pas, et vous pourriez avoir besoin d'un espace au lieu de cela0
).JavaScript (ES6) 73
Une fonction renvoyant la valeur demandée. La boucle for analyse la chaîne d'entrée en conservant un total cumulé, en enregistrant la position de la valeur maximale.
Non golfé
Test dans la console FireFox / FireBug
Production
10
la source
x
etr
. Cela devrait réduire 4 octets, soit la longueur finale de 69 octets. En outre, vous pourrez probablement remplacer&&
par&
. Mais sympa avec l'~~
astuce!t > x
. Vous devez initier r: essayerF("00000")
. Et && est nécessaire pour émuler etif
(x=t, r=i-n+1)
s'ilt
était inférieur ou égal àx
. C'est une bonne utilisation de l'évaluation paresseuse! Je souhaite qu'il puisse être coupé quelque part, mais je suppose que vous avez fait tout le travail.PHP (96)
for($a=$b=$c=0;(($d=@substr_count($s,1,$a,$n))>$c&&($b=$a)&&($c=$d))||$a++<strlen($s););echo $b;
http://3v4l.org/J4vqa
variables
$s
et$n
doivent être définies sur la ligne de commande pour la chaîne de recherche et la longueur de la sous-chaîne, respectivement.Cela fonctionnerait également dans n'importe quel langage de type C avec des fonctions appropriées pour
substr_count()
etstrlen()
.la source
Mathematica,
3836Exemple:
Production:
la source
C # (Linq), 148 octets
Formaté:
Prend l'entrée comme paramètres de méthode.
Ce qu'il fait:
la source
Scala - 70 octets
Mais avec des noms de fonction aussi longtemps que zipWithIndex, je suppose que Scala n'est pas le meilleur choix pour le golf de code.
la source
C,
245185Formaté:
Usage:
la source
CJam,
2521 octetsTestez-le ici.
Prend l'entrée comme un entier pour la longueur de la sous-chaîne, et un tableau de zéros et de uns comme séquence:
Explication
Le résultat est imprimé automatiquement à la fin du programme.
Notez que je considère également des tranches qui commencent plus près de la fin que la longueur de sous-chaîne souhaitée, mais ce n'est pas grave, car ce sont des sous-chaînes de la dernière sous-chaîne valide et n'auront donc jamais plus de
1
s que cette dernière sous-chaîne valide.la source
Java 329 octets
allait impliquer un .matches (regex), mais il aurait été presque identique aux solutions python ci-dessus, j'ai donc essayé une fenêtre coulissante à la place. nouveau ici, donc si quelqu'un a des pointeurs, soyez heureux de les entendre.
}
la source
i
dans la troisième ligne. La plupart des espaces peuvent être supprimés. UtiliserSystem.out.print(
(pas de nouvelle ligne nécessaire). Au lieu deInteger.valueOf(
, vous pouvez utilisernew Integer(
.