Como cientistas da computação, você provavelmente conhece todas as operações básicas da lista de pop e push . Estas são operações simples que modificam uma lista de elementos. No entanto, você já ouviu falar do fracasso da operação ? (como no flip- flop )? É bem simples. Dado um número n , inverta os primeiros n elementos da lista. Aqui está um exemplo:
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a.flop(4)
[4, 3, 2, 1, 5, 6, 7, 8, 9, 10]
O legal da operação do flop é que você pode usá-lo para fazer algumas coisas legais em uma lista, como classificá-la . Vamos fazer algo semelhante com os flops:
Dada uma lista de números inteiros, "Vizinho". Em outras palavras, classifique-o para que cada elemento duplicado apareça consecutivamente.
Isso pode ser feito com flops! Por exemplo, pegue a seguinte lista:
>>> a = [3, 2, 1, 4, 3, 3, 2]
>>> a.flop(4)
[4, 1, 2, 3, 3, 3, 2]
>>> a.flop(3)
[2, 1, 4, 3, 3, 3, 2]
>>> a.flop(6)
[3, 3, 3, 4, 1, 2, 2]
Isso nos leva à definição do desafio de hoje:
Dada uma lista de números inteiros, imprima qualquer conjunto de fracassos que resultem na vizinhança da lista.
Usando a última lista como exemplo, você deve gerar:
4
3
6
porque flopping a lista por 4, depois por 3 e por 6 resultará em uma lista vizinha. Lembre-se de que você não precisa imprimir a lista mais curta possível de fracassos vizinhos a uma lista. Se você tivesse impresso:
4
4
4
3
1
1
6
2
2
em vez disso, isso ainda seria uma saída válida. No entanto, você pode não sempre número uma saída maior do que o comprimento da lista. Isso ocorre porque, para uma lista a = [1, 2, 3]
, chamar não a.flop(4)
faz sentido.
aqui estão alguns exemplos:
#Input:
[2, 6, 0, 3, 1, 5, 5, 0, 5, 1]
#Output
[3, 7, 8, 6, 9]
#Input
[1, 2]
#Output
<any list of integers under 3, including an empty list>
#Input
[2, 6, 0, 2, 1, 4, 5, 1, 3, 2, 1, 5, 6, 4, 4, 1, 4, 6, 6, 0]
#Output
[3, 19, 17, 7, 2, 4, 11, 15, 2, 7, 13, 4, 14, 2]
#Input
[1, 1, 1, 1, 2, 2, 2, -1, 4]
#Output
[]
#Input
[4, 4, 8, 8, 15, 16, 16, 23, 23, 42, 42, 15]
#Output
[12, 7]
Lembre-se de que, em cada um desses exemplos, a saída fornecida é apenas uma saída potencial válida. Como eu disse antes, qualquer conjunto de flops vizinhos à lista fornecida é uma saída válida . Você pode usar esse script python para verificar se uma determinada lista de fracassos contorna corretamente uma lista.
Você pode receber entrada e saída em qualquer formato razoável. Por exemplo, argumentos da função / valor de retorno, STDIN / STDOUT, leitura / gravação de um arquivo etc. são todos válidos. Como sempre, esse é o código-golfe , então faça o programa mais curto possível e divirta-se! :)
fonte
Respostas:
Haskell ,
9871 bytesExperimente online!
Explicação
Para uma lista de comprimento,
n
esse método produz2*n
flops. Ele funciona olhando o último elemento da lista, procurando o mesmo elemento na lista anterior e passando-o para a penúltima posição. Em seguida, a lista com o último elemento removido é recursivamente "vizinhança".Para a lista,
[1,2,3,1,2]
o algoritmo funciona assim:Tudo isso resulta nos fracassos
[2,4,0,3,1,2,0,1,0,0]
e na lista de vizinhos[3,1,1,2,2]
.fonte
Wolfram Language (Mathematica) , 71 bytes
Experimente online!
Como funciona
Dada uma matriz de comprimento
n
, gera uma sequência de4n
flops que classificam a matriz em ordem crescente: em particular, colocando elementos duplicados um ao lado do outro.A idéia é que, para classificar uma matriz, movemos seu maior elemento para o final e, em seguida, classificamos os primeiros
n-1
elementos da matriz. Para evitar a implementação da operação de flop, movemos o elemento maior para o final de uma maneira que não perturbe os outros elementos:Em geral, se o elemento maior estiver em posição
i
, a sequência de flops que o move até o fim éi, n, n-1, i-1
.fonte
i, n
. Por que então fazern-1, i-1
? Não há necessidade de uma classificação estável .Python 2 , 69 bytes
Experimente online!
fonte
Geléia ,
1917 bytesClassifica a lista.
Experimente online!
fonte
ỤŒ¿’Æ!‘ṚĖµUż’ṚF
inversasŒ¿
são modulosL!
.[4, 3, 2, 1, 3]
. Vadio.Ụ>Ṫ$ƤSạỤĖµUż’ṚF
economizando 2 bytes substituindo o link auxiliar.Limpo , 88 bytes
Acho que há um possivelmente mais curto com guardas, mas ainda não o encontrei.
Experimente online!
Como uma função literal. Funciona da mesma maneira que a resposta Haskell de Laikoni , mas jogava golfe de maneira um pouco diferente e, é claro, também em um idioma diferente.
fonte
JavaScript, 150 bytes
Experimente online!
JavaScript, 151 bytes
Experimente online!
Ambos basicamente classificam a matriz lançando o número máximo no início e depois na parte traseira, repetindo isso com a matriz restante. O primeiro usa reduzir, o segundo usa um loop for.
Ungolfed:
fonte
Perl 5.10 (ou superior), 66 bytes
Inclui
+3
para-n
ouse 5.10.0
trazer a linguagem para nível perl 5.10 é considerado livreExecute com a entrada como uma linha no STDIN:
Classifica a lista localizando repetidamente qualquer inversão, colocando-a na frente e depois com a inversão e devolvendo tudo à sua antiga posição.
Foi surpreendentemente difícil entrar no mesmo estádio que o python neste :-)
fonte
C (gcc) ,
165160 bytesfonte