Це російськомовна мова?


33

Натхненний: чи це подвійне розмовляння? , Я створив складніший виклик. Дано рядок, визначте, чи є рядок n-говорить , для будь-якого .n2

N-говорить визначається повторенням кожної літери разів. При рядок перетворюється в . Ваша мета - з'ясувати, чи є вхідним результатом для будь-якого n-говорить перетворення.nn=4HelloHHHHeeeelllllllloooo

Слід зазначити, що будь-яке речення, яке є дійсним n-говорить, для , також є дійсним k-говорить. Таким чином, важкі частини для вирішення будуть непарними значеннями .n=2kn

Вхідні дані

Рядок, що складається щонайменше з 2 символів. Введенням може бути також список символів. Вхідні дані залежать від регістру.

Вихід

Truthyякщо рядок n-говорить, в falseyіншому випадку.

Приклади

Справжні випадки

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

Якщо ви хочете генерувати додаткові справжні справи, ви можете використовувати цей скрипт MathGolf . Помістіть рядок у лапки, а значення як вхідне.n

Неправдиві випадки

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

Звичайно, оскільки це кодовий гольф, будьте готові обрізати кілька байтів!


Рекомендований тестовий випадок:aabbab
Adám

Рекомендований тестовий випадок:aaaabbb
640 КБ

Я додам їх обом завтра, гарні пропозиції.
maxb

4
Мені по-справжньому приємно і втішено, що ви використали та розширили мою проблему :)
AJFaraday

@AJFaraday рада, що тобі сподобалось! Я сподобався обом вашим викликам, що дало мені ідею для цього. Можливо, незабаром буде ще складніше виклик.
maxb

Відповіді:


16

APL (Dyalog Unicode) , 12 байт

Працює з ⎕io←0

1≠∨/⍸2≠/∊00

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

Полювали разом з Адамом .

На вході (приклад:, "aaccccaaaaaabb"використовуючи ""для позначення рядка (масив знаків) і ''для позначення знака)

∊0⍞0 оточіть 0 і сплющуйте, 0 'a' 'a' 'c' 'c' 'c' 'c' 'a' 'a' 'a' 'a' 'a' 'a' 'b' 'b' 0

2≠/ виконувати попарно не рівно, 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1

отримати 0-індексовані індекси, 0 2 6 12 14

∨/ обчислити GCD, 2

1≠ це не дорівнює 1?


10

Java 10, 85 байт

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

Regex відісланий від відповіді JavaScript @Arnauld .

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

Пояснення:

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

Пояснення 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 байти

Похідне від регулярного виразу, використовуваного @wastl у " Чи подвійне говорити? .

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

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


Рекурсивна версія, 55 байт

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

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

Прокоментував

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)

7

Я думав, що мій 14 байт у MathGolf був гарним, але ти просто розчавив його. Я б хотів пояснення як цього, так і вашої відповіді Желе.
maxb

2
@maxb Це дійсно просто займає тривалість роботи групи, обчислює їх GCD і тести, якщо це не 1.
Ерік Outgolfer



5

QuadS , 16 байт SBCS

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

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

1≠ відрізняється від 1

∨/ GCD

 результату

(.)\1* PCRE Пошук будь-якого персонажа з наступним 0 або більше повторами

⊃⍵L і повернення першого з матчів (тобто тривалість матчу)



4

Запит T-SQL 2008, 193 байт

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

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


Чи дійсно необхідна "порівнювати Thai_Bin"?
Доктор Y Віт

1
@DrYЯк це залежить, база даних може бути налаштована як залежна від регістру. Але бази даних, що враховують регістри, не є популярним вибором. З цим можна впоратися краще інакше, використовуючи HASHBYTES або, можливо, VARBINARY, але це дорожче в байтах
t-clausen.dk

4

PHP ,76 75 байт

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

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

Перша спроба, дещо наївний ітеративний підхід.

Безголівки:

// 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 байт , Thx, щоб @ Night2!


4

Perl 6 , 30 27 26 байт

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

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

Також використовується трюк GCD, але використовує індекс кінцевої позиції кожного прогону, зіставлений з регулярним виразом. Повертає від'ємне число (truthy), якщо n-говорять, zero (falsey) в іншому випадку.




3

Брахілог , 5 байт

ġz₂=Ṁ

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

Приймає вхід через вхідну змінну та виводить через успіх чи невдачу.

Спочатку я подумав, що це насправді буде коротше, ніж моє рішення: Чи подвійне говорити? , але потім я зрозумів, що ġможна і спробую групу довжиною 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

Котлін , 78 байт

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

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

Пояснення

{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
        }
      }
    }
  }

Можливо, опис незрозумілий, але "aaa" дійсний у 3-х мовах. Вхідний рядок повинен мати щонайменше два символи, але вони не повинні бути різними.
maxb

@maxb, добре класно. Це повинно бути -2 байти. Дякуємо за оновлення. Я
виправлю

3

Скала , 80 байт

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

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

PS. Оригінальне рішення базувалося на splitфункції, але воно довше (83 байти).

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

На жаль, це повертається trueдля введення даних aab.
maxb

@maxb, дякую за перевірку. s.замінено, (s+s).щоб впоратися з цим.
Доктор Y Віт

Хороша робота! Хоча зараз я помітив, що це не вдається aaaabbі для aabbbb.
maxb

@maxb, вибачте, зараз я перевірив усі ваші тестові справи з початкового поста.
Доктор Y Віт



2

Мозок-Флак , 96 байт

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

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

Використовується той самий трюк GCD, який використовують багато інших матеріалів. Вихід 0, якщо вхід не n-говорить, а додатне ціле число в іншому випадку.

# 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 байти

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

Це працює з припущенням, що вхідні дані зберігаються у таблиці t (x), наприклад

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

2

К (нг / к) , 29 23 байт

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

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

редагувати: видалив непотрібні колонки (я знаю, коли потрібна монадія, але мені не завжди зрозуміло, чи є двозначність, тому я за замовчуванням x-y*x%yвключаю двокрапку) і змінив мод на ngn / k y!x, що означало, що я можу видалити змінне призначення


1

APL (Dyalog Unicode) , 24 22 байти SBCS

Функція анонімного негласного префікса.

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

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

 додайте рядок для обробки карти, використовуючи весь рядок,
 наприклад"aaabbb"

⍳∘≢{...  для кожного з ɩ ndices 1 через підрахунок символів в рядку:
 наприклад ,3

⍺↑⍺ візьміть поточну кількість елементів із поточного числа, набиваючи 0,
 наприклад[3,0,0]

(≢⍵)⍴ циклічно r змініть форму підрахунку символів у рядку,
  наприклад[3,0,0,3,0,0]

⍵/⍨ використовуйте це для копіювання символів рядка
  "aaabbb"

1↓ кинути перший ( n = 1)

⊂∊ чи весь рядок є членом цього списку?


Ви поділяєте рядок введення на шматки розміру n і перевіряєте, чи всі символи рівні в кожному фрагменті? Я ще не потрапив у APL, але це, безумовно, найчитабельніша "гольфна" мова.
maxb

@maxb Я зараз пишу пояснення. Я фільтрую всі можливі маски [1,0,0,1,0,0…]і т.д. Я буду радий навчити вас APL (це не займе багато часу, щоб навчитися). Просто попсуйте до саду APL .
Адам


@Cowsquack Розумний та інший, то чому б ти не опублікував {1<∨/≢¨⍵⊆⍨≢¨∪\⍵}?
Адам

На жаль, це не вдаєтьсяaacccaaaaabb
Kritixi Lithos

1

Сітківка 0,8,2 , 28 байт

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

M!`(.)\1*

Розбийте текст на прогони однакових символів.

.
.

Замініть їх усіх одним і тим же символом.

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

Перевірте, чи більше GCD довжини прогонів більше 1.



1

MathGolf , 14 байт

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

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

Пояснення

Перевіряє всі можливі поділи вхідного рядка на шматки однакової довжини та перевіряє, чи є розділ, у якому всі шматки мають лише один унікальний символ.

£                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

Perl 5 -n , 38 байт

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

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

Футер print"\n"в нижньому колонтитулі потрібен для розділення виходів.

Пряма петля через всі можливі ns. Виводить нічого не для "1-говорять", нічого іншого для n-говорять, де n> 1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.