Гольф, щоб знайти нудні номери


22

Якщо ціле число має в ньому цифру / послідовність цифр, яка повторюється постійно (Ви зрозумієте, чому я сказав "безперервно") 5 і більше разів, ми називаємо це "Нудно".

Наприклад, 11111це нудно, тоді 12345як ні.

Інструкції

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

Виведіть значення truthy, якщо ціле число нудне, і значення falsey, якщо ціле число не є нудним.

Приклад

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нудно?
Leaky Nun

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.

Truthy не дорівнює нулю, а фальш - нуль. Використовує кодування CP-1252 .

Спробуйте в Інтернеті!


1
Приємне використання в поєднанні Œз ×.
Емінья

1
@Adnan Приємна робота! c =

23

Сітківка , 9 байт

(.+)\1{4}

Перевірте всі тести! (трохи модифікований для запуску всіх тестів одразу.)


4
Зачекайте, люди це швидко роблять?

Я був занадто повільним, щоб опублікувати це. Знав, що Retina дуже сподобається цьому виклику :)
Emigna

@Emigna вибачте xd
Leaky Nun

1
@LuisMendo Чи не відповідає жодному 5+ нічого, незалежно від того, вони однакові чи ні? Наприклад, це відповідало б12345
Емінья

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


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як значення фальси.

Спробуйте в Інтернеті! (Ідеон)


3
Ах, всемогутній вираз.

2
Замінити {4,}на {4}?
Leaky Nun

@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 за те, що ви зберегли багато байтів!


Ви можете взяти аргумент як рядок, що має заощадити кілька байтів.
Leaky Nun

1
Також не буде @"(.+)\1{4}"працювати як регулярний вираз? Принаймні в моєму середовищі C #.
Емінья

Можна використовувати лямбда. Це дозволено. 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

Піта , 9 8 байт

1 байт завдяки Малтісену.

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

Значення Truthy - це не порожній масив.

Значення Фальсі є [] (порожній масив).

Тестовий набір.

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і виймаючи суму.
Мальтісен

1

Математика, 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.
pajonk

Хто б не редагував питання: Не робіть цього. Якщо ОП через деякий час не реагує (наприклад, завтра), ви можете спробувати відредагувати. Крім того, його потрібно видалити, а не зберігати як неконкурентного.
Rɪᴋᴇʀ

0

TSQL, 151 байт

Гольф:

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

Безголівки:

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та truthy значення для всього іншого. Зокрема, nilколи не знайдено збігу для false, а масив []для true, коли збіг знайдено як для 11111, то ["11111" "1"]є істинним.


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.