Czy to n-speak?


33

Zainspirowany Czy to podwójne mówienie? , Opracowałem trudniejsze wyzwanie. Biorąc pod uwagę ciąg, określ, czy ciąg jest n-speak , dla dowolnego n2 .

N-speak jest definiowany poprzez powtarzanie każdej litery n razy. Przy n=4 ciąg Hellojest przekształcany na HHHHeeeelllllllloooo. Twoim celem jest ustalenie, czy dane wejściowe są prawidłowymi danymi wyjściowymi dla transformacji n-speak.

Należy zauważyć, że każde zdanie, które jest ważne n-speak, dla n=2k , jest również ważne k-speak. Zatem trudnymi częściami do rozwiązania będą nieparzyste wartości n .

Wkład

Ciąg składający się z co najmniej 2 znaków. Dane wejściowe mogą być również listą znaków. W danych wejściowych rozróżniana jest wielkość liter.

Wydajność

Truthyjeśli ciąg jest n-speak, w falseyprzeciwnym razie.

Przykłady

Prawdziwe przypadki

HHeelllloo,,  wwoorrlldd!!
TTTrrriiipppllleee   ssspppeeeaaakkk
QQQQuuuuaaaaddddrrrruuuupppplllleeee    ssssppppeeeeaaaakkkk
7777777-------ssssssspppppppeeeeeeeaaaaaaakkkkkkk
999999999
aaaabb
aaaaaaaabbbbcc
aaaaabbbbb
@@@

Jeśli chcesz wygenerować dodatkowe prawdziwe przypadki, możesz użyć tego skryptu MathGolf . Umieść ciąg w cudzysłowie, a wartość n jako dane wejściowe.

Fałszywe przypadki

Hello, world!
TTTrrriiipppllleee   speak
aaaaaaaaaaaaaaaab
Ddoouubbllee  ssppeeaakk
aabbab
aaaabbb
a (does not need to be handled)
(empty string, does not need to be handled)

Oczywiście, ponieważ jest to kod golfowy, przygotuj się na przycięcie niektórych bajtów!


Sugerowany przypadek testowy:aabbab
Adám

Sugerowany przypadek testowy:aaaabbb
640 KB

Dodam je jutro, dobre sugestie.
maxb

4
Jestem naprawdę zaszczycony i zaszczycony, że wykorzystałeś i rozszerzyłeś moje wyzwanie :)
AJFaraday

@AJFaraday cieszę się, że ci się podobało! Podobały mi się oba twoje wyzwania, co dało mi pomysł na to jedno. Wkrótce może pojawić się jeszcze trudniejsze wyzwanie.
maxb

Odpowiedzi:


16

APL (Dyalog Unicode) , 12 bajtów

Działa z ⎕io←0

1≠∨/⍸2≠/∊00

Wypróbuj online!

Grałem razem z Adamem .

Na wejściu (przykład: "aaccccaaaaaabb" przy użyciu ""do oznaczenia ciągu (tablicy znaków) i ''do oznaczenia znaku

∊0⍞0 otaczaj zerem i spłaszczaj, 0 'a' 'a' 'c' 'c' 'c' 'c' 'a' 'a' 'a' 'a' 'a' 'a' 'b' 'b' 0

2≠/ wykonać pary nierównomierne, 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1

uzyskaj indeksy 0-indeksowane, 0 2 6 12 14

∨/ obliczyć GCD, 2

1≠ czy to nie jest równe 1?


10

Java 10, 85 bajtów

s->{var r=0>1;for(int i=0;++i<s.length();)r|=s.matches("((.)\\2{"+i+"})*");return r;}

Regex przeniesiony z odpowiedzi JavaScript @Arnauld .

Wypróbuj online.

Wyjaśnienie:

s->{                          // Method with String parameter and boolean return-type
  var r=0>1;                  //  Result-boolean, starting at false
  for(int i=0;++i<s.length();)//  Loop `i` in the range [1, input-length):
    r|=                       //   Change the result to true if:
      s.matches("((.)\\2{"+i+"})*");
                              //    The input-String matches this regex
                              // NOTE: String#matches implicitly adds a leading ^ and 
                              //       trailing $ to match the full String
  return r;}                  // After the loop, return the result-boolean

Wyjaśnienie Regex:

^((.)\2{i})*$                 // Full regex to match, where `i` is the loop-integer
^           $                 // If the full String matches:
  (.)                         //  A character
     \2{i}                    //  Appended with that same character `i` amount of times
 (        )*                  //  And that repeated zero or more times for the entire string


7

JavaScript (ES6), 53 bajty

Pochodzi z wyrażenia regularnego używanego przez @wastl w Czy to podwójne mówienie? .

s=>[...s].some((_,n)=>s.match(`^((.)\\2{${++n}})*$`))

Wypróbuj online!


Wersja rekurencyjna, 55 bajtów

s=>(g=n=>s[++n]&&!!s.match(`^((.)\\2{${n}})*$`)|g(n))``

Wypróbuj online!

Skomentował

s => (                    // s = input string
  g = n =>                // g is a recursive function taking a repetition length n
    s[++n] &&             // increment n; abort if s[n] is not defined
    !!s.match(            // otherwise, test whether s consists of groups of:
      `^((.)\\2{${n}})*$` //   some character, followed by n copies of the same character
    )                     //
    | g(n)                // or whether it works for some greater n
)``                       // initial call to g with n = [''] (zero-ish)


6

Python 2 , 73 70 69 67 bajtów

lambda s:s in[''.join(c*n for c in s[::n])for n in range(2,len(s))]

Wypróbuj online!

-4 bajty, dzięki Jitse


2
Można zapisać 3 bajty zastępując set(...)z{...}
Jitse

1
Możesz również usunąć miejsce w...1 in[...
Jitse

@Jitse Thanks :)
TFeld


5

QuadS , 16 bajtów SBCS

1≠∨/⍵
(.)\1*
⊃⍵L

Wypróbuj online!

1≠ jest 1 inny niż

∨/ GCD

 z wyniku

(.)\1* PCRE Wyszukiwanie dowolnego znaku, po którym następuje 0 lub więcej powtórzeń

⊃⍵L i zwracanie pierwszej długości dopasowania (tj. długości dopasowania)



4

Zapytanie T-SQL 2008, 193 bajty

DECLARE @ varchar(max)='bbbbbbccc';

WITH C as(SELECT number+2n,@ t
FROM spt_values
WHERE'P'=type
UNION ALL 
SELECT n,stuff(t,1,n,'')FROM C
WHERE left(t,n)collate Thai_Bin=replicate(left(t,1),n))SELECT 1+1/~count(*)FROM C
WHERE''=t

Wypróbuj online


Czy „sortowanie Thai_Bin” jest naprawdę konieczne?
Dr Y Wit

1
@DrYWit to zależy, w bazie danych można ustawić rozróżnianie wielkości liter. Jednak bazy danych uwzględniające wielkość liter nie są popularnym wyborem. Można to lepiej rozwiązać za pomocą HASHBYTES lub VARBINARY, ale jest to bardziej kosztowne w bajtach
t-clausen.dk

4

PHP ,76 75 bajtów

while(($x=strspn($argn,$argn[$n+=$x],$n))>1&&($m=max($m,$x))%$x<1);echo!$x;

Wypróbuj online!

Pierwsza próba, nieco naiwne podejście iteracyjne.

Nie golfowany:

// get the length of the next span of the same char
while( $s = strspn( $argn, $argn[ $n ], $n ) ) {

    // if span is less than 2 chars long, input is not n-speak
    if ( $s < 2 ) {
        break;
    }

    // k is GCD
    $k = max( $k, $s );

    // if span length does not divide evenly into GCD, input is not n-speak
    if( ( $k % $s ) != 0 ) {
        break;
    }

    // increment current input string index
    $n += $s;

}

-1 bajt , dzięki za @ Noc2!


4

Perl 6 , 30 27 26 bajtów

{1-[gcd] m:g/(.)$0*/>>.to}

Wypróbuj online!

Używa także sztuczki GCD, ale używa indeksu pozycji końcowej każdego przebiegu dopasowanego przez wyrażenie regularne. Zwraca liczbę ujemną (prawda), jeśli n-speak, zero (falsey) w przeciwnym razie.




3

Brachylog , 5 bajtów

ġz₂=Ṁ

Wypróbuj online!

Pobiera dane wejściowe przez zmienną wejściową i dane wyjściowe w wyniku powodzenia lub niepowodzenia.

Na początku myślałem, że to rzeczywiście będzie krótsze niż moje rozwiązanie Czy to podwójne mówienie? , ale potem zdałem sobie sprawę, że ġmożna i spróbuję grupy o długości 1.

ġ        It is possible to split the input into chunks of similar length
 z₂      such that they have strictly equal length, and zipped together
    Ṁ    there are multiple results
   =     which are all equal.

3

Japt , 8 bajtów

ò¦ mÊrÕÉ

Spróbuj

ò¦ mÊrÕÉ     :Implicit input of string
ò            :Partition by
 ¦           :  Inequality
   m         :Map
    Ê        :  Length
     r       :Reduce by
      Õ      :  GCD
       É     :Subtract 1
             :Implicit output of boolean negation

3

Kotlin , 78 bajtów

{s->(2..s.length/2).any{i->s.chunked(i).all{z->z.length==i&&z.all{z[0]==it}}}}

Wypróbuj online!

Wyjaśnienie

{s->                      Take a string as input
  (2..s.length/2)         The each string needs two parts at least, prevents the case "aaa" is 3-speak
    .any{i->              If there is any n (in this case i) that is n-speak return true
      s.chunked(i)        Split into length i substrings
      .all{z->            All substrings z
        z.length==i       Should be completely full, ie. "aaa"->["aa","a"]
        &&                And
        z.all{            All chars (it)
          z[0]==it        Should be the same as the first char
        }
      }
    }
  }

Być może opis jest niejasny, ale „aaa” jest poprawne 3-mów. Łańcuch wejściowy powinien mieć co najmniej dwa znaki, ale nie muszą być różne.
maxb

@maxb, ok fajnie. To powinno być -2 bajty. Dziękuję za aktualizację. Naprawię to jutro
Brojowski

3

Scala , 80 bajtów

s=>"(.)\\1*".r.findAllIn(s).map(_.size).reduce((x,y)=>(BigInt(x) gcd y).toInt)>1

Wypróbuj online!

PS. Oryginalne rozwiązanie było oparte na splitfunkcji, ale jest dłuższe (83 bajty).

s=>(s+s).split("(.)(?!\\1)").map(_.size+1).reduce((x,y)=>(BigInt(x) gcd y).toInt)>1

Niestety, to zwraca truedane wejściowe aab.
maxb

@maxb, dzięki za sprawdzenie. s.zastąpione przez, (s+s).aby sobie z tym poradzić.
Dr Y Wit

Dobra robota! Chociaż teraz zauważyłem, że zawodzi aaaabbi aabbbb.
maxb

@maxb, przepraszam, teraz testowałem na wszystkich twoich testowych przypadkach od początku postu.
Dr Y Wit



2

Brain-Flak, 96 bytes

{<>({}())<>({}[({})]){{}<>({}<>){{(({})){({}[()])<>}{}}<>([{}()]({}<>)<>)}(<>)<>}{}}<>{}({}[()])

Try it online!

Uses the same GCD trick that many other submissions use. Output is 0 if the input is not n-speak, and a positive integer otherwise.

# For each character in the input
{

  # Add 1 to current run length
  <>({}())<>

  # If current and next characters differ:
  ({}[({})]){

    # Clean up unneeded difference
    {}<>

    # Move current run length to left stack, exposing current GCD on right stack
    ({}<>)

    # GCD routine: repeat until L=0
    {

      # Compute L mod R
      {(({})){({}[()])<>}{}}<>

      # Move R to left stack; finish computing L mod R and push to right stack
      ([{}()]({}<>)<>)

    }

    # Push 0 for new run length
    (<>)<>

  }{}

}

# Output GCD-1
<>{}({}[()])

2

Oracle SQL, 182 bytes

select+1-sign(min(length(x)-(select sum(length(regexp_substr(x,'(.)\1{'||i||'}',1,level)))from t connect by level<length(x))))from(select x,level i from t connect by level<length(x))

It works with an assumption that input data is stored in a table t(x), e.g.

with t(x) as (select 'HHeelllloo,,  wwoorrlldd!!' from dual)

2

K (ngn/k), 29 23 bytes

{~|/(&/s@&1<s)!s:#'=:x}

Try it online!

edit: removed some unnecessary colons (i know when a monadic is required but it's not always clear to me if there's ambiguity so i default to including the colon) and changed the mod x-y*x%y to ngn/k's y!x, which meant i could remove a variable assignment


1

APL (Dyalog Unicode), 24 22 bytesSBCS

Anonymous tacit prefix function.

⊂∊1↓⍳∘≢{⍵/⍨(≢⍵)⍴⍺↑⍺}¨⊂

Try it online!

 enclose the string to treat map using the entire string
 e.g. "aaabbb"

⍳∘≢{ for each of the ɩndices 1 through the tally of characters in the string:
 e.g. 3

⍺↑⍺ take the current number of elements from the current number, padding with 0s
 e.g. [3,0,0]

(≢⍵)⍴ cyclically reshape into the shape of the tally of characters in the string
  e.g. [3,0,0,3,0,0]

⍵/⍨ use that to replicate the string's characters
  "aaabbb"

1↓ drop the first one (n = 1)

⊂∊ is the the entire string a member of that list?


Are you dividing the input string into n-sized chunks, and checking that all characters are equal within each chunk? I haven't gotten into APL, but it's definitely the most readable "golfing" language.
maxb

@maxb I'm in the process of writing an explanation. I'm filtering with all possible masks [1,0,0,1,0,0…] etc. I'll be happy to teach you APL (it doesn't take long to learn). Just pop unto the APL Orchard.
Adám


@Cowsquack Clever, and different, so why don't you post {1<∨/≢¨⍵⊆⍨≢¨∪\⍵}?
Adám

Unfortunately it fails for aacccaaaaabb
Kritixi Lithos

1

Retina 0.8.2, 28 bytes

M!`(.)\1*
.
.
^(..+)(\1|¶)*$

Try it online! Link includes test cases. Explanation:

M!`(.)\1*

Split the text into runs of identical characters.

.
.

Replace them all with the same character.

^(..+)(\1|¶)*$

Check whether the GCD of the lengths of the runs is greater than 1.



1

MathGolf, 14 bytes

£─╞möl╠mÅ▀£╙╓┴

Try it online!

Explanation

Checks all possible divisions of the input string into equal length chunks, and checks if there is a partition in which all chunks have just one unique character.

£                length of string with pop
 ─               get divisors
  ╞              discard from left of string/array (removes 1)
   mö            explicit map using 7 operators
     l           push input
      ╠          divide input into chunks of size k
       mÅ        explicit map using 2 operators
         ߜ      number of unique elements of list
           ╙     get maximum number of unique characters per chunk
                 loop ends here
            ╓    get the minimum of all maximums
             ┴   check if equal to 1


1

Pyth, 8 bytes

<1iFhMr8

Try it online!

<1iFhMr8Q   Implicit: Q=eval(input())
            Trailing Q inferred
      r8Q   Run length encode Q into [count, character]
    hM      Take first element of each
  iF        Reduce by GCD
<1          Is 1 less than the above? Implicit print

1

Perl 5 -n, 38 bytes

for$i(1..y///c){print/^((.)\2{$i})*$/}

Try it online!

The print"\n" in the footer is needed to separate the outputs.

Straightforward loop through all possible ns. Outputs nothing for "1-speak", anything else for n-speak where n > 1.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.