Golf, aby znaleźć nudne numery

22

Jeśli liczba całkowita zawiera cyfrę / sekwencję cyfr, która powtarza się w sposób ciągły (zrozumiesz, dlaczego powiedziałem „nieprzerwanie”) 5 lub więcej razy, nazywamy to „Nudnym”.

Na przykład 11111jest nudny, a 12345nie jest.

Instrukcje

Weź jako liczbę całkowitą

Podaj prawdziwą wartość, jeśli liczba całkowita jest nudna, i wartość falsey, jeśli liczba całkowita nie jest nudna.

Przykład

11111=> truelub 1(1 powtórzony 5 razy)

12345=> falselub0

1112111=> falselub0

4242424242=> truelub 1(42 powtórzenia 5 razy)

-11111=> truelub1

3452514263534543543543543543876514264527473275=> truelub 1(543 powtarza się 5 razy)

Jeśli używasz innych rodzajów „prawdy” i „fałszu”, podaj je.

Zasady

Obowiązują podstawowe zasady .

Powodzenia!

Rɪᴋᴇʀ
źródło
Czy jest 1112111nudno
Leaky Nun
1
Czy jest 4242424242nudno
Fatalize
4242424242 jest nudny. 1112111 nie.
22
Chyba dzisiaj jest dzień liczb, którego nikt nie lubi. :)
Wydaje się
12
Ściśle mówiąc, wszystkie liczby są nudne, ponieważ wszystkie można zapisać dowolną liczbą zer wiodących. :-)
celtschk

Odpowiedzi:

13

05AB1E , 8 bajtów

Kod:

Œv¹y5×åO

Wyjaśnienie:

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

Prawda jest niezerowa, a fałsz zero. Wykorzystuje kodowanie CP-1252 .

Wypróbuj online!

Adnan
źródło
1
Przyjemne użytkowanie w połączeniu Œz ×.
Emigna,
1
@Adnan Nice Work! c =
23

Siatkówka , 9 bajtów

(.+)\1{4}

Zweryfikuj wszystkie przypadki testowe! (nieznacznie zmodyfikowany, aby uruchomić wszystkie przypadki testowe jednocześnie).

Leaky Nun
źródło
4
Czekaj, ludzie robią to TAK szybko?
Byłem o wiele za wolny, żeby to opublikować. Wiedziała, że ​​Retina pokochałaby to wyzwanie :)
Emigna,
@Emigna sorry xd
Leaky Nun
1
@LuisMendo Czy to nie pasuje do żadnego 5+, niezależnie od tego, czy są takie same, czy nie? Na przykład pasowałoby12345
Emigna,
4
@LuisMendo (.+){5}rozwija się do, (.+)(.+)(.+)(.+)(.+)podczas gdy (.+)\1{4}rozwija się do (.+)\1\1\1\1.
Leaky Nun
7

Java 8, 52 bajty

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

Obezwładnił tę odpowiedź Java 8 bezpośrednio String#matches.

Wyjaśnienie:

Wypróbuj tutaj.

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
Kevin Cruijssen
źródło
6

Java 8, 73 66 bajtów:

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

Brawo dla Java 8 lambdas! Zwraca, truejeśli znaleziono dopasowanie i falseinaczej.

Wypróbuj online! (Ideone)

R. Kap
źródło
4

Lua, 35 bajtów

Cóż, nie widzę, jak lepiej sobie radzić z wzorami Lui! Pobiera argument wiersza polecenia jako dane wejściowe i wyjściowe nildla przypadków fałszowania, a liczba jest powtarzana, gdy jest prawdziwa.

print((...):match("(%d+)%1%1%1%1"))
Katenkyo
źródło
4

JavaScript, 16 bajtów

W node.js (60 bajtów)

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

Marnowanie ton bajtów na wejściu / wyjściu.

JavaScript ES6 (33 bajty)

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

Ponownie marnowanie bajtów na wejściu / wyjściu.

Najlepiej jako funkcja anonimowa (22 bajty)

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

Lub nawet krótszy ( 16 bajtów )

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

Dzięki @BusinessCat za wskazanie moich błędów.

charredgrass
źródło
1
Możesz użyć /(.+)\1{4}/.test(n)zamiast tego, aby matchzaoszczędzić kilka bajtów. Również nie wygląda na to, że tak naprawdę cokolwiek wyświetli.
Business Cat
@BusinessCat Masz całkowitą rację, myślę, że przegapiłem to w pytaniu. Dzieki za sugestie.
charredgrass,
Nie musisz brać standardowych danych wejściowych, możesz użyć argumentów funkcji
cat
2
Uncaught TypeError: Method RegExp.prototype.test called on incompatible receiver undefined. Nie jestem pewien, czy technicznie liczy się to jako poprawna odpowiedź, czy nie musi to być coś takiego /./.test.bind(/(.+)\1{4}/)?
Patrick Roberts,
Pytanie stwierdza, że ​​„dowolna liczba powtórzona 5 lub więcej razy” jest nudna.
Szczoteczka do zębów
3

Python 3.5, 49 43 bajtów:

( -6 bajtów dzięki wskazówkom Martina Endera ! )

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

Używa wyrażenia regularnego do dopasowania wszystkich powtarzających się sekwencji znaków, o ile powtarzają się one nieprzerwanie 5 lub więcej razy. Zwraca reobiekt dopasowania (np. <_sre.SRE_Match object; span=(0, 10), match='4242424242'>), Jeśli dopasowanie zostanie znalezione jako wartość zgodna z prawdą i jako nic lub Nonejako wartość falsey.

Wypróbuj online! (Ideone)

R. Kap
źródło
3
Ach, wszechmogący wyrażenie regularne.
2
Zastąpić {4,}przez {4}?
Leaky Nun
@LeakyNun Tak, to też działa.
R. Kap
Co \1robią po grupie wyrażeń regularnych?
speedplane
@speedplane Dopasowuje wszelkie kolejne wystąpienia dopasowania z grupy.
R. Kap
2

Perl, 17 15 bajtów

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

+ pflaga.

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

Dzięki Dom Hasting za (.+)zamiast(\d+) .

Wyjaśnienia w razie potrzeby: (.+)dopasują dowolną część liczby i \1{4}$sprawdzą, czy jest powtarzana 4 razy pod rząd.

Dada
źródło
Dobry, ale są lepsi golfiści. Jednak nadal jest dobry.
4
Nie jestem pewien, czy Perl może zrobić coś więcej ... I wciąż chciałem przedstawić rozwiązanie Perla, więc oto jest.
Dada,
Czy możesz dodać wyjaśnienie?
Myślę, że możesz potrzebować $_=/(\d+)\1{4}/zamiast tego, jak 111112to jest nudne, ale to nie złapie. Możesz nawet być w stanie użyć /./zgodnie z odpowiedzią Retina.
Dom Hastings,
1
Tak, masz rację, próbowałem dopasować „bardzo nudny numer”, kiedy tylko nudne były wystarczające
Dada
1

C # - 93 38 bajtów

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

Bierze ciąg, zwraca liczbę całkowitą.

Dzięki aloisdg za oszczędność wielu bajtów!

Yytsi
źródło
Możesz jednak wziąć argument za ciąg znaków, co powinno zaoszczędzić trochę bajtów.
Leaky Nun
1
Nie @"(.+)\1{4}"działałby również jako wyrażenie regularne? Czy przynajmniej w moim środowisku C #.
Emigna,
Możesz użyć lambda. To jest dozwolone. s=>Syst...
aloisdg mówi Przywróć Monikę
@Emigna - zdecydowanie zadziałałoby niezależnie od środowiska C #. Wszystko z> 5 kolejnymi postaciami będzie również działać dla dokładnie 5 kolejnych znaków.
charredgrass,
1
Ponadto uważam, że powinniśmy być w stanie pisać, s=>new Regex(@"(.+)\1{4}").IsMatch(s);ponieważ pozostajemy w .NET (który jest naszym stdlib) i nigdy nie liczymy na using System.Linq;lub using System.Collections.Generic.
aloisdg mówi Przywróć Monikę
1

Pyth , 9 8 bajtów

1 bajt dzięki Maltysen.

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

Prawda jest niepustą tablicą.

Wartość Falsey to [](pusta tablica).

Zestaw testowy.

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)
Leaky Nun
źródło
dostać 8 bajtów zastępując mze fi wyjmując sumę.
Maltysen
1

Mathematica, 46 40 36 bajtów

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

Funkcjonować. Bierze ciąg jako dane wejściowe i wyjściowe Truelub False. Testuje ciągi znaków względem wyrażenia a__~~a__~~a__~~a__~~a__, które reprezentuje tę samą sekwencję znaków powtórzoną 5 razy. Dla porównania, najkrótsze rozwiązanie z wyrażeniem regularnym ma długość 45 bajtów:

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

przeklinam cię RegularExpression!

LegionMammal978
źródło
Ładne użycie dopasowania wzoru.
mile
1

PHP, 37 33 bajtów

dzięki NoOneIsHere zapomniałem o tym <?=

Program dla PHP <5,4, druki 1dla nudny numery, 0inny

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

stosowanie:

  • zestaw register_globals=1w php.iniPHP CGI
    następnie zadzwonićphp-cgi <filename> n=<number>;echo""
  • PHP> = 5,4, wymienić $nz$_GET[n]

rozwiązanie nieregexp, 152 147 140 bajtów

<?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));
  • kod wyjścia zwraca 1 dla liczb nudny, 0 jeszcze
    wymienić die(1)z die(print 1)i dołączyć echo 0;do drukowania zamiast
  • takie samo użycie jak powyżej, ale również ustawione, short_open_tags=1jeśli wyłączone
  • Zewnętrzna pętla uzyskała nieuzasadnioną wartość początkową podczas gry w golfa, zamień $n+1ją na ceil(strlen($n)/5)+1lub przynajmniej strlen($n)na testowanie, lub może zapętlić się jak zawsze.
Tytus
źródło
1
<?=preg_match... jest kilka znaków krótszy
NoOneIsHere
1

Haskell, 80 (63?)

Byłoby 63, gdyby nie było wyciągu z importu.

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

Stosowanie

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

Nawiasem mówiąc, kolejne mają dla mnie większy sens niż ciągłe.

(Przepraszam, nie mogę jeszcze komentować.)

Zylviij
źródło
1
Mam nadzieję, że moje poparcie pomogło mi w komentowaniu.
0

MATLAB, 26 lub 13 bajtów

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

bierze to zmienną całkowitą „i”. Łańcuch to tylko ostatnia część:

all(s==s(1))

Policzyłem nowy wiersz jako znak.

Richard
źródło
Musisz podać dane wejściowe, np. weź to ze sobą i=input('')lub spraw, aby całość stała się funkcją (np. @(i)...). BTW, nie sądzę, że byłoby zbyt rozciągnięcie, aby wziąć liczbę całkowitą jako ciąg znaków. PS Myślę, że to się nie powiedzie w przypadku ostatniego testu, a także proste 211111.
pajonk
Ktokolwiek zredagował pytanie: nie rób tego. Jeśli OP nie zareagował po pewnym czasie (np. Jutro), możesz spróbować edytować. Ponadto należy go usunąć, a nie przechowywać jako niekonkurujący.
Rɪᴋᴇʀ
0

TSQL, 151 bajtów

Gra w golfa:

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

Nie golfowany:

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

Skrzypce

t-clausen.dk
źródło
0

PowerShell, 26 bajtów

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

W żadnym wypadku nie jestem mistrzem wyrażeń regularnych, więc dziękuję innym za to.

ThePoShWolf
źródło
0

Clojure, 24 bajty

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

Używa falsey wartości clojure i nil/ falsei prawdziwych wartości dla wszystkiego innego. W szczególności, nilgdy nie zostanie znalezione dopasowanie dla fałszu, a tablica []dla wartości true, gdy zostanie znalezione dopasowanie, jak dla 11111, wówczas ["11111" "1"]jest prawdziwa.

Chris F.
źródło
0

JS bez wyrażeń regularnych, 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}

nie zminimalizowane:

// 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'));
kauczuk
źródło
1
Cześć, witamy w PPCG! Można jednak naprawdę bardziej grać w golfa. Możesz usunąć tylko dodatkowe białe znaki dla znacznie krótszego kodu. Proszę golfa bardziej lub usuń.
Rɪᴋᴇʀ
Podoba mi się pomysł unikania wyrażenia regularnego. Zamień ([„nudne”, „niech”, „fałsz”, „prawda”] [„b”, ​​„”, „0”, „1”]; które przecinają 20 znaków
Coomie,