Golf pour trouver des numéros ennuyeux

22

Si un entier contient un chiffre / une séquence de chiffres qui se répète en continu (vous comprendrez pourquoi j'ai dit "en continu") 5 fois ou plus, nous l'appelons "ennuyeux".

Par exemple, 11111est ennuyeux, alors qu'il 12345ne l'est pas.

Instructions

Prendre un entier comme entrée

Sortez une valeur véridique si l'entier est ennuyeux et une valeur de falsey si l'entier n'est pas ennuyeux.

Exemple

11111=> trueou 1(1 se répète 5 fois)

12345=> falseou0

1112111=> falseou0

4242424242=> trueou 1(42 répétitions 5 fois)

-11111=> trueou1

3452514263534543543543543543876514264527473275=> trueou 1(543 répétitions 5 fois)

Si vous utilisez d'autres types de «vérité» et «faux», spécifiez-le.

Règles

Les règles de base du s'appliquent.

Bonne chance!

Rɪᴋᴇʀ
la source
C'est 1112111ennuyeux?
Leaky Nun
1
C'est 4242424242ennuyeux?
Fatalize
4242424242 est ennuyeux. 11111111 ne l'est pas.
22
Je suppose qu'aujourd'hui est le jour des chiffres que personne n'aime. :)
Seims
12
À strictement parler, tous les nombres sont ennuyeux, car ils peuvent tous être écrits avec un nombre arbitraire de zéros en tête. :-)
celtschk

Réponses:

13

05AB1E , 8 octets

Code:

Œv¹y5×åO

Explication:

Œ         # Compute all substrings from the input.
 v        # For each substring.
   y5×    # Repeat the substring 5 times (42 × 5 = 4242424242).
  ¹   å   # Check if it's in the input string.
       O  # Sum up the result. Non-boring numbers should give 0.

La vérité est non nulle et la fausseté est nulle. Utilise l' encodage CP-1252 .

Essayez-le en ligne!

Adnan
la source
1
Belle utilisation en combinaison Œavec ×.
Emigna
1
@Adnan Nice Work! c =
23

Rétine , 9 octets

(.+)\1{4}

Vérifiez tous les tests! (légèrement modifié pour exécuter tous les tests en même temps.)

Leaky Nun
la source
4
Attendez, les gens le font aussi vite?
J'étais bien trop lent pour poster ça. Savait que Retina
adorerait
@Emigna sorry xd
Leaky Nun
1
@LuisMendo Cela ne correspond-il à rien de plus de 5, qu'ils soient identiques ou non? Par exemple, cela correspondrait12345
Emigna
4
@LuisMendo se (.+){5}développe en (.+)(.+)(.+)(.+)(.+)tandis qu'il se (.+)\1{4}développe en (.+)\1\1\1\1.
Leaky Nun
7

Java 8, 52 octets

s->s.matches(".*(.+)\\1{4}.*")

Outgolfed cette réponse Java 8 avec un direct String#matches.

Explication:

Essayez-le ici.

s->              // Method with String parameter and boolean return-type
  s.matches(     //  Return whether the entire String matches the following regex:
    ".*          //   0 or more leading characters
     (.+)\\1{4}  //   group of 1 or more characters, repeated 5 times
     .*")        //   0 or more trailing characters
Kevin Cruijssen
la source
6

Java 8, 73 66 octets:

L->java.util.regex.Pattern.compile("(.+)\\1{4}").matcher(L).find();

Hourra pour les lambdas Java 8! Renvoie truesi une correspondance est trouvée et falsesinon.

Essayez-le en ligne! (Ideone)

R. Kap
la source
4

Lua, 35 octets

Eh bien, je ne vois pas comment faire mieux avec les modèles de Lua! Prend un argument de ligne de commande comme entrée et sortie nilpour les cas de falsification, et le nombre répété lorsqu'il est véridique.

print((...):match("(%d+)%1%1%1%1"))
Katenkyo
la source
4

JavaScript, 16 octets

Dans node.js (60 octets)

process.stdin.on('data',t=>console.log(/(.+)\1{4}/.test(t)))

Gaspiller une tonne d'octets en entrée / sortie.

JavaScript ES6 (33 octets)

alert(/(.+)\1{4}/.test(prompt()))

Encore une fois gaspillage d'octets sur les entrées / sorties.

De préférence, en tant que fonction anonyme (22 octets)

n=>/(.+)\1{4}/.test(n)

Ou encore plus court ( 16 octets )

/(.+)\1{4}/.test

Merci @BusinessCat d'avoir signalé mes erreurs.

charredgrass
la source
1
Vous pouvez utiliser à la /(.+)\1{4}/.test(n)place de matchqui enregistre quelques octets. De plus, il ne semble pas que cela produira quoi que ce soit.
Business Cat
@BusinessCat Vous avez absolument raison, je suppose que j'ai raté cela dans la question. Merci pour la suggestion.
charredgrass
Vous n'avez pas besoin de prendre d'entrée standard, vous pouvez utiliser des arguments de fonction
cat
2
Uncaught TypeError: Method RegExp.prototype.test called on incompatible receiver undefined. Je ne sais pas si cela compte techniquement comme une réponse correcte, ne faudrait-il pas que ce soit quelque chose du genre /./.test.bind(/(.+)\1{4}/)?
Patrick Roberts
La question indique que "n'importe quel nombre répété 5 fois ou plus " est ennuyeux.
Brosse à dents
3

Python 3.5, 49 43 octets:

( -6 octets grâce aux conseils de Martin Ender ! )

import re;lambda u:re.search(r'(.+)\1{4}',u)

Utilise une expression régulière pour faire correspondre toutes les séquences de caractères répétitives tant qu'elles se répètent en continu 5 fois ou plus. Renvoie un reobjet de correspondance (tel que <_sre.SRE_Match object; span=(0, 10), match='4242424242'>) si une correspondance est trouvée comme valeur véridique, et rien ou Nonecomme valeur de falsey.

Essayez-le en ligne! (Ideone)

R. Kap
la source
3
Ah, le tout-puissant regex.
2
Remplacer {4,}par {4}?
Leaky Nun
@LeakyNun Ouais, ça marche aussi.
R. Kap
Que \1faire après le groupe regex?
speedplane
@speedplane Correspond à toutes les occurrences ultérieures du match du groupe.
R. Kap
2

Perl, 17 15 octets

$_=/(.+)\1{4}/

+ le pdrapeau.

(courir avec perl -pe '$_=/(.+)\1{4}/')

Merci à Dom Hasting pour le (.+)lieu de(\d+) .

Explications si nécessaire: (.+)correspondra à n'importe quelle partie du nombre et \1{4}$recherche s'il est répété 4 fois de suite.

Dada
la source
Bon, mais il y a de meilleurs golfeurs. C'est quand même bien.
4
Je ne suis pas sûr que Perl puisse faire mieux que ça ... Et je voulais toujours soumettre une solution Perl, alors la voici.
Dada
Pouvez-vous ajouter une explication?
Je pense que vous pourriez avoir besoin à la $_=/(\d+)\1{4}/place comme 111112c'est ennuyeux mais cela ne l'attrapera pas. Vous pourriez même être en mesure d'utiliser /./selon la réponse Retina.
Dom Hastings
1
Oui, vous avez raison, j'essayais de faire correspondre un «nombre très ennuyeux» alors que seuls ceux ennuyeux suffisaient
Dada
1

C # - 93 38 octets

s=>new Regex(@"(.+)\1{4}").IsMatch(s);

Prend une chaîne, retourne un entier.

Merci à aloisdg pour avoir économisé beaucoup d'octets!

Yytsi
la source
Vous pouvez cependant prendre l'argument sous forme de chaîne, ce qui devrait vous faire économiser quelques octets.
Leaky Nun
1
Ne @"(.+)\1{4}"fonctionnerait pas aussi comme l'expression régulière? Est-ce que dans mon environnement C # au moins.
Emigna
Vous pouvez utiliser un lambda. C'est permis. s=>Syst...
aloisdg dit Réintégrer Monica le
@Emigna - cela fonctionnerait certainement quel que soit l'environnement C #. Tout ce qui contient> 5 caractères consécutifs fonctionnera également pour exactement 5 caractères consécutifs.
charredgrass
1
De plus, je pense que nous devrions pouvoir écrire s=>new Regex(@"(.+)\1{4}").IsMatch(s);Parce que nous restons en .NET (qui est notre stdlib) et que nous ne comptons jamais pour using System.Linq;ou using System.Collections.Generic.
aloisdg dit Réintégrer Monica le
1

Pyth , 9 8 octets

1 octet grâce à Maltysen.

sm} * 5dQ .:
f} * 5TQ .:

La valeur vraie est un tableau non vide.

La valeur de Falsey est [](tableau vide).

Suite de tests.

f}*5TQ.:   input as a string stored in Q
f}*5TQ.:Q  implicit arguments
        Q  input
      .:   all substrings of.
f   T      filter for this condition, keep those returning true:
  *5           repeat five times
 }   Q         in Q? (True/False)
Leaky Nun
la source
obtenir 8 octets en remplaçant mavec fet en prenant la somme.
Maltysen
1

Mathematica, 46 40 36 octets

b=a__;StringContainsQ[b~~b~~b~~b~~b]

Une fonction. Prend une chaîne en entrée et en sortie Trueou False. Teste les chaînes par rapport à l'expression a__~~a__~~a__~~a__~~a__, qui représente la même séquence de caractères répétée 5 fois. Pour référence, la solution la plus courte utilisant une expression régulière fait 45 octets de long:

StringContainsQ@RegularExpression@"(.+)\1{4}"

vous maudit RegularExpression!

LegionMammal978
la source
Belle utilisation de la correspondance des motifs.
miles
1

PHP, 37 33 octets

grâce à NoOneIsHere, j'ai oublié <?=

programme pour PHP <5.4, imprime 1pour les nombres ennuyeux, 0sinon

<?=preg_match('/(.+)\1{4}/U',$n);

usage:

  • mettre register_globals=1en php.iniphp-cgi
    puis appelerphp-cgi <filename> n=<number>;echo""
  • pour PHP> = 5.4, remplacez $npar$_GET[n]

solution non regexp, 152 147 140 octets

<?for($e=$n+1;--$e;)for($f=$e;$f--;)for($a=str_split(substr($n,$f),$e),$k=$c='';strlen($v=array_pop($a));)$c-$v?$k=0&$c=$v:($k++<3?:die(1));
  • renvoie le code de sortie 1 pour les nombres ennuyeux, 0 sinon
    remplacez die(1)par die(print 1)et ajoutezecho 0; pour imprimer à la place
  • même utilisation que ci-dessus, mais également défini short_open_tags=1 si désactivé
  • La boucle externe a une valeur de départ déraisonnable dans le golf, remplacez-la $n+1par ceil(strlen($n)/5)+1ou au moins par strlen($n)pour les tests ou elle peut boucler comme pour toujours.
Titus
la source
1
<?=preg_match... est quelques caractères plus courts
NoOneIsHere
1

Haskell, 80 (63?)

Ce serait 63 s'il n'y avait pas de déclaration d'importation.

import Data.List
f x=or$tail[isInfixOf(concat$replicate 5 b)x|b<-subsequences x]

Usage

f "11111211"
f "11111"
f "12345" 
f "1112111"
f "4242424242"
f "-11111"
f "3452514263534543543543543543876514264527473275"

Soit dit en passant, consécutif a plus de sens pour moi que continuellement.

(Désolé, je ne peux pas encore commenter.)

Zylviij
la source
1
J'espère que mon vote positif a contribué à vous permettre de commenter.
0

MATLAB, 26 ou 13 octets

s=int2str(i);all(s==s(1))

cela prend une variable entière «i». Une chaîne n'est que la dernière partie:

all(s==s(1))

J'ai compté la nouvelle ligne comme un personnage.

Richard
la source
Vous devez spécifier l'entrée, par exemple. prenez-le avec i=input('')ou faites du tout une fonction (par exemple @(i)...). BTW, je ne pense pas que ce serait trop d'étirement pour prendre déjà l'entier comme une chaîne. PS Je pense que ça échoue pour le dernier cas de test et aussi simple 211111.
pajonk
Celui qui a édité la question: ne faites pas ça. Si l'OP n'a pas répondu après un certain temps (par exemple demain), vous pouvez essayer de le modifier. En outre, il doit être supprimé et non conservé comme non concurrent.
Rɪᴋᴇʀ
0

TSQL, 151 octets

Golfé:

DECLARE @t varchar(99)='11111'

,@z bit=0,@a INT=1,@ INT=1WHILE @a<LEN(@t)SELECT @z=IIF(@t LIKE'%'+replicate(SUBSTRING(@t,@a,@),5)+'%',1,@z),@=IIF(@=20,1,@+1),@a+=IIF(@=1,1,0)PRINT @z

Non golfé:

DECLARE @t varchar(99)='11111'

,@z bit=0,
@a INT=1,
@ INT=1
WHILE @a<LEN(@t)
  SELECT
    @z=IIF(@t LIKE'%'+replicate(SUBSTRING(@t,@a,@),5)+'%',1,@z),
    @=IIF(@=20,1,@+1),
    @a+=IIF(@=1,1,0)

PRINT @z

Violon

t-clausen.dk
la source
0

PowerShell, 26 octets

$args[0]-match"(.+)\1{4}"

Je ne suis en aucun cas un maître des regex, alors merci aux autres réponses pour cela.

ThePoShWolf
la source
0

Clojure, 24 octets

#(re-find #"(.+)\1{4}"%)

Utilise les valeurs falsey de clojure de nil/ falseet les valeurs véridiques pour tout le reste. Plus précisément, nillorsqu'aucune correspondance n'est trouvée pour false, et un tableau []pour true lorsqu'une correspondance est trouvée comme pour 11111 ["11111" "1"]est alors vraie.

Chris F
la source
0

JS sans regexes, 166

b=s=>{for(let i=0;i<s.length-4;i++){for(let n=1;n<=Math.floor((s.length-i)/5);n++){if([1,2,3,4].every(k=>s.slice(i,i+n)==s.slice(i+n*k,i+n*(k+1))))return 1}}return 0}

non minifié:

// test any start pos, and length
var b = s => {
    for (let i = 0; i <= s.length - 5; i++) {
        for (let n = 1; n <= Math.floor((s.length - i) / 5); n++) {
            // test if s is boring at position i, with length n
            if ([1, 2, 3, 4].every(k => s.slice(i, i + n) === s.slice(i + n * k, i + n * (k + 1)))) {
                return 1;
            }
        }
    }
    return 0;
};

console.log(b('11111'));
console.log(b('12345'));
console.log(b('1112111'));
console.log(b('-11111'));
console.log(b('3452514263534543543543543543876514264527473275'));
caub
la source
1
Bonjour et bienvenue chez PPCG! Cependant, cela peut vraiment être joué davantage. Vous pouvez supprimer uniquement les espaces supplémentaires pour un code beaucoup plus court. Veuillez jouer au golf plus ou supprimer.
Rɪᴋᴇʀ
J'aime l'idée d'éviter les regex. Remplacez (['ennuyeux', 'let', 'faux', 'vrai'] ['b', '', '0', '1']; cela coupe 20 caractères
Coomie