Гольф, чтобы найти скучные номера


22

Если целое число содержит цифру / последовательность цифр, которая повторяется непрерывно (вы поймете, почему я сказал «непрерывно») 5 или более раз, мы называем это «скучно».

Например, 11111скучно, а 12345нет.

инструкции

Возьмите целое число в качестве входных данных

Выведите истинное значение, если целое число скучно, и значение false, если целое число не скучно.

пример

11111=> trueили 1(1 повторяется 5 раз)

12345=> falseили0

1112111=> falseили0

4242424242=> trueили 1(42 повторяется 5 раз)

-11111=> trueили1

3452514263534543543543543543876514264527473275=> trueили 1(543 повторяется 5 раз)

Если вы используете другие типы «истина» и «ложь», укажите это.

правила

Применяются основные правила .

Удачи!


Является ли 1112111скучно?
Дрянная Монахиня

1
Является ли 4242424242скучно?
фатализировать

4242424242 скучно.1112111 нет.

22
Я думаю, сегодня день чисел, который никто не любит. :)
Сеил

12
Строго говоря, все числа скучны, так как все они могут быть записаны с произвольным числом ведущих нулей. :-)
celtschk

Ответы:


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.

Истина отлична от нуля, а ложь равна нулю. Использует кодировку CP-1252 .

Попробуйте онлайн!


1
Хорошее использование в сочетании Œс ×.
Эминья

1
@ Adnan Отличная работа! c =

23

Сетчатка , 9 байт

(.+)\1{4}

Проверьте все тестовые случаи! (немного изменен, чтобы запускать все тестовые сценарии одновременно.)


4
Подождите, люди делают это так быстро?

Я был слишком медленным, чтобы опубликовать это. Знал, что Retina будет любить этот вызов :)
Emigna

@Emigna извините xd
Утренняя монахиня

1
@ LuisMendo Разве это не соответствует 5+, независимо от того, одинаковые они или нет? Например, это будет соответствовать12345
Emigna

4
@LuisMendo (.+){5}расширяется до, (.+)(.+)(.+)(.+)(.+)а (.+)\1{4}расширяется до (.+)\1\1\1\1.
Дрянная Монахиня

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


4

Луа, 35 байт

Ну, я не вижу, как сделать лучше с образцами Луа! Принимает аргумент командной строки в качестве входных и выходных данных 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

Вам не нужно принимать стандартный ввод, вы можете использовать аргументы функции
cat

2
Uncaught TypeError: Method RegExp.prototype.test called on incompatible receiver undefined, Я не уверен, что это технически считается правильным ответом, разве это не должно быть что-то вроде /./.test.bind(/(.+)\1{4}/)?
Патрик Робертс

В вопросе говорится, что «любое число, повторенное 5 или более раз» скучно.
Зубная щетка

3

Python 3.5, 49 43 байта:

( -6 байт благодаря советам Мартина Эндера ! )

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

Использует регулярное выражение для сопоставления всех повторяющихся последовательностей символов, если они повторяются непрерывно 5 или более раз. Возвращает reобъект совпадения (например, <_sre.SRE_Match object; span=(0, 10), match='4242424242'>), если совпадение найдено как истинное значение, а ничего или Noneкак ложное значение.

Попробуйте онлайн! (Ideone)


3
Ах, всемогущее регулярное выражение.

2
Заменить {4,}на {4}?
Дрянная Монахиня

@ LeakyNun Да, это тоже работает.
Р. Кап

Что \1делать после группы регулярных выражений?
скоростной самолет

@speedplane Сопоставляет любые последующие вхождения совпадения из группы.
Р. Кап

2

Perl, 17 15 байт

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

+ pфлаг.

(беги с perl -pe '$_=/(.+)\1{4}/')

Спасибо Дому Хастингу за (.+)вместо (\d+).

Пояснения, если необходимо: (.+)будет соответствовать любой части числа, и \1{4}$ищет, если это будет повторяться 4 раза подряд.


Хороший, но есть лучшие игроки в гольф там. Это все еще хорошо, хотя.

4
Я не уверен, что Perl может сделать лучше, чем это ... И я все еще хотел представить решение Perl, так что вот оно.
Дада

Можете ли вы добавить объяснение?

Я думаю, что вам может понадобиться $_=/(\d+)\1{4}/вместо этого, как 111112скучно, но это не поймет. Вы могли бы даже быть в состоянии использовать /./согласно ответу Retina.
Дом Гастингс

1
Да, вы правы, я пытался сопоставить «очень скучное число», когда хватало только скучных
Dada

1

C # - 93 38 байт

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

Принимает строку, возвращает целое число.

Спасибо aloisdg за сохранение большого количества байтов!


Вы можете принять аргумент в виде строки, что должно сэкономить вам несколько байтов.
Утренняя монахиня

1
Не будет @"(.+)\1{4}"работать в качестве регулярного выражения, а? Есть ли в моей среде C # по крайней мере.
Emigna

Вы можете использовать лямбду. Это разрешено s=>Syst...
говорит Aloisdg Восстановить Монику

@Emigna - это определенно будет работать независимо от среды C #. Все, что имеет> 5 последовательных символов, также будет работать ровно для 5 последовательных символов.
Charredgrass

1
Кроме того, я думаю, что мы должны иметь возможность писать, s=>new Regex(@"(.+)\1{4}").IsMatch(s);потому что мы остаемся в .NET (что является нашим stdlib), и мы никогда не рассчитываем на using System.Linq;или using System.Collections.Generic.
говорит aloisdg Восстановить Монику

1

Pyth , 9 8 байт

1 байт благодаря Maltysen.

см} * 5dQ .:
е} * 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)

получить 8 байт путем замены mс fи вынимая сумму.
Maltysen

1

Mathematica, 46 40 36 байт

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

Функция. Принимает строку в качестве ввода и вывода Trueили False. Проверяет строки на выражение a__~~a__~~a__~~a__~~a__, которое представляет одну и ту же последовательность символов, повторенную 5 раз. Для справки, самое короткое решение с использованием регулярных выражений имеет длину 45 байт:

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

проклинаю тебя, регулярное выражение!


Хорошее использование сопоставления с образцом.
миль

1

PHP, 37 33 байта

спасибо NoOneIsHere, я забыл о <?=

программа для PHP <5.4, печать 1для скучных чисел, 0другое

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

использование:

  • набор register_globals=1в php.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+1с ceil(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
Я надеюсь, что мой голос помог сделать себя способным комментировать.

0

MATLAB, 26 или 13 байтов

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

это принимает целочисленную переменную 'i'. Строка это только последняя часть:

all(s==s(1))

Я посчитал символ новой строки.


Вам нужно указать вход, например. возьмите это с собой i=input('')или сделайте все это функцией (например, @(i)...). Кстати, я не думаю, что было бы слишком много, чтобы взять целое число в виде строки. PS Я думаю, что это не так для последнего теста, а также просто 211111.
Пайонк

Кто бы ни редактировал вопрос: не делай этого. Если ОП не ответил через некоторое время (например, завтра), то вы можете попробовать отредактировать. Кроме того, он должен быть удален, а не сохранен как неконкурентный.
Rɪᴋᴇʀ

0

TSQL, 151 байт

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

скрипка


0

PowerShell, 26 байт

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

Я ни в коем случае не мастер регулярных выражений, так что поверьте другим ответам за это.


0

Clojure, 24 байта

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

Использует ложные значения clojure nil/ falseи истинные значения для всего остального. В частности, nilкогда совпадение не найдено для false, а массив []для true, когда совпадение найдено, например, для 11111, тогда ["11111" "1"]true.


0

JS без регулярных выражений, 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}

не минимизированный:

// 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
Привет и добро пожаловать в PPCG! Тем не менее, это действительно может быть в гольф больше. Вы можете удалить только лишние пробелы для гораздо более короткого кода. Пожалуйста, играйте в гольф больше или удалите.
Rɪᴋᴇʀ

Мне нравится идея избегать регулярных выражений. Заменить (['скучно', 'пусть', 'ложно', 'верно'] ['b', '', '0', '1']; это вырезало 20 символов
Coomie
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.