Dada uma matriz não vazia de números inteiros positivos, "aumente" uma vez da seguinte maneira:
Se todos os elementos da matriz forem iguais, anexe
1
a ao final da matriz. Por exemplo:[1] -> [1, 1] [2] -> [2, 1] [1, 1] -> [1, 1, 1] [3, 3, 3, 3, 3] -> [3, 3, 3, 3, 3, 1]
Senão, incremente o primeiro elemento na matriz que é o valor mínimo da matriz. Por exemplo:
[1, 2] -> [2, 2] [2, 1] -> [2, 2] [3, 1, 1] -> [3, 2, 1] -> [3, 2, 2] -> [3, 3, 2] -> [3, 3, 3] [3, 4, 9, 3] -> [4, 4, 9, 3] -> [4, 4, 9, 4] -> [5, 4, 9, 4] -> [5, 5, 9, 4] -> ...
(Cada ->
um representa um incremento, que é tudo o que seu programa precisa fazer.)
Saída da matriz incrementada resultante.
O código mais curto em bytes vence.
code-golf
number
arithmetic
array-manipulation
integer
Hobbies de Calvin
fonte
fonte
Respostas:
Geléia ,
87 bytesExperimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Python 3,
62535150 bytesFunção que modifica a lista passada a ela ( permitida por meta ).
Experimente repl.it!
-9 bytes graças a Lynn por detectar que, como a matriz terá números inteiros positivos, eu posso acrescentar '0' ao final da matriz e aumentá-la.
Um agradecimento especial a mbomb007 para jogar golfe
len(set(a))
paralen({*a})
, e Dennis para o truque floordiv!fonte
len({*L})<2
descobrir se todos os elementos de uma lista são iguais.a+=1//len({*a})*[0]
deve salvar um byte.JavaScript (ES6), 61 bytes
Saídas modificando seu argumento . Não consigo encontrar uma maneira de determinar se uma matriz possui apenas um item exclusivo em menos de 17 bytes, mas sugestões são bem-vindas.
Snippet de teste
Mostrar snippet de código
Outras tentativas
Aqui estão algumas maneiras alternativas de decidir se a matriz possui mais de uma entrada exclusiva:
Ambos os
some
s também podem ser substituídosfind
por..sort
seria mais curto para encontrar o mínimo, se a classificação padrão não fosse lexicográfica (por que, JS, por que?):Tentei recursão para encontrar o mínimo, mas acabou por muito mais tempo:
E aqui está uma solução baseada em string que parecia uma boa idéia no início: (a entrada é fornecida no formato de array em uma string, por exemplo
"[1,2,3]"
)fonte
Mathematica,
705755 bytesPraticamente toda a melhoria se deve a Martin Ender, que me dá um chute nas abordagens de correspondência de padrões! Além disso, a JHM apresentou essencialmente a mesma solução, essencialmente ao mesmo tempo. (a contagem de bytes usa codificação ASCII)
Define uma função que
±
aceita um argumento da lista. Se esse argumento da lista contiver algum número de cópias do mesmo elemento (detectadox_..
e nomeadop
), emita a lista com um1
anexo. Caso contrário, se esse argumento da lista tiver um elemento especialy
(comx
zero ou mais elementos antesy
ez
zero ou mais elementos depoisy
) que for no máximo o mínimo dos outros elementos, emita a lista com essey
incremento. Qualquer instância do elemento mínimo da lista será correspondiday
, mas felizmente o Mathematica escolhe a primeira a agir.fonte
±
ser um caractere de 2 bytes, seu código tem 59 bytes. Além disso, deve haver um espaço entrex_
e..
porque o Mathematica interpretax_..
comox_. .
(o que gera erros). Além disso, a forma infix deMin
(x~Min~z
) tornaria esses 2 bytes mais curtos (o que torna essa solução idêntica a uma das minhas: p ...) Bem, você pode receber o crédito, porque minha edição foi posterior à sua ....±
em UTF-8 (o Mathematica usa UTF-8 por padrão; try$CharacterEncoding
) é um caractere de dois bytes (U + 00B1).±
.$CharacterEncoding
definida comoWindowsANSI
CP1252 (que é suficientemente compatível com a ISO 8859-1±
e·
pode ser usada por um único byte).C ++ 14,
178 176 174 155 142135 bytessubmissão, obediência, inscrição, candidatura
invocação
destroçado
Esta é a minha primeira vez jogando golfe, a ajuda é apreciada.
EDIT: esqueci de mencionar que você deve compilá-lo com pelo menos
-std=c++11
-std=c++14
EDIT2: eu percebi que posso deixar de fora o espaço no inclui
#include <list>
EDIT3: salvou mais dois bytes substituindo
l.begin()
porbegin(l)
EDIT4: salvou outros 19 (!) Bytes graças a @Quentin (veja seu comentário)
EDIT5: Quentin raspou mais 13 bytes, obrigado!
EDIT6: como TuukkaX apontou, lambdas / funções sem nome são suficientes, então eu removi o
auto i=
no bytecountfonte
#include
linhas.auto i=[](auto&l){...};
) economiza um byte (mais se contarmos o tipo de retorno que você esqueceu;)), usar em^
vez de==
e trocar os operandos salva outro.std::list
Os iteradores são certamentestd::
classes, portanto você pode abandonar osstd::
doisstd::count
estd::min_element
agradecer a ADL (-10).l.front()
também é*b
(-7). Acabo com um 120-byteauto i=[](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?void(++*find(b,e,*min_element(b,e))):l.push_back(1);};
:)std::min_element
afirma que ele retorna o primeiro elemento menor, entãofind()
é supérfluo, ou seja, 11 bytes. No condicional, usar um par de parênteses e o operador de vírgula para coagir a expressão corretaint
é mais curto do que converter a esquerda emvoid
2 bytes. Isso leva aauto i=[](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?++*min_element(b,e):(l.push_back(1),0);};
, 142 bytes :)05AB1E ,
212016 bytesGuardado 4 bytes graças a Adnan .
Experimente online!
Explicação
fonte
DÙgi0¸«}ÐWksgÝQ+
também funciona.ÝQ
comk
. Obrigado!Scratch,
2534 blocos +76 bytesRecebe a entrada como uma matriz predefinida de números inteiros. Observe que as matrizes são indexadas 1 no Scratch.
No Python, isso seria parecido com: (Observe que, ao contrário do Scratch, o Python é indexado em 0)
fonte
J,
2522 bytesAvalia para um verbo anônimo. Experimente Online!
Explicação
fonte
MATL , 16 bytes
Experimente online! Ou verifique todos os casos de teste
Como funciona
fonte
Mathematica, 56 bytes
Usa a função nomeada
±
. Usa codificação ISO8859-1Soluções alternativas (58 bytes)
Uso
fonte
Haskell,
71 7062 bytesO @Zgarb salvou 8 bytes, obrigado!
Quando comecei, eu esperava alguns truques elegantes de amarrar os nós, mas o jeito de @ Zgarb é igualmente incrível.
fonte
f(a:b)|(x,y:z)<-span=<<(<).minimum$a:b++[0|all(a==)b]=x++y+1:z
(->)r
, aplicada a um tipo é(->)r a = r->a
. Então, dos tiposreturn:: a->r->a
e(>>=)::(r->a)->(a->r->b)->(r->b)
sua implementação é (ouso dizer?) Óbvio:return=const
em>>=f = \r->f(m r)r
. O último é exatamente o que é necessário para expressar algo como,span(predicate_depending_on l)l
enquanto mencional
apenas uma vez. Agora eu só preciso me lembrar quando precisar.C #,
1231211207977 bytesModifica o argumento passado para a função.
Agradecimentos a Cyoce por economizar 3 bytes! ->
!Any
paraAll
,+=1
para++
.Agradecemos a TheLethalCoder por salvar 43 bytes! -> Código de assinatura do método removido. Parênteses removidos ao redor da lista de parâmetros.
fonte
!l.Any(o=>o!=l[0]))
coml.All(o=>o==l[0])
?Any
vez deAll
e estava pensando que não funciona: D Obrigado!++
?Action<List<int>>
para remover todo o código assinatura do métodousing
s necessários com C #, então não confio que seja legal desistirusing System.Linq
. A menos que eu veja uma declaração explícita que diga que isso não é necessário, eu continuarei com isso. Obrigado pela sugestão! :)Perl 6 , 46 bytes
(modifica a matriz de entrada e a retorna)
Expandido:
fonte
Geléia, 9 bytes
Obrigado a Dennis pelos -2 bytes.
O corpo deve ter pelo menos 30 caracteres; você entrou ...
fonte
Mathematica,
53 bytes57 bytes59 bytesfonte
〚
e〛
são caracteres de 3 bytes. Além disso, seu código não funciona porque{##,1}
parte implica que a entrada é um número inteiro separado (ief[1, 2, 3]
), mas ax=#
parte implica que a entrada é umList
(ief[{1, 2, 3}]
). Uma solução rápida seria mudarx=#
parax={#}
e aceito inteiros brutos como entrada, tornando o seu código de 59 bytes de comprimento.Equal@#
, embora#==##
seja mais curto.R ,
72 6665 bytesExperimente online!
O incremento é feito usando o
which.min
que retorna a primeira correspondência."[<-"
permite substituir o valor e retorna o vetor modificado em uma chamada de função.-7 bytes graças a Giuseppe!
fonte
!=
por-
!Ruby, 46 bytes
Sinto que há uma maneira melhor de verificar se todos os elementos são iguais
a.uniq.size<2
, mas estou com preguiça de encontrá-lo.fonte
a.uniq[1]
será verdade se houver valores distintos.a[a.index(a.min)]
ema[a.index a.min]
Oitava,
696764 bytesNa verdade, era mais curto tornar essa uma função nomeada completa do que usar as teclas
input
edisp
.Economizou 3 bytes graças a Luis.
Resposta antiga, sem usar uma função:
fonte
R, 97 bytes
Pena que a sintaxe
x=+1
não existe no R!Ungolfed:
fonte
TI-Basic, 53 bytes
fonte
Matlab,
83,77, 71 bytesEu sou relativamente novo em codificar golfe, por favor, seja gentil! Tentei usar funções anônimas, mas o Google diz que você não pode usar as instruções if / else e o matlab não possui operadores ternários, portanto, esse é o melhor que senti que poderia fazer.
Edit: Corrigido e encurtado (duas vezes!), Graças a stewie-griffin.
fonte
sum(a)/length(a)==a(1)
não garante que todos os elementos sejam iguais, apenas mostra que a média é igual aa(1)
. Uma maneira mais simples de fazer isso seriamean(a)==a(1)
.numel
é um byte menor quelength
, mas como você sabe que todos os valores são positivos, é possível usar onnz
que é ainda mais curto (ainda não daria o resultado correto nesse desafio, mas é mais curto pelo menos: P). Se você atender amin(a)
chamada na frente do loop, poderá usar ambas as saídas e verificar se osall
elementos dea
são iguais amin(a)
.~nnz(a(a~=a(1)))
é simplesmente~nnz(a-a(1))
. Além disso, você não precisa dos parênteses.if ~nnz(a-a(1));a=[a,1];else[~,I]=min(a);a(I)=a(I)+1;end
. Isso deve ser 5 bytes mais curto (nota: eu não testei).range(a)
vez dennz(a-a(1))
a
é igual ao menor valor nesse vetor. Um vetora = [3 4 6]
resultará emtrue
e um vetora = [4 4 6]
resultará emfalse
. Eu não acho que será útil aqui ...?Clojure,
112100 bytesInfelizmente,
min-key
retorna o último índice do menor, não o primeiro. Isso funciona para entradas inteiras e matrizes menores que 10 ^ 9 elementos;)Editar: definindo uma função anônima, usando em
(apply = a)
vez de(= 1(count(set a)))
.Original:
Uma solução menos invasiva de 134 bytes inverte o vetor antes de atualizá-lo e depois inverte-o novamente:
fonte
Java 8, 85 + 38 = 123 bytes
Void lambda usando a
List<Integer>
(saída com entrada modificada). A contagem de bytes inclui lambda e importação necessária.Experimente Online
Isso quase se parece com o Python com as importações de métodos ...
fonte
MATLAB,
6653 bytesResultado:
Inicializar:
Execuções sucessivas:
fonte
@(x) …
.SmileBASIC 3, 101 bytes
Define uma função de instrução
I A
ondeA
está nossa matriz inteira de números. A saída é obtida modificando a entrada (como matrizes são referências).fonte
BREAK
porM=0
, porqueA
não pode conter0
issoM==A[C]
nunca será verdade.SmileBASIC, 77 bytes
fonte
Pitão, 16 bytes
Um programa que recebe a entrada de uma lista e imprime o resultado.
Suíte de teste
Como funciona
fonte
Haskell, 93 bytes
f z|and$(==)<$>z<*>z=z++[1]|1>0=z#minimum z where(x:z)#m|x==m=x+1:z;(x:z)#m|1>0=x:z#m;[]#_=[]
Ungolfed:
Tentativa inicial, tentará criar algo mais sofisticado posteriormente.
fonte
where
?Maravilha , 44 bytes
Não era isso que eu tinha em mente quando criei essa linguagem ... É literalmente pior que o Perl em termos de legibilidade!
Uso:
Explicação
Mais legível:
Basicamente, verifica se a remoção de 1 item do subconjunto exclusivo do argumento torna a lista vazia. Caso contrário, incrementamos o mínimo da matriz. Caso contrário, simplesmente concatenamos 1 ao argumento.
fonte
Kotlin, 75 bytes
Modifica o argumento da função.
Porra, você digitando forte!
:MutableList<Int>
responde por 17 bytes sozinho. Não acho que exista uma solução em que o tipo possa ser inferido, infelizmente.fonte