Dada a entrada de uma lista de palavras e suas abreviações, produza o padrão pelo qual as abreviações podem ser formadas.
Vamos dar o exemplo de entrada de
potato ptao
puzzle pzze
como um exemplo (ou seja, a abreviação de potato
é ptao
e a abreviação de puzzle
é pzze
).
Considere todas as maneiras possíveis para obter ptao
a partir potato
. Uma maneira possível é usar a primeira, terceira, quarta e sexta letras, às quais iremos nos referir
1346
. Mas desde t
e o
aparecer várias vezes na palavra, existem várias outras maneiras possíveis para gerar ptao
a partir de potato
: 1546
, 1342
e 1542
.
Da mesma forma, nota que pzze
pode ser gerado a partir puzzle
de qualquer um 1336
,
1346
, 1436
, 1446
. O único padrão que essas duas abreviações têm em comum é 1346
; portanto, essa deve ser a saída para esta entrada. Se vários padrões possíveis forem possíveis, você poderá gerar um, alguns ou todos eles (pelo menos um).
Você pode assumir que:
As palavras e abreviações de entrada contêm apenas letras minúsculas.
Há pelo menos um par de palavras / abreviações na entrada.
É possível que toda abreviação seja formada a partir da palavra correspondente.
Sempre haverá pelo menos um padrão que forma todas as abreviações.
O comprimento máximo de cada palavra é de 9 caracteres.
A entrada pode ser aceita como uma das seguintes opções:
Matriz bidimensional / lista / matriz de tuplas / etc.
[[word, abbr], [word, abbr], ...]
matriz / lista unidimensional plana
[word, abbr, word, abbr, ...]
sequência única, delimitada por qualquer caractere que não seja uma letra minúscula
"word abbr word abbr"
hash / array associativo / etc.
{word => abbr, word => abbr, ...}
Em qualquer uma dessas opções de entrada, você também pode trocar a ordem das palavras / abbr (descreva completamente o formato de entrada em sua postagem).
A saída pode ser fornecida como um número único, uma string delimitada por não-dígitos ou uma matriz / lista / tupla / etc. de números.
Como isso é código-golfe , o código mais curto em bytes será vencedor.
Casos de teste (lembre-se de que você só precisa gerar 1 ou mais resultados se vários padrões funcionarem):
In Out
--------------------------------------------------------
potato ptao puzzle pzze | 1346
aabbcc abc fddeef def | 246
prgrmming prgmg puzzles pzzlz | 14353
aaaaa a bbbb b ccc c dd d e e | 1
aaaaa a bbbb b ccc c | 1, 2, 3
abcxyz zbcyax | 623514
abcxyz acbbacbcbacbbac | 132213232132213
potato ptao | 1346, 1546, 1342, 1542
a aaaaa | 11111
Respostas:
Pitão, 19 bytes
Experimente aqui!
Leva uma lista no seguinte formato:
Solução alternativa de 17 bytes que gera o resultado como lista de índices baseados em zero, agrupados em uma lista de 1 elemento:
Explicação
Exemplo:
[["potato", "ptao"],["puzzle", "pzze"]]
Primeiro, mapeamos todos os caracteres da abreviação para uma lista dos índices de todas as ocorrências na palavra que produz
[[[0], [2, 4], [3], [1, 5]], [[0], [2, 3], [2, 3], [5]]]
Então transpomos essa lista que nos dá
[[[0], [0]], [[2, 4], [2, 3]], [[3], [2, 3]], [[1, 5], [5]]]
Portanto, os índices de cada caractere de cada abreviação estão juntos em uma lista.
Então, apenas precisamos encontrar um índice comum em todas as listas que produza:
[[0], [2], [3], [5]]
Esta é a saída da minha solução alternativa de 17 bytes acima. Isso então é transformado
[1,3,4,6]
.Repartição do código
fonte
dm
direito antes do@
?MATL , 29 bytes
A entrada é uma matriz 2D no seguinte formato:
Experimente online! ( o código vinculado inclui algumas modificações devido a alterações no idioma desde que esta resposta foi publicada )
O código exigia alguns truques envolvidos (e demorados!) Para
find
(f
) seja alterada dependendo do formato da entrada. Estas são as instruçõesX:wX:
: força ambas as saídas a serem vetores de coluna.min
(X>
). Estas são as instruçõestv
: concat uma cópia de si mesma para garantir pelo menos duas linhas);fonte
Perl,
464542 bytesInclui +1 para
-p
Dê entrada como palavras seqüenciais no STDIN, por exemplo
Encerre o STDIN com
^D
ou^Z
que for necessário em seu sistemaabbrev.pl
:Explicação
Considere esta entrada (layout conceitual, não a maneira real de entrada para este programa):
O programa constrói cadeias representando as colunas verticais das cadeias completas indexadas em um ID de coluna
etc. Também faz o mesmo para as abreviações, mas usando um ID diferente
As palavras são implicitamente processadas uma a uma usando a
-p
opção As seqüências de caracteres das colunas são construídas usando concatenações repetidas enquanto cada palavra é usadas#.# ...code.. #eg
, portanto, cada coluna precisa de um ID repetível. Uso menos o número da coluna seguido pelo número da linha módulo 2. O número da coluna pode ser construído usando o--$_
que começa como a palavra atual que, devido ao uso de only,a-z
é garantida para avaliar como 0 em um contexto numérico. Então eu entendo-1, -2, -3, ...
. Eu realmente gostaria de usar1, 2, 3, ...
, mas o uso$_++
ativaria o incremento de string mágica perl em vez de um contador numérico normal. Eu e não alguma outra variável porque qualquer outra variável que eu teria que inicializar para zero em cada loop que leva muitos bytes. não quero usar$_
O número da linha módulo 2 é para garantir que os IDs da palavra completa e os IDs da abreviação não colidam. Observe que eu não posso usar a palavra completa e a abreviação em uma sequência para ter um número de coluna passando sobre a sequência combinada porque as palavras completas nem todas têm o mesmo comprimento, para que as colunas das palavras abreviadas não se alinhem. Também não consigo colocar a palavra abreviada em primeiro lugar (todas elas têm o mesmo comprimento) porque preciso que o número da primeira coluna das palavras completas seja 1.
Abuso o espaço de nome global perl através de uma referência não estrita para construir as seqüências de caracteres da coluna como:
Em seguida, mapeio cada string de coluna para o primeiro número de coluna em que a string já aparece (o mapeamento já indicado acima) abusando novamente do espaço de nomes global perl (mas observe que os nomes não podem entrar em conflito para que as globais não interfiram entre si):
Eu tenho que negar
$_
porque, como expliquei acima, conto as colunas como-1, -2, -3, ...
. A||=
garantir que apenas a primeira aparição de uma determinada coluna recebe um novo número da coluna, caso contrário, o número da coluna anterior é preservada e retornado como valor. Isso acontecerá em particular para cada palavra abreviada, pois a especificação garante que exista uma coluna nas palavras completas que aparecerão anteriormente. Portanto, na última palavra abreviada, cada letra será substituída pelo número da coluna na palavra completa que corresponde à coluna para todas as palavras abreviadas. Portanto, o resultado da última substituição é o resultado final desejado. Portanto, imprima se e somente se estivermos no final da entrada:A atribuição do índice da coluna também criará entradas para colunas incompletas porque a coluna ainda não foi completamente construída ou algumas palavras são mais curtas e não atingem o comprimento total da coluna. Isso não é um problema, pois é garantido que as colunas necessárias em cada palavra abreviada possuem uma coluna correspondente às palavras completas, com o comprimento máximo possível (o número de pares vistos no momento), para que essas entradas extras nunca causem correspondências falsas.
fonte
Haskell, 74 bytes
O formato de entrada é uma lista de pares de strings, por exemplo:
Como funciona:
mapM
(o mesmo quesequence . map
) primeiro transforma todos os pares(w,a)
em uma lista de índices das letras da abreviação (' ':
corrige o índice com base em 0 nativo de Haskell para 1 com base em 1), por exemplo,("potato", "ptao") -> [[1],[3,5],[4],[2,6]]
e depois em uma lista de todas as combinações em que o elemento na posiçãoi
é extraído dai
sub-lista, por exemplo[[1,3,4,2],[1,3,4,6],[1,5,4,2],[1,5,4,6]]
.foldl1 intersect
encontra a interseção de todas essas listas de listas.fonte
ES6, 92 bytes
Aceita entrada como uma matriz de palavras e uma matriz de abreviações. Retorna uma matriz de índices baseados em 1 (que me custa 2 bytes de erro). No caso de várias soluções, os índices mais altos são retornados.
fonte
Python 3, 210 bytes
Não é uma resposta impressionante, alcançando os melhores resultados aqui, mas esta é realmente uma das mais loucas listas de compreensão que já fiz com Python. A abordagem é bastante direta.
A função espera entrada sempre como uma matriz 2D de cadeia de caracteres como:
[[word, abbr],...]
e retorna uma lista de números inteiros.Ps: Uma explicação detalhada em breve
Ps2: Mais sugestões de golfe são bem-vindas!
fonte