Golf untuk menemukan nomor Boring


22

Jika bilangan bulat memiliki angka / urutan digit di dalamnya yang berulang terus menerus (Anda akan mengerti mengapa saya mengatakan "terus menerus") 5 kali atau lebih, kami menyebutnya "Membosankan".

Misalnya, 11111Membosankan, sedangkan 12345tidak.

Instruksi

Ambil Integer sebagai Input

Keluarkan nilai yang benar jika bilangan bulat itu membosankan, dan nilai yang salah jika bilangan bulat itu tidak membosankan.

Contoh

11111=> trueatau 1(1 berulang 5 kali)

12345=> falseatau0

1112111=> falseatau0

4242424242=> trueatau 1(42 berulang 5 kali)

-11111=> trueatau1

3452514263534543543543543543876514264527473275=> trueatau 1(543 berulang 5 kali)

Jika Anda menggunakan jenis "kebenaran" dan "salah" lainnya, sebutkan.

Aturan

Aturan main berlaku.

Semoga berhasil!


Apakah 1112111membosankan?
Leaky Nun

1
Apakah 4242424242membosankan?
Fatalkan

4242424242 membosankan.1112111 tidak.

22
Saya kira hari ini adalah hari angka yang tidak disukai siapa pun. :)
Seims

12
Sebenarnya, semua angka itu membosankan, karena semuanya dapat ditulis dengan angka nol di depan. :-)
celtschk

Jawaban:


13

05AB1E , 8 byte

Kode:

Œv¹y5×åO

Penjelasan:

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

Kebenaran adalah bukan nol dan kepalsuan adalah nol. Menggunakan pengkodean CP-1252 .

Cobalah online!


1
Penggunaan yang bagus dikombinasikan Œdengan ×.
Emigna

1
@Adnan Kerja Bagus! c =

23

Retina , 9 byte

(.+)\1{4}

Verifikasi semua testcases! (sedikit dimodifikasi untuk menjalankan semua testcass sekaligus.)


4
Tunggu, Orang-orang melakukannya dengan cepat?

Saya terlalu lambat untuk memposting ini. Knew Retina pasti suka tantangan ini :)
Emigna

@Emigna sorry xd
Leaky Nun

1
@LuisMendo Tidakkah itu cocok dengan 5+ apa pun, terlepas apakah itu sama atau tidak? Misalnya akan cocok12345
Emigna

4
@LuisMendo (.+){5}mengembang ke (.+)(.+)(.+)(.+)(.+)sementara (.+)\1{4}mengembang ke (.+)\1\1\1\1.
Leaky Nun

7

Java 8, 52 byte

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

Mengungguli jawaban Java 8 ini dengan langsungString#matches .

Penjelasan:

Coba di sini.

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();

Hore untuk lambda Jawa 8! Kembali truejika kecocokan ditemukan dan falsesebaliknya.

Cobalah secara Online! (Ideone)


4

Lua, 35 Bytes

Yah, saya tidak melihat bagaimana melakukan lebih baik dengan pola Lua! Mengambil argumen command-line sebagai input dan output niluntuk kasus falsy, dan nomor diulang saat kebenaran.

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

4

JavaScript, 16 byte

Dalam node.js (60 byte)

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

Buang satu ton byte pada input / output.

JavaScript ES6 (33 byte)

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

Sekali lagi membuang-buang byte pada input / output.

Lebih disukai, sebagai fungsi anonim (22 byte)

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

Atau bahkan lebih pendek ( 16 byte )

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

Terima kasih @BusinessCat untuk menunjukkan kesalahan saya.


1
Anda dapat menggunakan /(.+)\1{4}/.test(n)alih-alih matchyang menyimpan beberapa byte. Juga tidak terlihat seperti ini akan benar-benar menghasilkan apa pun.
Bisnis Cat

@BusinessCat Anda benar sekali, saya rasa saya melewatkan hal itu dalam pertanyaan. Terima kasih untuk sarannya.
charredgrass

Anda tidak perlu mengambil input standar, Anda bisa menggunakan argumen fungsi
cat

2
Uncaught TypeError: Method RegExp.prototype.test called on incompatible receiver undefined. Saya tidak yakin apakah itu secara teknis dianggap sebagai jawaban yang benar, bukankah harus seperti itu /./.test.bind(/(.+)\1{4}/)?
Patrick Roberts

Pertanyaannya menyatakan bahwa "angka berapa pun yang diulang 5 kali atau lebih " adalah Membosankan.
Sikat gigi

3

Python 3.5, 49 43 byte:

( -6 byte berkat tips dari Martin Ender ! )

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

Menggunakan Ekspresi Reguler untuk mencocokkan semua urutan karakter berulang selama mereka mengulangi terus menerus 5 kali atau lebih. Mengembalikan reobjek kecocokan (seperti <_sre.SRE_Match object; span=(0, 10), match='4242424242'>) jika kecocokan ditemukan sebagai nilai yang benar, dan tidak ada atau Nonesebagai nilai falsey.

Cobalah secara Online! (Ideone)


3
Ah, regex yang maha kuasa.

2
Ganti {4,}oleh {4}?
Leaky Nun

@ LeakyNun Ya, itu juga berfungsi.
R. Kap

Apa yang \1dilakukan setelah grup regex?
speedplane

@speedplane Mencocokkan setiap kemunculan pertandingan selanjutnya dari grup.
R. Kap

2

Perl, 17 15 byte

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

+ pbendera.

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

Terima kasih kepada Dom Hasting untuk (.+)alih - alih (\d+).

Penjelasan jika diperlukan: (.+)akan cocok dengan bagian mana pun dari nomor tersebut, dan \1{4}$mencari apakah itu diulang 4 kali eksekutif.


Bagus, tapi ada pegolf yang lebih baik di luar sana. Ini masih bagus.

4
Saya tidak yakin Perl dapat melakukan lebih baik dari itu ... Dan saya masih ingin mengirimkan solusi Perl, jadi ini dia.
Dada

Bisakah Anda menambahkan penjelasan?

Saya pikir Anda mungkin perlu $_=/(\d+)\1{4}/sebagai 111112membosankan tetapi ini tidak akan menangkapnya. Anda bahkan mungkin dapat menggunakan /./sesuai jawaban Retina.
Dom Hastings

1
Yup Anda benar, saya tring untuk mencocokkan "angka yang sangat membosankan" ketika hanya yang membosankan sudah cukup
Dada

1

C # - 93 38 byte

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

Mengambil string, mengembalikan bilangan bulat.

Terima kasih kepada aloisdg karena telah menghemat banyak byte!


Anda dapat menggunakan argumen sebagai string, yang seharusnya menghemat beberapa byte.
Leaky Nun

1
Tidak akan @"(.+)\1{4}"bekerja sebagai regex juga? Apakah di lingkungan C # saya setidaknya.
Emigna

Anda bisa menggunakan lambda. Boleh boleh saja. s=>Syst...
aloisdg mengatakan Reinstate Monica

@ Emigna - itu pasti akan berhasil terlepas dari lingkungan C #. Apa pun dengan> 5 karakter berurutan juga akan bekerja dengan tepat 5 karakter berurutan.
charredgrass

1
Juga, saya pikir kita harus bisa menulis s=>new Regex(@"(.+)\1{4}").IsMatch(s);Karena kita tetap di. NET (yang stdlib kami) dan kami tidak pernah menghitung using System.Linq;atau using System.Collections.Generic.
aloisdg mengatakan Reinstate Monica

1

Pyth , 9 8 byte

Terima kasih 1 byte untuk Maltysen.

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

Nilai sebenarnya adalah array yang tidak kosong.

Nilai Falsey adalah [](array kosong).

Suite uji.

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)

dapatkan 8 byte dengan mengganti mdengan fdan mengeluarkan jumlahnya.
Maltysen

1

Mathematica, 46 40 36 byte

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

Function. Takes a string as input and outputs True or False. Tests strings against the expression a__~~a__~~a__~~a__~~a__, which represents the same character sequence repeated 5 times. For reference, the shortest solution using a regex is 45 bytes long:

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

curse you RegularExpression!


Penggunaan pencocokan pola yang bagus.
mil

1

PHP, 37 33 bytes

terima kasih kepada NoOneIsHere, saya lupa <?=

program untuk PHP <5.4, mencetak 1untuk angka yang membosankan, yang 0lain

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

pemakaian:

  • ditetapkan register_globals=1dalam php.iniuntuk php-cgi
    then call php-cgi <filename> n=<number>;echo""
  • untuk PHP> = 5.4, ganti $ndengan$_GET[n]

solusi non-regexp, 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));
  • mengembalikan kode 1 untuk nomor yang membosankan, 0
    diganti die(1)dengan yang lain die(print 1)dan tambahkan echo 0;untuk mencetak
  • penggunaan yang sama seperti di atas, tetapi juga diatur short_open_tags=1jika dinonaktifkan
  • Loop luar mendapat nilai awal yang tidak masuk akal dalam golf, ganti $n+1dengan ceil(strlen($n)/5)+1atau setidaknya dengan strlen($n)untuk pengujian atau mungkin loop seperti selamanya.

1
<?=preg_match... beberapa karakter lebih pendek
NoOneIsHere

1

Haskell, 80 (63?)

Ini akan menjadi 63 jika tidak ada pernyataan impor.

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

Pemakaian

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

By the way, berturut-turut lebih masuk akal bagi saya daripada terus menerus.

(Maaf, saya belum bisa berkomentar.)


1
Saya harap Suara saya membantu membuat Anda dapat berkomentar.

0

MATLAB, 26 atau 13 byte

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

ini membutuhkan variabel integer 'i'. Sebuah string hanyalah bagian terakhir:

all(s==s(1))

Saya telah menghitung baris baru sebagai karakter.


Anda perlu menentukan input, mis. bawa i=input('')atau buat semuanya berfungsi (mis. @(i)...). BTW, saya tidak berpikir itu akan terlalu berat untuk mengambil bilangan bulat sebagai string. PS Saya pikir itu gagal untuk test case terakhir dan juga sederhana 211111.
pajonk

Siapa pun yang mengedit pertanyaan: Jangan lakukan itu. Jika OP belum merespons setelah beberapa saat (mis. Besok), maka Anda dapat mencoba mengedit. Juga, itu perlu dihapus, tidak disimpan sebagai tidak bersaing.
Rɪᴋᴇʀ

0

TSQL, 151 byte

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

Tidak Disatukan:

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

Biola


0

PowerShell, 26 byte

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

Saya sama sekali tidak master regex, jadi kredit untuk jawaban lain untuk itu.


0

Clojure, 24 byte

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

Menggunakan nilai-nilai kepalsuan clojure tentang nil/ falsedan nilai-nilai kebenaran untuk semua hal lainnya. Khususnya, nilketika tidak ada kecocokan yang ditemukan untuk false, dan sebuah array []untuk true ketika kecocokan ditemukan seperti untuk 11111 maka ["11111" "1"]itu benar.


0

JS tanpa regex, 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}

tidak diperkecil:

// 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
Hai, dan selamat datang di PPCG! Namun, ini benar-benar bisa bermain golf lebih banyak. Anda dapat menghapus spasi kosong hanya untuk kode yang jauh lebih pendek. Harap golfkan lebih banyak atau hapus.
R

Saya suka ide menghindari regex. Ganti (['membosankan', 'biarkan', 'salah', 'benar'] ['b', '', '0', '1']; yang memotong 20 karakter
Coomie
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.