Dada uma string s composta por letras minúsculas, como
aabaaababbbbaaba
e um número inteiro positivo n , tal como 4
, a produção de um comprimento- n corda t de tal modo que, quando t é repetido para o comprimento de s , que têm como muitos caracteres em comum quanto possível. Para o exemplo dado, a saída ideal seria aaba
, porque possui treze caracteres em comum com a cadeia de destino:
s: aabaaababbbbaaba
t: aabaaabaaabaaaba (aaba)
^^^^^^^^ ^ ^^^^
e não é possível t tem mais. No entanto, para aaaaaab
, existem duas saídas possíveis: aaaa
e aaba
, cada uma com 6 caracteres em comum com a sequência de destino:
s: aaaaaab
t: aaaaaaaa (aaaa)
^^^^^^
s: aaaaaab
t: aabaaaba (aaba)
^^ ^^^^
Um aaaa
ou aaba
pode ser produzido, ou ambos, se você desejar. Observe que s nunca é repetido; a trilha a
nos dois valores repetidos de t é simplesmente ignorada.
Casos de teste
Inputs -> Valid outputs
1 a -> a
1 aa -> a
2 aa -> aa
1 ab -> a b
2 ab -> ab
1 abb -> b
2 abb -> ab bb
2 ababa -> ab
2 abcba -> ab
2 aabbbbb -> bb (ab is not a valid output here)
3 aababba -> aab abb
3 aababbaa -> aab
3 asdasfadf -> asf
3 asdasfadfsdf -> asf adf
2 abcdefghijklmnopqrstuvwxyzyx -> yx
2 supercalifragilisticexpialidocious -> ic ii
3 supercalifragilisticexpialidocious -> iri ili ioi
4 supercalifragilisticexpialidocious -> scii
5 supercalifragilisticexpialidocious -> iapic
2 eeeebaadbaecaebbbbbebbbbeecacebdccaecadbbbaceebedbbbddadebeddedbcedeaadcabdeccceccaeaadbbaecbbcbcbea -> bb be
10 bbbbacacbcedecdbbbdebdaedcecdabcebddbdcecebbeeaacdebdbebaebcecddadeeedbbdbbaeaaeebbedbeeaeedadeecbcd -> ebbbdbeece ebdbdbeece
20 aabbbaaabaaabaaaabbbbabbbbabbbabbbbbabbaaaababbbaababbbaababaaaabbaaabbaabbbabaaabbabbaaabbaaaaaaaba -> aabbbbaaabbabbbaabba
Regras
- Você pode assumir que a entrada será apenas uma sequência não vazia de letras minúsculas e um número inteiro positivo não maior que o comprimento da sequência.
- Você pode receber as entradas em qualquer formato padrão e em qualquer ordem.
- Você pode gerar uma única sequência, ou mais de uma, na forma de uma matriz, separada por novas linhas ou espaços, etc.
- Seu código deve terminar para cada caso de teste em menos de 1 minuto em qualquer computador razoavelmente moderno.
- Isso é código-golfe , então faça seu código o mais curto possível.
2 abb -> ba
onde é construído como(b)[ab]a
: o líder(b)
é ignorado,[ab]
está correspondendo.Respostas:
Gelatina , 11 bytes
Experimente online!
Não esperava vencer Dennis neste, então tentei fazer o FGITW (depois de tentar várias possibilidades; há mais de uma maneira de fazer 11). Cheguei mais curto, para minha surpresa.
Leva a string e a contagem como argumentos da linha de comando. Saídas em stdout.
Explicação
Isso usa a percepção de que a letra em cada posição do padrão deve ser a letra mais comum correspondente a essa posição. Podemos encontrar as letras correspondentes a um padrão específico, dividindo-as em grupos de tamanho padrão e transpondo. A principal razão pela qual essa solução é tão longa é que o Jelly parece não ter um caminho curto para encontrar o modo de uma lista (fiz várias tentativas, mas todos têm pelo menos seis bytes).
Geléia , 10 bytes, com base na solução @Dennis '
Experimente online!
Essa é uma combinação da solução @Dennis e a minha; havia um modo de cinco bytes nessa solução, que eu roubei para esta solução. (Eu já tinha soluções baseadas em
⁸ċ
, mas não conseguia ficar com menos de seis bytes; não tinha pensado em usarÞ
.)Explicação
µ…µ€
eǀ
(com o…
na linha anterior) têm três bytes de comprimento (o último precisa de uma nova linha) e equivalente. Normalmente eu uso o primeiro, mas o último é mais flexível, pois permite que você⁸
mencione o argumento.Isso torna possível classificar (
Þ
) pelo número de ocorrências em⁸
(⁸ċ
) e pegar o último elemento (Ṫ
), para encontrar o modo em apenas cinco caracteres.fonte
Mathematica, 51 bytes
Entrada e saída são listas de caracteres.
Também com base nos modos das linhas da transposição. Eu acredito que eles chamaram o built-in para o modo de uma lista
Commonest
apenas para ofender jogadores de código.fonte
MostCommon
...Python 3,
99, 7361 bytes-12, thx para @Rod
Mesma idéia, mas reescrevi-a para eliminar a declaração de importação.
Original
Explicação:
fonte
''.join()
para retornar uma lista de cadeias de caracteres''.join(...)
faria com que ele retornasse um gerador, sem ter certeza se isso é permitido.Python 2, 106
Agora é uma resposta diferente! Eu estava pensando em um (quase) forro desde o início. Agora ainda mais curto, com base no uso de zip do @Rod.
Obrigado a @ L3viathan e @Rod por esclarecimentos sobre o uso de lambdas como resposta
Experimente online
Explicação:
combinations(S,N)
cria todas as combinações de comprimento N a partir de caracteres de Smax()
tem argumentokey
que toma como função de entrada usar para comparar elementoslambda s:sum(x==y for x,y in zip(S,s*len(S)))
passado como tal funçãoEste lambda conta o número de caracteres correspondentes na lista de tuplas, produzido por
zip(S,s*len(S))
s
- uma das combinações e é multiplicada pelalen(S)
qual cria uma sequência garantida por mais de Szip
cria tuplas de caracteres de cada stringS
es*len(S)
ignora todos os caracteres que não podem ser correspondidos (no caso de uma string maior que a outra)Então
max
escolhe a combinação que produz a soma máximafonte
[]
na compreensão da lista dentro de funções, também você está usando1 for ... if <cond>
você pode usar diretamente<cond> for ...
uma vez que vai ser usado emsum
, python teráTrue
como1
eFalse
quanto0
f=
(a menos que seja recursiva)JavaScript (ES6),
10410194 bytesSalva 3 bytes duas vezes graças a @Arnauld. Solução de 97 bytes que funciona com todos os caracteres que não são de nova linha:
A solução anterior de 104 bytes também funciona com caracteres de nova linha:
fonte
o
para um novo objeto, você poderia reutilizar a matriz transmitidamap
usando seu terceiro parâmetro?(n,s)=>s.replace(/./g,(_,i)=>i<n?[...s].map((c,j,a)=>j%n-i||(a[c]=-~a[c])>m&&(m++,r=c),m=0)&&r:'')
deveria salvar mais 3 bytes. (Ou 4 bytes com a sintaxe de currying.)Geléia ,
1211 bytesExperimente online!
Como funciona
fonte
Pitão, 11 bytes
Aceita entrada como
s,n
e saídas como uma lista de caracteres.Explicação
fonte
Japt ,
1615 bytesGuardado 1 byte graças a @obarakon
14 bytes de código + 1 byte para o
-P
sinalizador.Experimente online!Ungolfed e explicação
fonte
gJ
poro
Python 2 , 132 bytes
Experimente online!
fonte
05AB1E , 17 bytes
Experimente online!
Explicação
fonte
PHP, 245 bytes
Versão Online
Demolir
fonte
Haskell, 84 bytes
Exemplo de uso:
Divida a string de entrada em pedaços de comprimento
n
, transponha e encontre para cada sublist o elemento mais frequente.fonte
Röda , 68 bytes
Experimente online!
É uma função que imprime a saída sem seguir a nova linha.
Isso foi inspirado por esta resposta .
fonte