Objetivo
Da Wikipedia :
Um acrônimo recursivo é um acrônimo que se refere a si mesmo na expressão para a qual ele representa.
Seu objetivo é verificar se uma string é um acrônimo recursivo.
- O acrônimo é a primeira palavra
- As palavras não diferenciam maiúsculas de minúsculas, separadas por um único espaço.
- A sequência especificada não contém pontuação nem apóstrofo.
- Somente a primeira letra de cada palavra pode fazer parte da sigla.
Você também deve fornecer as palavras de função . Para simplificar, cada palavra pode ser considerada como uma palavra de função.
Exemplo
f("RPM Package Manager") => { true, [] }
f("Wine is not an emulator") => { true, ["an"] }
f("GNU is not Unix") => { true, ["is"] }
f("Golf is not an acronym") => { false }
f("X is a valid acronym") => { true, ["is","a","valid","acronym"] }
Você pode dar um programa completo ou uma função.
A cadeia de entrada pode ser obtida de STDIN ou como argumento de função.
O resultado da saída pode ser verdadeiro / falso, 0/1, sim / não ...
A lista de palavras da função (qualquer formato da lista é válido) deve ser fornecida se e somente se for um acrônimo recursivo (mesmo que a lista esteja vazia) . Você não precisa preservar a capitalização das palavras de função.
Critérios de vitória
Este é um código de golfe , o código mais curto vence.
Respostas:
GolfScript,
5150 caracteresProvavelmente pode ser jogado mais. Recebe entrada em STDIN. O booleano é 0/1.
Teste on-line
Explicação:
fonte
Regex, sabor .NET, 62 bytes
Você pode testá-lo aqui . Se a entrada for um acrônimo recursivo, isso produzirá uma correspondência e o grupo de captura
w
conterá todas as palavras de função. Caso contrário, não haverá correspondência.Isso faz preservar a capitalização das palavras de função (mas corresponde caso insensível).
Infelizmente, o testador não exibe toda a pilha de um grupo de captura de chamada, mas se você usou-o em qualquer lugar .NET, o
w
grupo iria conter todas as palavras de função em ordem.Aqui está um trecho de código C # para provar que:
Aqui está uma explicação rápida. Estou usando os grupos de balanceamento do .NET para criar uma pilha das letras de sigla no grupo nomeado
c
, com esse snippetO truque é que eu preciso da segunda letra no topo da pilha e a última na parte inferior. Então eu coloquei tudo isso em um lookbehind que corresponde à posição após a sigla. Isso ajuda, porque o .NET corresponde à aparência da direita para a esquerda e, portanto, encontra a última letra primeiro.
Depois de obter essa pilha, ligo o resto da string palavra por palavra. A palavra começa com a letra no topo da pilha de acrônimos. Nesse caso, eu tiro essa letra da pilha:
Caso contrário, eu igualo a palavra de qualquer maneira e empurro a
w
pilha que conterá todas as palavras de função:No final, certifico-me de que cheguei ao final da string com
$
e também verifiquei se todas as letras do acrônimo foram usadas, verificando se a pilha está vazia:Teste em ideone.
fonte
Python (158, sem regex)
Não é que eu não goste de expressões regulares. É que eu não os conheço.
Ah, eu também tinha uma versão não destruída:
fonte
Python 2.7 -
131126 bytesFaz uma lista de letras na primeira palavra da sigla. Em seguida, para cada palavra na sequência completa, livre-se do primeiro elemento da lista que fizemos, se for o mesmo que a primeira letra dessa palavra. Caso contrário, adicione essa palavra à lista de palavras de função. Para saída, retorne
not a
(em python, qualquer lista que não seja a lista vazia éTrue
-y, e a lista está vazia se for um acrônimo recursivo) e a lista senot a
.Agradeço ao @ace por me ajudar a corrigir um erro / salvar alguns bytes.
fonte
SyntaxError: invalid syntax
ao final dareturn
linha.for w in s:f+=0*a.pop(0)if a and w[0]==a[0]else[w]
que é mais curto e não depende de guias. Quanto àreturn
declaração, descobri0if a else(1,f)
qual é mais curta que o original.Python - 154 caracteres
Primeira tentativa de código de golfe. Estou pensando que python não é a melhor linguagem para isso, considerando todas as palavras-chave longas. Além disso, não acho que essa função seja infalível. Funciona para a entrada do OP, mas tenho certeza de que poderia pensar em exceções.
fonte
ECMAScript 6 (105 bytes):
Digite a função no console do navegador Firefox e, em seguida, basta chamar a função, assim:
fonte
The function words list ... must be given if and only if this is a recursive acronym
. Isso os alertará independentemente.Haskell - 287 bytes
Não é a entrada mais curta (ei, é Haskell, o que você esperava?), Mas ainda assim é muito divertido escrever.
Testado com
Saída esperada
Ungolfed
fonte
JavaScript (ECMAScript 6) - 97 caracteres
Testes:
fonte
Rebol - 133
Ungolfed:
Testado com:
Saída:
fonte
Julia - 116 bytes
Menos Golfe:
O
0
no final faz com que seja a saída 0. Caso contrário, ele gera uma matriz contendo1
seguidos pelas palavras da função. Por exemplo:fonte
Braquilog , 29 bytes
Experimente online!
Emite as palavras de função através da variável de saída se a entrada for um acrônimo recursivo e falhará se não for.
Sem precisar produzir as palavras de função (tratando isso como um problema de decisão puro ), ele sai para apenas 12 bytes, porque
∧Zt
pode ser descartado para -3,Y
pode ser substituído.
por -1 e, o mais importante,;0zpᵐz{ċ₂ˢ}ᵐZh
pode ser substituído por⊇
for um gritante -13:ḷṇ₁Xh.∧X⊇hᵐc
fonte
Cobra - 187
fonte
Ruby - 173
Poderia ser melhor...
Chamando a função:
Saída:
fonte
Java - 195
Infelizmente, o Java não possui suporte à tupla.
Portanto, essa é uma classe que armazena o booleano em 'b' e a lista de palavras da função em 'x'.
Aqui, a função é o construtor da classe.
Teste
fonte
string[]
:null
simplesmente significa falso, vazio significa verdadeiro en
elementos significa verdadeiro comn
palavras de função.Awk - 145
Teste:
fonte
Café - 144
Ligue com, por exemplo:
z "GNU is not Unix"
O JS compilado:
Ele divide a string em palavras e depois percorre cada palavra. Se o primeiro caractere da palavra não corresponder ao próximo no acrônimo, a palavra será armazenada. Um contador (
g
) é usado para rastrear quantas palavras foram puladas. Se o número de palavras ignoradas mais o comprimento da sigla corresponder à duração da frase, ela corresponderá, retorne 1 e as palavras ignoradas. Caso contrário, não era válido, então retorne 0.fonte
C # - 234
fonte
Python (108)
fonte