Entrada
Uma sequência alfanumérica s
.
Saída
A cadeia mais curta que ocorre exatamente uma vez como uma substring (contígua) s
. Ocorrências sobrepostas são contadas como distintas. Se houver vários candidatos do mesmo tamanho, você deve enviar todos eles na ordem da ocorrência. Nesse desafio, a cadeia vazia ocorre n + 1
vezes em uma cadeia de comprimento n
.
Exemplo
Considere a string
"asdfasdfd"
A cadeia vazia ocorre 10 vezes nela, portanto, não é candidata a ocorrência única. Cada uma das letras "a"
, "s"
, "d"
, e "f"
ocorre pelo menos duas vezes, para que eles não são candidatos também. As subsequências "fa"
e "fd"
ocorrem apenas uma vez e por esta ordem, enquanto todas as outras subsequências de comprimento dois ocorrer duas vezes. Assim, a saída correta é
["fa","fd"]
Regras
Ambas as funções e programas completos são permitidos, e brechas padrão não são. A formatação exata da saída é flexível, dentro do razoável. Em particular, não é permitido produzir saída para a sequência vazia, mas gerar um erro não é. A menor contagem de bytes vence.
Casos de teste
"" -> [""]
"abcaa" -> ["b","c"]
"rererere" -> ["ererer"]
"asdfasdfd" -> ["fa","fd"]
"ffffhhhhfffffhhhhhfffhhh" -> ["hffff","fffff","hhhhh","hfffh"]
"asdfdfasddfdfaddsasadsasadsddsddfdsasdf" -> ["fas","fad","add","fds"]
Entre os melhores
Aqui está o placar por idioma que prometi.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 45056;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
Respostas:
Pitão,
2726 bytesExperimente aqui.
Observe que, devido a um erro no compilador on-line, a caixa de seqüência de caracteres vazia funciona apenas corretamente na versão da linha de comando, que pode ser encontrada aqui.
Você também pode curar o bug, fornecendo uma nova linha como entrada para o compilador online.
Explicação:
fonte
z
nenhuma entrada falha online, por isso é definitivamente um erro no intérprete.Python 3,
12412311196 bytesProcura cadeias de caracteres de modo que a primeira ocorrência da esquerda seja igual à primeira ocorrência da direita. O
+1
norange
é para acomodar a caixa de seqüência de caracteres vazia.Agora, se apenas o Python tivesse um
.count()
que contasse correspondências sobrepostas , isso teria sido um pouco menor.fonte
Mathematica,
959479 bytesStringCases
me fornece todas as substrings possíveis,Tally
eCases
filtram as que aparecem mais de uma vez eMinimalBy
encontram as que são mais curtas.fonte
&
no final do código?GolfScript, 44 bytes
Recebe a entrada como uma string no stdin e gera uma sintaxe de matriz dupla: por exemplo
[["b"] ["c"]]
. Demonstração onlineDissecação
Isso é organizado de modo que nenhum caso especial seja necessário para a sequência vazia (que eu incluí como um caso de teste na demonstração online vinculada acima).
fonte
CJam,
52 4340 bytesEntrada é a sequência sem aspas
Explicação :
Exemplo:
Saída
Experimente online aqui
fonte
Scala, 120 bytes
Comecei com 140, que pelo menos já se encaixa em um tweet.
fonte
(_)
funciona apenas como a identidade em vez del=>l
?list.groupBy(_)
é o mesmo quex => list.groupBy(x)
. Não faço ideia por que eles implementaram dessa maneira.JavaScript (ES6), 109
110Edite a pesquisa em vez de indexOf, pois a sequência de entrada é alfanumérica. Obrigado @IsmaelMiguel
Função recursiva, procurando substrings começando com o comprimento 1 e subindo.
Ungolfed e explicou
Teste no console do FireFox / FireBug
Saída
fonte
.search
vez de.indexOf
e você economiza 2 bytes.s.indexOf(a)+1
). Enquanto é ter que não vai funcionar com esses caracteres, você não precisa se preocupar! Citando o OP: "Input: An alphanumeric string s.
"Java, 168
176 233Aqui está um exemplo de loop aninhado bastante básico.
Ou um pouco mais legível:
fonte
+++
se para mostrar se isso é+ ++
ou++ +
não ajudaria ... E se você deseja salvar mais alguns bytes, pode haver uma maneira de fazer isso inicializandoq=1
, substituindoq++
porq=t
e substituindol++<t&q<1
por algo parecidot>l+=q
. Provavelmente, é necessário ajustar uma ou duas outras compensações para fazê-la funcionar.+++
. Eu tenho tentado ajustá-lo (especialmenteq
, o que parece um pouco inútil), mas ainda não encontrei nada sólido.+++
sempre resolve++ +
.Haskell,
169162155153151138120115Para usá-lo:
Que dá:
Btw. Eu odeio a última linha do meu código (repetição deh y
). Alguém sugere se livrar disso?fonte
g y=q(minimum.(map l)$y)$y
(os parênteses sãomap l
realmente necessários?) E depoisf=g.concat.q 1.group.sort.concatMap inits.tails
?>>=
vez deconcatMap
, ou seja,f x=p$concat$q 1$group$sort$(tails x>>=inits)
salva 2 bytes. Por que aData.Ord
importação?q
são desnecessários, pois você pode escreverfilter$(==)k.l
, assim como o último$
e os espaços antes dey
sp
. Você também pode remover o ponto e vírgula após as importações (Data.Ord
parece realmente desnecessário).$
seguido por um não-espaço. Ele vai economizar alguns bytes, mas está na especificação de idioma?J,
61584442403837 bytesAqui está uma versão dividida em componentes individuais da solução:
x #/. y
calcula para cada elemento distintox
a frequência com que ocorrey
. Se usarmos isso comoy #/. y
, obtemos o para cada elemento distinto emy
sua contagem. Por exemplo,a #/. a
paraa =. 1 2 2 3 4 4
rendimentos1 2 1 2
.1 = y
verifica quais itensy
são iguais a1
. Por exemplo,1 = a #/. a
rendimentos1 0 1 0
.u~
é o reflexo de um verbo monádicou
. Isto é,u~ y
é o mesmo quey u y
. Assim,#/.~ y
é o mesmo que#/.~ y
. Quando aplicado a um verbo diádico,u~
é o passivo deu
. Ou seja,x u~ y
é o mesmo quey u x
. Estes são usados em muitos outros lugares que não menciono explicitamente.~. y
é o nó dey
, um vetor com duplicatas removidas. Por exemplo,~. a
produz1 2 3 4
.x # y
( cópia ) seleciona entrey
os itens nos índices em quex
contém a1
.(1 = y #/. y) # (~. y)
cria um vetor daqueles elementosy
que aparecem apenas uma vez. Na notação tácita, esse verbo é escrito como~. #~ 1 = #/.~
; vamos chamar esta fraseunqs
para o resto da explicação.x ]\ y
cria umx
por1 + y - x
conjunto de todos os infixos do vectory
de comprimentox
. Por exemplo,3 ]\ 'asdfasdfd
rendimentos# y
é a contagem doy
número de elementos emy
.u\ y
aplicau
- se a cada prefixo dey
. Aliás,#\ y
cria um vetor de números inteiros de1
para#y
.< y
colocay
em uma caixa. Isso é necessário porque as matrizes não podem ser irregulares e calculamos uma matriz de sufixos de diferentes comprimentos; uma matriz em caixa conta como um escalar.Assim,
(i. # y) <@:unqs@(]\) y
gera um vetor de#y
matrizes in a box do comprimento k (para todos os 0 ≤ k <#y
) infixes de y que ocorrem exatamente uma vez. A forma tácita desse verbo éi.@# <@unqs@(]\) ]
oui.@# <@(~. #~ 1 = #/.~)@(]\) ]
se não usarmos ounqs
nome. Vamos chamar esta fraseallsbsq
para o restante desta explicação. Por exemplo,allsbsq 'asdfasdfd'
produz:(#@> y) # y
toma do vetor de matrizes in a boxy
aquelas que não estão vazias.{. y
pega o primeiro elemento do vetory
.> y
remove a caixa dey
.> {. (#@> y) # y
gera a primeira matriz não vazia não caixa do vetor de matrizes em caixay
. Esta frase está escrita>@{.@(#~ #@>)
em notação tácita.Finalmente,
[: >@{.@(#~ #@>) allsbsq
reúne a frase anterior comallsbsq
para criar uma solução para o problema que temos. Aqui está a frase completa com espaços:fonte
Haskell, 135 bytes
fonte
PHP,
171152134125http://3v4l.org/RaWTN
fonte
$j=0
. Adiante, você temsubstr($s,$j++,$i)
. Sem definir$j
, você pode reescrever issosubstr($s,0+$j++,$i)
e salvar 2 bytes. Por que é que? Bem, pela primeira vez,$j
seránull
. E você será efetivamente passandonull
parasubstr
, que eu não acho que vai funcionar bem. Usar0+$j++
converteránull
para0
. Se você perceber que não é necessário, vá em frente sem ele e remova a$j=0
peça.$j
não é limpo e reinicializado para cada iteração dowhile()
loop. Portanto, embora seja nulo (e, portanto, seria convertido em0
uma$j++
chamada) na primeira vez, em futuras iterações do loop externo, ele permanece no valor que era antes. Não é tanto inicializar como redefinir. Obrigado pela sugestão :-)function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)($b=substr($s,$j++,$i))&(strpos($s,$b)==strrpos($s,$b)&&($a[]=$b));return$a;}
Alterações: TODO seu||1
, usado bit a bit&
(AND
) em vez de&&
em um só lugar, moveu a$j<$l&&[...]
peça para fora defor
(economizando 2 bytes) e removeu alguns parênteses desnecessários.function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)strpos($s,$b=substr($s,$j++,$i))==strrpos($s,$b)&&($a[]=$b);return$a;}
as alterações feitas no código anterior: mudou o$b=substr($s,$j++,$i)
emstrpos($s,$b)
tornando-sestrpos($s,$b=substr($s,$j++,$i))
, removeu parenthesys mais desnecessários e removeu o desnecessário&
.substr($s,$j++,$i)
retorna""
quando$j
atinge o comprimento da sequência efalse
depois, para que a atribuição também possa servir como quebra condicional do loop. Depois, há apenas um uso$l
restante, para que também possa ser consolidado.Groovy (regex Java na implementação Oracle), 124
Testado no Groovy 2.4 + Oracle JRE 1.7. O regex deve funcionar para Java 6 a Java 8, pois o bug que permite que o código acima funcione não foi corrigido. Não tenho certeza para a versão anterior, pois há um bug no Java 5 que foi corrigido no Java 6.
O regex encontra a string mais curta que não possui uma substring duplicada em outro lugar, em todas as posições da string de entrada. O código externo cuida da filtragem.
(?=...)
.(.*?)
pesquisas da substring mais curta(?=(.*))
captura o restante da string para marcar a posição atual.(?<=^(?!.*\1(?!\2$)).*)
é uma emulação de look-behind de comprimento variável, que tira proveito do bug de implementação que permite(?<=.*)
passar na verificação de comprimento.(?!.*\1(?!\2$))
simplesmente verifica se você não encontra a mesma substring em outro lugar. Ele(?!\2$)
rejeita a posição original em que a substring é correspondida.O limite da construção de pesquisa externa não se aplica à construção de pesquisa aninhada. Portanto, a antecipação negativa aninhada
(?!.*\1(?!\2$))
na verdade verifica toda a cadeia de caracteres, não apenas até o limite direito da antecipação .fonte
Rebol, 136 bytes
Ungolfed:
Exemplo de uso:
NB Suponho que o cerne do código seja como a
find
peça está funcionando. Espero que isso ajude a explicar ...fonte
Haskell, 119
fonte
q = length
em algum lugar e usoq
, raspa alguns bytesBraquilog , 10 bytes
Experimente online!
Embora
ᵍ
naturalmente não classifique pelo valor que agrupa, em vez de ordenar os grupos pela primeira ocorrência de cada valor, as primeiras ocorrências de todos os comprimentos estão em ordem decrescente. Não tenho 100% de certeza de que a filtragem de exclusividade não possa atrapalhar isso, mas ainda não criei um caso de teste.fonte
05AB1E , 10 bytes
Não gera nada para uma sequência vazia.
Experimente online ou verifique todos os casos de teste .
Explicação:
Isso tira vantagem do fato de o 05AB1E ter apenas um
1
valor verdadeiro e todo o resto como falsey. A substring única mais curta é sempre garantida para ocorrer exatamente uma vez para todas as sequências de entrada possíveis. (Para uma string de entrada contendo apenas os mesmos caracteres (ieaaaaa
), as próprias strings de entrada como substring ocorrem apenas uma vez, o resultado é o seguinte["aaaaa"]
. Para uma String de entrada com padrão de repetição (ie"abcabc"
), ainda existem substrings exclusivos que apenas ocorrer uma vez (["abca","abcab","abcabc","bca","bcab","bcabc","ca","cab","cabc"]
), então isso resultará em["ca"]
.)fonte
Python 2, 150
fonte
""
, mas você não imprime nada.Perl 5
-a
,11487 bytesExperimente online!
Método antigo: 114 bytes
fonte