高尔夫找到无聊的数字


22

如果一个整数中有一个数字/数字序列连续重复(您将理解为什么我说“连续”)5次或更多次,我们称其为“无聊”。

例如,“ 11111无聊”而12345不是“ 无聊” 。

使用说明

以整数作为输入

如果整数无聊,则输出真值;如果整数无聊,则输出假值。

11111=> true1(1重复5次)

12345=> false0

1112111=> false0

4242424242=> true1(42次重复5次)

-11111=> true1

3452514263534543543543543543876514264527473275=> true1(543重复5次)

如果您使用其他类型的“真”和“假”,请指定它。

规则

基本的规则适用。

祝好运!


1112111无聊?
Leaky Nun

1
4242424242无聊?
致命

4242424242很无聊,而1112111不是。

22
我想今天是没人喜欢的数字之日。:)
塞姆斯'16

12
严格来说,所有数字都很无聊,因为它们都可以用任意数量的前导零来写。:-)
celtschk 2016年

Answers:


13

05AB1E,8个字节

码:

Œv¹y5×åO

说明:

Œ         # 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.

Truthy是非零和falsy为零。使用CP-1252编码。

在线尝试!


1
尼斯使用结合Œ×
Emigna '16

1
@Adnan不错!c =

23

视网膜,9字节

(.+)\1{4}

验证所有测试用例!(稍作修改即可一次运行所有测试用例。)


4
等等,人们正在快速地这样做吗?

我发布它的速度太慢了。知道视网膜会喜欢这个挑战:)
Emigna '16

@Emigna对不起xd
Leaky Nun

1
@LuisMendo难道这不匹配任何5个以上的东西,无论它们是否相同?例如,它将匹配12345
Emigna '16

4
@LuisMendo (.+){5}扩展到,(.+)(.+)(.+)(.+)(.+)(.+)\1{4}扩展到(.+)\1\1\1\1
Leaky Nun

7

Java 8,52字节

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

这个Java 8答案直接超出了答案String#matches

说明:

在这里尝试。

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

6

Java 8、73 66字节:

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

Java 8 lambdas的万岁!true如果找到匹配项,则返回,false否则返回。

在线尝试!(爱迪生)


4

Lua,35字节

好吧,我看不出如何用Lua的模式做得更好!nil对于虚假情况,将命令行参数作为输入和输出,如果为真,则重复数字。

print((...):match("(%d+)%1%1%1%1"))

4

JavaScript,16个字节

在node.js(60字节)中

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

在输入/输出上浪费大量字节。

JavaScript ES6(33字节)

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

再次浪费输入/输出字节。

最好作为匿名函数(22字节)

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

甚至更短(16个字节

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

感谢@BusinessCat指出我的错误。


1
您可以使用/(.+)\1{4}/.test(n)代替match它节省一些字节。而且看起来它实际上不会输出任何东西。
商业猫

@BusinessCat你是完全正确的,我想我在这个问题上错过了。谢谢你的建议。
charredgrass

您不需要采取标准输入,你可以使用函数的参数

2
Uncaught TypeError: Method RegExp.prototype.test called on incompatible receiver undefined。我不确定从技术上讲这是否是正确的答案,不是一定要这样/./.test.bind(/(.+)\1{4}/)吗?
Patrick Roberts

问题指出,“任何数字重复5 次或以上 ”都是无聊的。
牙刷

3

Python 3.5、49 43字节:

-6字节多亏Martin Ender的提示!

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

使用正则表达式匹配所有重复的字符序列,只要它们连续重复5次或更多次。如果发现匹配项是真实值,而不是任何内容或假值,则返回re匹配对象(例如<_sre.SRE_Match object; span=(0, 10), match='4242424242'>None

在线尝试!(爱迪生)


3
啊,全能的正则表达式。

2
替换{4,}{4}
Leaky Nun

@LeakyNun是的,也可以。
R. Kap

\1正则表达式组之后该怎么办?
speedplane '16

@speedplane匹配组中匹配项的任何后续出现。
R. Kap

2

Perl,17个 15字节

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

+ p标志。

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

感谢Dom Hasting (.+)代替(\d+)

如果需要的话,进行解释: (.+)将匹配数字的任何部分,并\1{4}$搜索是否连续重复4次。


好人,但那里有更好的高尔夫球手。它仍然很好。

4
我不确定Perl可以做得更好...我仍然想提交Perl解决方案,所以就在这里。
达达

您能补充说明吗?

我认为您可能会$_=/(\d+)\1{4}/因为111112无聊而需要它,但这不会赶上它。您甚至可以/./按照Retina答案使用。
Dom Hastings

1
是的,您是对的,当无聊的电话就够了时,我很想匹配一个“非常无聊的电话号码”
Dada

1

C#-93 38字节

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

接受一个字符串,返回一个整数。

感谢aloisdg节省了大量字节!


不过,您可以将参数作为字符串使用,这样可以节省一些字节。
Leaky Nun

1
也不能@"(.+)\1{4}"用作正则表达式吗?至少在我的C#环境中。
Emigna '16

您可以使用lambda。这是允许的。s=>Syst...
aloisdg说恢复莫妮卡

@Emigna-不管C#环境如何,它绝对可以工作。大于5个连续字符的任何内容也将适用于5个连续字符。
charredgrass

1
另外,我认为我们应该能够编写代码,s=>new Regex(@"(.+)\1{4}").IsMatch(s);因为我们停留在.NET(他是我们的stdlib)中,我们从不考虑using System.Linq;or using System.Collections.Generic
aloisdg说恢复莫妮卡

1

Pyth9 8字节

1个字节,感谢Maltysen。

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

真实值是一个非空数组。

Falsey值为[](空数组)。

测试套件。

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)

通过替换mf和来获得8个字节。
Maltysen '16

1

Mathematica,46 40 36字节

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

功能。将字符串作为输入和输出TrueFalse。针对a__~~a__~~a__~~a__~~a__表示相同字符序列重复5次的表达式测试字符串。作为参考,使用正则表达式的最短解决方案为45个字节长:

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

骂你RegularExpression!


很好地使用模式匹配。
英里

1

PHP,37 33字节

多亏了NoOneIsHere,我忘了 <?=

PHP <5.4的程序,打印1无聊的数字,0否则

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

用法:

  • register_globals=1php.ini为PHP-CGI
    然后调用php-cgi <filename> n=<number>;echo""
  • 对于PHP> = 5.4,替换$n$_GET[n]

非正则表达式溶液,152 147 140个字节

<?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));
  • 返回无聊数字的退出代码1,否则返回0 并
    替换die(1)die(print 1)附加echo 0;并打印
  • 与上面相同的用法,但是short_open_tags=1如果禁用则进行设置
  • 外循环在打高尔夫球时获得了不合理的起始值,$n+1ceil(strlen($n)/5)+1或至少strlen($n)用来进行测试,否则它可能永远循环。

1
<?=preg_match...短几个字符
NoOneIsHere

1

哈斯克尔(80)(63?)

如果没有导入语句,则为63。

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

用法

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

顺便说一句,连续对我来说比连续更有意义

(对不起,我无法发表评论。)


1
I hope My upvote helped making yourself able to comment.

0

MATLAB, 26 or 13 bytes

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

this takes an integer variable 'i'. A string is just the last part:

all(s==s(1))

I have counted the newline as a character.


You need to specify the input, eg. take it with i=input('') or make the whole thing a function (eg. @(i)...). BTW, I dond think it would be too much stretch to take the integer as a string already. PS I think it fails for the last test case and also simple 211111.
pajonk

Whoever edited the question: Don't do that. If the OP hasn't responded after a while (e.g. tomorrow), then you can try to edit. Also, it needs to be deleted, not kept as non-competing.
Rɪᴋᴇʀ

0

TSQL, 151 bytes

Golfed:

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

Ungolfed:

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

Fiddle


0

PowerShell, 26 bytes

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

I'm by no means a regex master, so credit to the other answers for that.


0

Clojure, 24 bytes

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

Uses clojure's falsey values of nil/false and truthy values for everything else. Specifically, nil when no match is found for false, and an array [] for true when a match is found like for 11111 then ["11111" "1"] is true.


0

JS without 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 minified:

// 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'));

1
Hi, and welcome to PPCG! However, this can really be golfed more. You can remove just the extra whitespace for a much shorter code. Please either golf it more or delete.
Rɪᴋᴇʀ

I like the idea of avoiding regex. Replace(['boring','let','false','true']['b','','0','1']; that cut 20 characters
Coomie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.