Это н-говорить?


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
Адам

Предлагаемый тестовый пример:aaaabbb
640KB

Я добавлю их оба завтра, хорошие предложения.
максимум

4
Я искренне рад и польщен тем, что вы использовали и расширили мой вызов :)
AJFaraday

@AJFaraday рад, что тебе понравилось! Мне понравились обе ваши задачи, которые дали мне идею для этого. Возможно, скоро будет еще более сложная задача.
максимум

Ответы:


16

APL (Dyalog Unicode) , 12 байт

Работает с ⎕io←0

1≠∨/⍸2≠/∊00

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

Гольф вместе с Адамом .

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

∊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 перенесен из ответа @Arnauld 's JavaScript .

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

Объяснение:

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

05AB1E , 5 байтов

γ€g¿≠

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


Я думал, что мой 14-байтовый в MathGolf был хорошим, но вы просто сломали его. Я хотел бы получить объяснение как для этого, так и для вашего ответа желе.
максимум

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

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


Является ли "collate Thai_Bin" действительно необходимым?
Доктор У Вит

1
@DrYWit это зависит, база данных может быть настроена с учетом регистра. Но чувствительные к регистру базы данных не являются популярным выбором. Это может быть обработано лучше по-разному, используя 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;

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

Первая попытка, несколько наивный итеративный подход.

Ungolfed:

// 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 байт , спасибо @ Night2!


4

Perl 6 , 30 27 26 байт

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

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

Также использует трюк GCD, но использует индекс конечной позиции каждого прогона, соответствующего регулярному выражению. Возвращает отрицательное число (truey), если n-говорить, ноль (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
        }
      }
    }
  }

Возможно, описание неясно, но «ааа» действительно 3-говорящий. Входная строка должна содержать как минимум два символа, но они не должны быть разными.
максимум

@ maxb, хорошо, круто. Это должно быть -2 байта. Спасибо за обновление. Я исправлю это завтра
Brojowski

3

Scala , 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, спасибо за проверку. s.заменил, (s+s).чтобы справиться с этим.
Доктор У Вит

Отличная работа! Хотя теперь я заметил, что это не для aaaabbи aabbbb.
максимум

@maxb, извиняюсь, теперь я проверил на всех ваших тестовых примерах начиная с поста.
Доктор У Вит



2

Brain-Flak , 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

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

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

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

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


1

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

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

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

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

 приложите строку для обработки карты, используя всю строку,
 например"aaabbb"

⍳∘≢{ Для каждого из 1- х пунктов с помощью набора символов в строке:
 например,3

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

(≢⍵)⍴ циклический г eshape в форму бирки символов в строке ,
  например ,[3,0,0,3,0,0]

⍵/⍨ используйте это для репликации символов строки
  "aaabbb"

1↓ отбросить первый ( n = 1)

⊂∊ Является ли вся строка членом этого списка?


Делите ли вы входную строку на куски n-размера и проверяете, чтобы все символы были равны внутри каждого чанка? Я не попал в APL, но это определенно самый читаемый язык "игры в гольф".
максимум

@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"В сноске необходимо отделить выходы.

Простая петля через все возможные nс. Ничего не выводит для "1-говорящего", ничего для n-говорящего, где n> 1.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.