Inspirado por uma pergunta no Stack Overflow. O título aqui é inteiramente minha culpa.
O desafio
Dada uma lista de números inteiros positivos contendo pelo menos duas entradas, substitua cada número pelo mínimo de todas as entradas, excluindo a si mesma.
Casos de teste
[4 3 2 5] -> [2 2 3 2]
[4 2 2 5] -> [2 2 2 2]
[6 3 5 5 8] -> [3 5 3 3 3]
[7 1] -> [1 7]
[9 9] -> [9 9]
[9 8 9] -> [8 9 8]
Regras
O algoritmo deve teoricamente funcionar para qualquer tamanho de entrada (maior que um) e valores (números inteiros positivos). É aceito se o programa é limitado por tempo, memória ou tipos de dados e, portanto, funciona apenas para números até um determinado valor ou para tamanho de entrada até um determinado valor.
Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas.
A entrada pode ser obtida por qualquer meio razoável ; e com qualquer formato. Mesmo para saída. Os formatos de entrada e saída podem ser diferentes.
O menor código em bytes vence.
fonte
[4 3 2 2 5]
produzir?[4 3 2 2 5]
a saída seria[2 2 2 2 2]
(isto é similar à segunda etapa de teste)Respostas:
Geléia ,
965 bytesExperimente online!
Verifique todos eles de uma vez! (ligeiramente modificado)
Tenho certeza que Dennis pode jogar fora isso.
Como funciona
O algoritmo é bastante complicado. Vamos observar o que isso faz
[4,2,2,5]
.Em primeiro lugar, usamos
J
para obter[1,2,3,4]
. Observe que o Jelly usa a indexação 1.Então nós vemos
ṙ
. São necessários dois argumentos: uma matriz e um número inteiro. Ele gira a matriz para a esquerda em uma quantidade especificada pelo número inteiro. Aqui,ṙ
veria[4,2,2,5]
à esquerda e[1,2,3,4]
à direita (mais sobre como isso funciona pode ser encontrado no tutorial ). No Jelly, os comandos vetorizam implicitamente. Portanto, este comando será executado sobre cada elemento individual à direita, e é por isso que criaríamos uma matriz 2D:Portanto,
[4,2,2,5]ṙ[1,2,3,4]
torna-se[[4,2,2,5]ṙ1,[4,2,2,5]ṙ2,[4,2,2,5]ṙ3,[4,2,2,5]ṙ4]
, o que se torna:Observe que os elementos originais estão na última linha, pois, nessa linha, giramos para a esquerda por uma quantidade igual ao comprimento da matriz, e é por isso que usamos a
Ṗ
seguir para remover essa linha, para que as colunas sejam as coleções de os elementos da matriz que não estão no índice atual:A operação a seguir,,
«/
também é bastante complicada. Primeiro,«
retorna o mínimo dos dois números que vê à esquerda e à direita. Por exemplo,5«3
retorna3
. Agora, se os dois argumentos forem arrays, ele será vetorizado como eu disse acima. O que isso significa é que[1,5,2,3]«[4,1,5,2]
se tornaria o[1«4,5«1,2«5,3«2]
que é[1,1,2,2]
. Agora,/
éreduce
, o que significa que fazemos a operação em cada linha até o final. Por exemplo,[1,2,3,4]+/
se tornaria((1+2)+3)+4
, que é a soma da matriz[1,2,3,4]
.Portanto, se aplicarmos
«/
à matriz 2D que acabamos de obter, obteremos:que, devido à vetorização, seria equivalente a:
que calcula o mínimo de cada matriz sem o elemento no índice.
fonte
Python 2 , 41 bytes
Experimente online!
Para cada elemento
x
, verificamos sex==min(l)
. Caso contrário, trata-se doFalse
que é tratado0
como um índice de listasorted(l)
, fornecendo o menor elemento. Caso contrário, éTrue
conhecido como1
dando o segundo menor elemento, já que esse elemento é o menor e deve ser ignorado.fonte
False
é convertido0
eTrue
convertido1
é realmente arrefecer e deve ser gabava ^ W ^ WexplainedGelatina , 5 bytes
Experimente online!
Quão?
fonte
Haskell ,
424139 bytesEDITAR:
f
pega uma lista de números inteiros (ou qualquerOrd
tipo) e retorna uma lista.Experimente online!
f
se repete enquanto gira a lista.x
é o primeiro elemento da lista ey
o restante. Como a recursão é infinita, a lista de resultados precisa ser cortada:fst<$>zip...y
é uma maneira mais curta de dizertake(length y)...
.fonte
@
e virar as listas para ser compactado:f l@(x:y)=fst<$>zip(minimum...)l
.f(h:t)=minimum t:(fst<$>zip(f(t++[h]))t)
Oitava, 26 bytes
Uma abordagem semelhante à usada nesta resposta , que é a mesma que esta .
Eu não sou realmente fã de apenas portar outras respostas, e é por isso que eu gostaria de observar que tive uma ideia semelhante antes de ver as outras.
Explicação:
Jonathan Allan já forneceu uma boa explicação para o código Jelly, então isso abrange o bit Octave e por que ele funciona (e não funcionaria no MATLAB).
Isso não funciona no MATLAB, pois as atribuições embutidas e a indexação direta não funcionam.
sort(x)(1)
dá um erro no MATLAB, não o primeiro elemento no vetor classificado.fonte
Haskell, 41 bytes
Exemplo de uso:
([]#) [4,3,2,5]
->[2,2,3,2]
. Experimente online!Comece com um acumulador vazio
a
e execute a lista de entradas. O próximo elemento na lista de saída é o mínimo do acumuladora
e todos, exceto o primeiro elemento da lista de entrada (->c
), seguido de uma chamada recursiva com o primeiro elementob
adicionado ao acumulador ec
. Pare quando você chegar ao final da lista de entrada.fonte
JavaScript (ES6),
5046 bytesEditar: salvou 4 bytes graças a @Arnauld.
fonte
a=>a.map(x=>Math.min(...a.filter(y=>x!=y)))
por 43 bytes.3,3,3,3
a=>a.map((_,i)=>Math.min(...a.filter(_=>i--)))
para 46.Braquilog ,
1312 bytesExperimente online!
Guardou um byte graças a @ ais523.
Explicação
Exploramos o fato de
⊇
unificar subconjuntos do maior para o menor. Por exemplo, para[1,2,3]
os subconjuntos que recebemos são, nesta ordem:[1,2,3], [1,2], [1,3], [2,3], [1], [2], [3], []
.Podemos ver que os subconjuntos
[1,2], [1,3], [2,3]
são aqueles dos quais queremos o mínimo, mas estão na ordem inversa em comparação com a lista de entrada (daí a↔
). Podemos selecionar esses subconjuntos apenas localizando os primeiroslength(Input) + 1
, que conterão todos eles + a lista inteira primeiro. Nós descartamos toda a lista comb
.fonte
Na verdade , 13 bytes
Usa a mesma técnica que o xnor também descobriu .
Experimente online!
Explicação:
fonte
R,
4631 bytesimplementa a solução de Stewie Griffin em R, infelizmente, minha ideia original é 50% mais longa! ainda lê a lista de stdin, mas agora retorna um vetor numérico muito mais legível.
Experimente online!
implementação antiga:
lê na lista de stdin. Um índice negativo
l[-x]
exclui o elemento da lista ematch(l,l)
retorna o índice da primeira ocorrência de cada elemento da lista. Retorna uma lista.fonte
Python 2, 51 bytes
Eu sei que já existe uma solução Python melhor, mas ainda quero postar a minha.
Experimente online
fonte
Mathematica 34 Bytes
fonte
PowerShell ,
6859 bytesExperimente online!
Estou bastante confiante de que pode ser reduzido, continuarei a olhar para ele
fonte
C, 85 bytes
O primeiro argumento é a matriz inteira de entrada. O segundo argumento é a matriz inteira de saída. O terceiro argumento é a contagem de elementos para ambas as matrizes.
Veja como funciona online .
fonte
Perl 6 ,
26 2419 bytes26
Observe que
∖
U + 2216 não\
U + 5CTente
Tente
24
Tente
19
Tente
26
Usei os operadores unicode "sofisticados" em vez dos equivalentes ascii, porque eles precisariam de um espaço antes deles para que não fossem analisados como parte da
.Bag
chamada do método.24
19
(Os campos de golfe de 24 e 19 bytes foram inspirados por uma implementação Jelly )
fonte
Clojure,
36816271 bytesMais novo (não deve realmente enviá-los com pressa):
Experimente online .
E esse aqui tem um bug (62 bytes), o zipmap produz um mapa não ordenado, portanto não produz a seqüência correta em entradas maiores.
v
não é realmente usado para nada, mas é mais curto quei (keys c)
.Anterior aos 81 bytes:
Experimente online .
Experimente online .
Oh caramba, o original (36 bytes) não funciona quando o número mínimo é repetido,
[4 2 2 5]
resulta em[2 4 4 2]
como os dois2
s são removidos :(#{i}
é o conjunto que contém apenasi
, retorna verdade parai
e falsifica para outros, significando que o mínimo é calculado a partir de todos os outros números na lista de entrada.Experimente online .
fonte
Pitão,
87 bytes-1 Byte graças a @isaacg
Tente!
fonte
d
no final - é implicitamente preenchido.PHP, 72 bytes
Versão Online
fonte
PHP, 47 bytes
fonte
Scala, 37 bytes
l
é qualquer coleção de Int.Casos de teste:
Provavelmente ainda pode ser jogado no golfe. Não foi possível encontrar uma maneira mais curta de remover um elemento de uma lista do que
l diff Seq(l(i))
fonte
C #, 36 bytes
Pega os elementos (i) e procura nos elementos sem o item atual o valor mínimo.
É meio triste que algumas outras tentativas não funcionem, como trabalhamos com tipos primitivos e, portanto, não temos listas com referências para comparar os itens.
fonte
PowerShell ,
4938 bytes-11 bytes graças ao mazzy
Experimente online!
Melhoria da adorável resposta de Sinusoid . Economiza 10 bytes usando saída explícita em vez de criar uma matriz. Indexa na matriz classificada para o ponto 0 (ou seja, o menor valor) ou o ponto 1 se a condicional for verdadeira.
fonte
Perl 5, 43 bytes
Equivalente à solução Python.
sort
Infelizmente, o Perl tem o padrão errado para números (exigindo um comparador explícito) emin
não é incorporado, mas quase o compensa porsub
ser mais curto do quelambda
,map$_,
mais curto do quex for x in
e pela implicação das listas de retorno e argumentos.fonte
Ruby, 30 bytes
Para cada elemento, classifique a matriz, remova o elemento atual e pegue o primeiro elemento da matriz restante.
É uma função anônima que pode ser usada assim:
fonte
CJam, 15 bytes
Essencialmente, uma tradução do algoritmo do xnor para o CJam.
Este é um bloco sem nome que pega uma matriz da pilha e deixa o resultado na pilha.
Explicação:
fonte
05AB1E , 5 bytes
Porta da resposta Python 2 do @xnor .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Java 8, 119 bytes
Porta da resposta Python 2 do @xnor .
Modifica a matriz de entrada em vez de retornar uma nova para salvar bytes.
Experimente online.
Explicação:
fonte
APL (Dyalog Extended) , 7 bytes
Porta da resposta Python 2 do xnor. Requer
⎕IO←0
:Experimente online!
Explicação:
fonte
Haskell , 76 bytes
Isso é consideravelmente mais longo do que as entradas anteriores de Haskell, mas é a primeira que realiza apenas um número linear de comparações e uma quantidade linear de trabalho adicional.
Experimente online!
Explicação
!
requer dois argumentos: um mínimo de execução e uma lista não vazia. Retorna o valor mínimo na lista e o resultado do processamento da lista fornecida usando o mínimo em execução.fonte
MathGolf ,
97 bytesExperimente online!
Explicação
Basicamente, uma porta da resposta 05AB1E de Kevin Cruijssen, mas eu perco 2 bytes devido a ter que fazer as coisas explicitamente.
fonte