Chơi gôn để tìm số nhàm chán


22

Nếu một số nguyên có một chữ số / dãy số trong đó lặp lại liên tục (Bạn sẽ hiểu lý do tại sao tôi nói "liên tục") 5 lần trở lên, chúng tôi gọi đó là "Chán".

Ví dụ, 11111là nhàm chán, trong khi 12345không.

Hướng dẫn

Lấy một số nguyên làm đầu vào

Xuất ra một giá trị trung thực nếu số nguyên là nhàm chán và giá trị falsey nếu số nguyên không nhàm chán.

Thí dụ

11111=> truehoặc 1(1 lần lặp lại 5 lần)

12345=> falsehoặc0

1112111=> falsehoặc0

4242424242=> truehoặc 1(42 lần lặp lại 5 lần)

-11111=> truehoặc1

3452514263534543543543543543876514264527473275=> truehoặc 1(543 lặp lại 5 lần)

Nếu bạn sử dụng các loại "sự thật" và "sai" khác, hãy chỉ định nó.

Quy tắc

Quy tắc cơ bản được áp dụng.

Chúc may mắn!


1112111chán không?
Leaky Nun

1
4242424242chán không?
Gây tử vong vào

4242424242 là nhàm chán.1112111 thì không.

22
Tôi đoán hôm nay là ngày của những con số không ai thích. :)
Xem

12
Nói đúng ra, tất cả các con số đều nhàm chán, vì tất cả chúng đều có thể được viết với một số 0 tùy ý hàng đầu. :-)
celtschk

Câu trả lời:


13

05AB1E , 8 byte

Mã số:

Œv¹y5×åO

Giải trình:

Œ         # 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 không phải là zero và falsy là zero. Sử dụng mã hóa CP-1252 .

Hãy thử trực tuyến!


1
Sử dụng đẹp kết hợp Œvới ×.
Emigna

1
@Ad Nam Làm việc tốt! c =

23

Võng mạc , 9 byte

(.+)\1{4}

Xác nhận tất cả các thử nghiệm! (sửa đổi một chút để chạy tất cả các testcase cùng một lúc.)


4
Đợi đã, mọi người đang làm nó nhanh thế?

Tôi đã quá chậm để đăng bài này. Được biết Retina sẽ thích thử thách này :)
Emigna

@Emigna xin lỗi xd
Leaky Nun

1
@LuisMendo Không phù hợp với bất kỳ 5+ bất cứ điều gì cho dù chúng có giống nhau hay không? Ví dụ: nó sẽ khớp12345
Emigna 7/07/2016

4
@LuisMendo (.+){5}mở rộng (.+)(.+)(.+)(.+)(.+)trong khi (.+)\1{4}mở rộng đến (.+)\1\1\1\1.
Nữ tu bị rò rỉ

7

Java 8, 52 byte

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

Vượt qua câu trả lời Java 8 này bằng một câu trực tiếp String#matches.

Giải trình:

Hãy thử nó ở đây.

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 byte:

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

Hoan hô cho Java 8 lambdas! Trả về truenếu trận đấu được tìm thấy và falsenếu không.

Dùng thử trực tuyến! (Ý)


4

Lua, 35 byte

Chà, tôi không thấy làm thế nào để làm tốt hơn với các mẫu của Lua! Lấy một đối số dòng lệnh làm đầu vào và đầu ra nilcho các trường hợp giả mạo và số được lặp lại khi trung thực.

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

4

JavaScript, 16 byte

Trong node.js (60 byte)

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

Lãng phí một tấn byte trên đầu vào / đầu ra.

JavaScript ES6 (33 byte)

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

Một lần nữa lãng phí byte trên đầu vào / đầu ra.

Tốt hơn là, như một hàm ẩn danh (22 byte)

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

Hoặc thậm chí ngắn hơn ( 16 byte )

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

Cảm ơn @BusinessCat đã chỉ ra những sai lầm của tôi.


1
Bạn có thể sử dụng /(.+)\1{4}/.test(n)thay vì matchtiết kiệm một vài byte. Ngoài ra, nó không giống như điều này thực sự sẽ tạo ra bất cứ điều gì.
Mèo kinh doanh

@BusinessCat Bạn hoàn toàn đúng, tôi đoán tôi đã bỏ lỡ điều đó trong câu hỏi. Cám ơn vì sự gợi ý.
charredgrass

Bạn không cần lấy đầu vào tiêu chuẩn, bạn có thể sử dụng các đối số chức năng
cat

2
Uncaught TypeError: Method RegExp.prototype.test called on incompatible receiver undefined. Tôi không chắc nếu điều đó về mặt kỹ thuật được coi là một câu trả lời đúng, thì nó có cần phải giống như thế /./.test.bind(/(.+)\1{4}/)không?
Patrick Roberts

Câu hỏi nói rằng "bất kỳ số nào lặp lại 5 lần trở lên " là nhàm chán.
Bàn chải đánh răng

3

Python 3.5, 49 43 byte:

( -6 byte nhờ các mẹo từ Martin Ender ! )

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

Sử dụng Biểu thức chính quy để khớp với tất cả các chuỗi ký tự lặp lại miễn là chúng lặp lại liên tục 5 lần trở lên. Trả về một ređối tượng khớp (chẳng hạn như <_sre.SRE_Match object; span=(0, 10), match='4242424242'>) nếu một kết quả khớp được tìm thấy như một giá trị trung thực và không có gì hoặc Nonelà một giá trị falsey.

Dùng thử trực tuyến! (Ý)


3
Ah, regex toàn năng.

2
Thay thế {4,}bằng {4}?
Nữ tu bị rò rỉ

@LeakyNun Vâng, điều đó cũng hoạt động.
R. Kap

Làm gì \1sau nhóm regex?
siêu tốc 8/8/2016

@speedplane Kết hợp mọi lần xuất hiện tiếp theo của trận đấu từ nhóm.
R. Kap

2

Perl, 17 15 byte

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

+ pcờ.

(chạy với perl -pe '$_=/(.+)\1{4}/')

Cảm ơn Dom Hasting đã (.+)thay thế(\d+) .

Giải thích nếu cần: (.+)sẽ khớp với bất kỳ phần nào của số và \1{4}$tìm kiếm nếu nó được lặp lại 4 lần liên tiếp.


Tốt, nhưng có những người chơi golf tốt hơn ngoài kia. Nó vẫn tốt mặc dù.

4
Tôi không chắc Perl có thể làm tốt hơn thế ... Và tôi vẫn muốn gửi giải pháp Perl, vì vậy đây là.
Dada

Bạn có thể thêm một lời giải thích?

Tôi nghĩ rằng bạn có thể cần $_=/(\d+)\1{4}/thay vì 111112nhàm chán nhưng điều này sẽ không bắt được nó. Bạn thậm chí có thể sử dụng /./theo câu trả lời của Retina.
Dom Hastings

1
Vâng, bạn đã đúng, tôi đã cố gắng khớp với một "số rất nhàm chán" khi chỉ những số nhàm chán là đủ
Dada

1

C # - 93 38 byte

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

Lấy một chuỗi, trả về một số nguyên.

Cảm ơn aloisdg vì đã tiết kiệm rất nhiều byte!


Bạn có thể lấy đối số làm một chuỗi, điều này sẽ giúp bạn tiết kiệm một số byte.
Rò rỉ Nun

1
Sẽ không @"(.+)\1{4}"hoạt động như regex là tốt? Có trong môi trường C # của tôi ít nhất.
Emigna

Bạn có thể sử dụng lambda. Điều đó được cho phép. s=>Syst...
aloisdg nói Phục hồi lại

@Emigna - nó chắc chắn sẽ hoạt động bất kể môi trường C #. Bất cứ điều gì có> 5 ký tự liên tiếp cũng sẽ hoạt động cho chính xác 5 ký tự liên tiếp.
charredgrass

1
Ngoài ra, tôi nghĩ rằng chúng tôi sẽ có thể viết s=>new Regex(@"(.+)\1{4}").IsMatch(s);Bởi vì chúng tôi ở lại .NET (mà stdlib của anh ấy) và chúng tôi không bao giờ được tính cho using System.Linq;hoặc using System.Collections.Generic.
aloisdg nói Phục hồi lại

1

Bình thường , 9 8 byte

1 byte nhờ Maltysen.

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

Giá trị thật là một mảng không trống.

Giá trị Falsey là [] (mảng trống).

Bộ thử nghiệm.

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)

nhận được 8 byte bằng cách thay thế mbằng fvà lấy ra tổng.
Maltysen

1

Toán học, 46 40 36 byte

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

Chức năng. Lấy một chuỗi làm đầu vào và đầu ra Truehoặc False. Kiểm tra các chuỗi chống lại biểu thức a__~~a__~~a__~~a__~~a__, đại diện cho chuỗi ký tự tương tự được lặp lại 5 lần. Để tham khảo, giải pháp ngắn nhất sử dụng regex dài 45 byte:

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

nguyền rủa bạn thường xuyên!


Đẹp sử dụng kết hợp mô hình.
dặm

1

PHP, 37 33 byte

cảm ơn NoOneIsHere, tôi đã quên mất <?=

chương trình cho PHP <5.4, in 1cho số nhàm chán, 0khác

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

sử dụng:

  • bộ register_globals=1php.inicho php-cgi
    sau đó gọiphp-cgi <filename> n=<number>;echo""
  • cho PHP> = 5.4, thay thế $nbằng$_GET[n]

giải pháp không regrec, 152 147 140 byte

<?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));
  • lợi nhuận thoát mã 1 cho số nhàm chán, 0 khác
    thay thế die(1)với die(print 1)và nối thêm echo 0;để in thay vì
  • sử dụng tương tự như trên, nhưng cũng được đặt short_open_tags=1nếu bị tắt
  • Vòng lặp bên ngoài có giá trị bắt đầu không hợp lý trong việc chơi gôn, thay thế $n+1bằng ceil(strlen($n)/5)+1hoặc ít nhất là strlen($n)để thử nghiệm hoặc nó có thể lặp lại như mãi mãi.

1
<?=preg_match... là một vài ký tự ngắn hơn
NoOneIsHãy

1

Haskell, 80 (63?)

Nó sẽ là 63 nếu không có báo cáo nhập khẩu.

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

Sử dụng

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

Nhân tiện, liên tiếp có ý nghĩa với tôi hơn là liên tục.

(Xin lỗi, tôi chưa thể bình luận.)


1
Tôi hy vọng upvote của tôi đã giúp làm cho bản thân có thể nhận xét.

0

MATLAB, 26 hoặc 13 byte

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

cái này lấy một biến số nguyên 'i'. Một chuỗi chỉ là phần cuối cùng:

all(s==s(1))

Tôi đã tính dòng mới là một nhân vật.


Bạn cần chỉ định đầu vào, ví dụ. mang nó với i=input('')hoặc làm cho toàn bộ một chức năng (ví dụ. @(i)...). BTW, tôi không nghĩ rằng nó sẽ quá căng để lấy số nguyên làm chuỗi. PS Tôi nghĩ rằng nó thất bại cho trường hợp thử nghiệm cuối cùng và cũng đơn giản 211111.
pyjama 7/07/2016

Bất cứ ai chỉnh sửa câu hỏi: Đừng làm điều đó. Nếu OP không trả lời sau một thời gian (ví dụ ngày mai), thì bạn có thể thử chỉnh sửa. Ngoài ra, nó cần phải được xóa, không được giữ như là không cạnh tranh.
Rɪᴋᴇʀ

0

TSQL, 151 byte

Chơi gôn

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

Ung dung:

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

Vĩ cầm


0

PowerShell, 26 byte

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

Tôi không có nghĩa là một bậc thầy regex, vì vậy hãy tin vào những câu trả lời khác cho điều đó.


0

Clojure, 24 byte

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

Sử dụng các giá trị falsey của clojure về nil/ falsevà các giá trị trung thực cho mọi thứ khác. Cụ thể, nilkhi không tìm thấy kết quả khớp cho sai và một mảng []là đúng khi tìm thấy kết quả khớp như đối với 11111 thì ["11111" "1"]đúng.


0

JS không có biểu thức chính quy, 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}

không rút gọn:

// 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
Xin chào, và chào mừng đến với PPCG! Tuy nhiên, điều này thực sự có thể được chơi golf nhiều hơn. Bạn có thể xóa chỉ khoảng trắng thừa cho mã ngắn hơn nhiều. Vui lòng đánh gôn nhiều hơn hoặc xóa.
Rɪᴋᴇʀ

Tôi thích ý tưởng tránh regex. Thay thế (['nhàm chán', 'cho phép', 'sai', 'đúng'] ['b', '', '0', '1']; cắt 20 ký tự
Coomie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.