Questo è n-speak?


33

Ispirato da Parla due volte? , Ho escogitato una sfida più dura. Data una stringa, determinare se la stringa è n-speak , per qualsiasi .n2

N-speak si definisce ripetendo ogni lettera volte. Con , la stringa viene trasformata in . Il tuo obiettivo è capire se l'input è un output valido per qualsiasi trasformazione n-speak.nn=4HelloHHHHeeeelllllllloooo

Va notato che qualsiasi frase valida n-speak, per , è valida anche k-speak. Pertanto, le parti difficili da risolvere saranno valori dispari di .n=2kn

Ingresso

Una stringa composta da almeno 2 caratteri. L'input potrebbe anche essere un elenco di caratteri. L'input fa distinzione tra maiuscole e minuscole.

Produzione

Truthyse la stringa è n-speak, falseyaltrimenti.

Esempi

Casi veri

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

Se vuoi generare ulteriori casi di verità, puoi usare questo script MathGolf . Inserire la stringa tra virgolette e il valore di come input.n

Falsi casi

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

Naturalmente, dato che si tratta di codice golf, preparati a tagliare alcuni byte!


Caso di prova suggerito:aabbab
Adám,

Caso di prova suggerito:aaaabbb
640 KB

Li aggiungerò entrambi domani, buoni suggerimenti.
max

4
Sono sinceramente onorato e lusingato che tu abbia usato e ampliato la mia sfida :)
AJFaraday

@AJFaraday felice che ti sia piaciuto! Mi sono piaciute entrambe le tue sfide, che mi hanno dato l'idea per questa. Potrebbe esserci una sfida ancora più difficile in arrivo.
maxb

Risposte:


16

APL (Dyalog Unicode) , 12 byte

Funziona con ⎕io←0

1≠∨/⍸2≠/∊00

Provalo online!

Giocato a golf insieme ad Adám .

Sull'input (esempio :, "aaccccaaaaaabb"usando ""per indicare una stringa (una matrice di caratteri) e ''per indicare un carattere)

∊0⍞0 circondare con 0 e appiattire, 0 'a' 'a' 'c' 'c' 'c' 'c' 'a' 'a' 'a' 'a' 'a' 'a' 'b' 'b' 0

2≠/ eseguire a coppie non uguali, 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1

ottenere gli indici indicizzati 0, 0 2 6 12 14

∨/ calcolare il GCD, 2

1≠ questo non è uguale a 1?


10

Java 10, 85 byte

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

Regex portato dalla risposta JavaScript di @Arnauld .

Provalo online.

Spiegazione:

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

Spiegazione 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 byte

Derivato dall'espressione regolare usata da @wastl in È double speak? .

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

Provalo online!


Versione ricorsiva, 55 byte

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

Provalo online!

Commentate

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 byte

γ€g¿≠

Provalo online!


Ho pensato che il mio 14-byte in MathGolf fosse buono, ma l'hai appena schiacciato. Mi piacerebbe una spiegazione sia per questo che per la tua risposta Jelly.
max

2
@maxb Prende davvero solo le lunghezze delle corse di gruppo, calcola il loro GCD e verifica se non è 1.
Erik the Outgolfer



5

QuadS , 16 byte SBCS

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

Provalo online!

1≠ è 1 diverso da

∨/ il GCD

 del risultato di

(.)\1* PCRE Ricerca di qualsiasi carattere seguito da 0 o più ripetizioni dello stesso

⊃⍵L e restituendo la prima delle lunghezze della partita (ovvero la lunghezza della partita)



4

Query T-SQL 2008, 193 byte

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

Provalo online


"Collate Thai_Bin" è davvero necessario?
Dr Y Wit,

1
@DrYWit dipende, il database potrebbe essere impostato come case sensitive. Ma i database con distinzione tra maiuscole e minuscole non sono una scelta popolare. Questo potrebbe essere gestito in modo diverso usando HASHBYTES o forse VARBINARY, ma è più costoso in byte
t-clausen.dk

4

PHP ,76 75 byte

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

Provalo online!

Primo tentativo, un approccio iterativo un po 'ingenuo.

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 byte , grazie a @ Night2!


4

Perl 6 , 30 27 26 byte

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

Provalo online!

Utilizza anche il trucco GCD, ma utilizza l'indice della posizione finale di ogni corsa corrispondente a regex. Restituisce un numero negativo (verità) se n-parla, zero (falsa) altrimenti.




3

Brachylog , 5 byte

ġz₂=Ṁ

Provalo online!

Riceve input attraverso la variabile input e output in caso di esito positivo o negativo.

In un primo momento ho pensato che questo sarebbe stato in realtà più breve della mia soluzione a È il doppio parlare? , ma poi ho capito che ġpuò e proverà una lunghezza di gruppo di 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 byte

ò¦ mÊrÕÉ

Provalo

ò¦ 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 byte

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

Provalo online!

Spiegazione

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

Forse la descrizione non è chiara, ma "aaa" è valido in 3 lingue. La stringa di input deve contenere almeno due caratteri, ma non devono essere diversi.
max

@maxb, ok fantastico. Dovrebbero essere -2 byte. Grazie per l'aggiornamento. Lo aggiusterò domani
Brojowski il

3

Scala , 80 byte

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

Provalo online!

PS. La soluzione originale era basata sulla splitfunzione ma è più lunga (83 byte).

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

Questo ritorna trueper input aab, sfortunatamente.
max

@maxb, grazie per il controllo. s.sostituito con (s+s).per gestirlo.
Dr Y Wit,

Buon lavoro! Anche se ora ho notato che fallisce per aaaabbe aabbbb.
max

@maxb, mi scuso, ora ho testato tutti i tuoi casi di test dal post iniziale.
Dr Y Wit,



2

Brain-Flak , 96 byte

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

Provalo online!

Utilizza lo stesso trucco GCD utilizzato da molti altri invii. L'output è 0 se l'ingresso non è n-speak e un numero intero positivo altrimenti.

# 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 byte

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

Funziona presupponendo che i dati di input siano memorizzati in una tabella t (x), ad es

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

2

K (ngn / k) , 29 23 byte

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

Provalo online!

modifica: rimossi alcuni due punti inutili (so quando è necessaria una monade ma non è sempre chiaro per me se c'è ambiguità, quindi per impostazione predefinita x-y*x%yincludo i due punti) e ho cambiato la mod in ngn / k y!x, il che significava che potevo rimuovere un'assegnazione variabile


1

APL (Dyalog Unicode) , 24 22 byte SBCS

Funzione prefisso tacito anonimo.

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

Provalo online!

 racchiudere la stringa per trattare la mappa usando l'intera stringa
 ad es"aaabbb"

⍳∘≢{...  per ciascuno dei ɩ ndices 1 tramite il conteggio dei caratteri nella stringa:
 ad es3

⍺↑⍺ prende il numero corrente di elementi dal numero corrente, imbottitura con 0s
 es[3,0,0]

(≢⍵)⍴ ciclicamente r eshape nella forma del conteggio dei caratteri nella stringa
  es[3,0,0,3,0,0]

⍵/⍨ usalo per replicare i caratteri della stringa
  "aaabbb"

1↓ rilascia il primo ( n = 1)

⊂∊ è l'intera stringa un membro di quell'elenco?


Stai dividendo la stringa di input in blocchi di dimensioni n e stai verificando che tutti i caratteri siano uguali all'interno di ciascun blocco? Non sono entrato in APL, ma è sicuramente il linguaggio "golfistico" più leggibile.
max

@maxb Sto scrivendo una spiegazione. Sto filtrando con tutte le possibili maschere [1,0,0,1,0,0…]ecc. Sarò felice di insegnarti APL (non ci vorrà molto per imparare). Basta inserire fino l'APL Orchard .
Adám,


@Cowsquack Clever, and different, quindi perché non pubblichi {1<∨/≢¨⍵⊆⍨≢¨∪\⍵}?
Adám,

Sfortunatamente fallisce peraacccaaaaabb
Kritixi Lithos il

1

Retina 0.8.2 , 28 byte

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

Provalo online! Il link include casi di test. Spiegazione:

M!`(.)\1*

Dividi il testo in sequenze di caratteri identici.

.
.

Sostituiscili tutti con lo stesso personaggio.

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

Controllare se il GCD delle lunghezze delle corse è maggiore di 1.



1

MathGolf , 14 byte

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

Provalo online!

Spiegazione

Controlla tutte le possibili divisioni della stringa di input in blocchi di uguale lunghezza e verifica se esiste una partizione in cui tutti i blocchi hanno un solo carattere univoco.

£                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 byte

<1iFhMr8

Provalo 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 byte

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

Provalo online!

Il print"\n"piè di pagina è necessario per separare le uscite.

Ciclo diretto attraverso tutte le possibili ns. Non genera nulla per "1-speak", nient'altro per n-speak dove n> 1.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.