No New Modern Times , quando Charlie Chaplin encontra um computador, ele é empregado no pátio de classificação, como um validador para determinar se os trabalhadores estão classificando corretamente os itens. Os itens em questão são pacotes de bolinhas de gude. Pacotes com número ímpar de bolinhas de gude são empilhados na cesta vermelha e pacotes com número par de bolinhas de gude são empilhados na cesta azul.
Charlie Chaplin deveria perfurar o programa que seria validado se houver alguma anomalia no processo de classificação. Mack Swain, seu chefe imediato, compartilha um algoritmo que ele precisa codificar.
Algoritmo
L = List of Marble packets that's already sorted
L_ODD = List of packets with Odd Number of Marbles
L_EVEN = List of packets with Even Number of Marbles
Check_Digit = √(ΣL_ODD² + ΣL_EVEN²)
Seu trabalho é determinar o Check_Digit e combiná-lo com o valor que seu chefe calcular.
Charlie Chaplin, durante o horário de almoço, conseguiu esgueirar-se para a gaveta de Mack Swain e determinar que sua gaveta tem um único cartão com socos nas primeiras 46 32 colunas (o que significa que Mack foi capaz de escrever um programa com apenas 46 32 caracteres).
Agora, Charlie Chaplin precisaria da ajuda de todos os ninjas de código para escrever um programa com o menor número possível de linhas. Ele também anuncia um bônus de 50 pontos, se alguém puder criar um programa mais curto que o seu chefe.
Sumário
Dada uma lista / matriz / vetor de números positivos (ímpar e par), você precisa escrever uma função que aceite array(int [])/vector<int>/list
e calcule a raiz da soma dos quadrados das somas de números pares e ímpares na lista.
O tamanho do programa é o tamanho do corpo da função, ou seja, excluindo o tamanho da assinatura da função.
Exemplo
List = [20, 9, 4, 5, 5, 5, 15, 17, 20, 9]
Odd = [9, 5, 5, 5, 15, 17, 9]
Even = [20, 4, 20]
Check_Digit = √(ΣOdd² + ΣEven²) = 78.49203781276162
Observe que a saída real pode variar com base na precisão do ponto flutuante da implementação.
Ponto
A pontuação é calculada como A pontuação é calculada como Σ(Characters in your Program) - 46
. Σ(Characters in your Program) - 32
. Além da votação regular da comunidade, a menor pontuação negativa receberia um bônus adicional de 50 pontos.
Editar
- O deslocamento usado para calcular a pontuação foi alterado de 46 para 32. Observe que isso não afetaria a elegibilidade do quadro de líderes / recompensa ou invalidaria qualquer solução.
Veredito
Após um terrível duelo entre os Ninjas, o Sr. Chaplin recebeu algumas respostas maravilhosas. Infelizmente, algumas das respostas tentaram tirar vantagem indevida da regra e não foram muito úteis. Na verdade, ele queria um duelo justo e respostas em que a lógica fosse codificada nas assinaturas de funções acabariam significando que a assinatura da função é parte integrante da solução. Finalmente, Ninja FireFly foi o vencedor e concedeu a ele o bônus que ele merece. Classificação (atualizada todos os dias)
╒══════╤═════════════════╤══════════════╤═════════╤════════╤═══════╕
├ Rank │ Ninja │ Dialect │ Punches │ Scores │ Votes ┤
╞══════╪═════════════════╪══════════════╪═════════╪════════╪═══════╡
│ 0 │ FireFly │ J │ 17 │ -15 │ 6 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 1 │ tmartin │ Kona │ 22 │ -10 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 2 │ Sven Hohenstein │ R │ 24 │ -8 │ 7 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 3 │ Ben Reich │ GolfScript │ 30 │ -2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 4 │ mollmerx │ k │ 31 │ -1 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 5 │ David Carraher │ Mathematica │ 31 │ -1 │ 3 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 6 │ tmartin │ Q │ 34 │ 2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 7 │ daniero │ dc │ 35 │ 3 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 8 │ psion5mx │ Python │ 38 │ 6 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 9 │ O-I │ Ruby │ 39 │ 7 │ 5 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 10 │ gggg │ Julia │ 40 │ 8 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 11 │ FakeRainBrigand │ LiveScript │ 50 │ 18 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 12 │ Sylwester │ Perl5 │ 50 │ 18 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 13 │ daniero │ Ruby │ 55 │ 23 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 14 │ vasuakeel │ Coffeescript │ 57 │ 25 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 15 │ dirkk │ XQuery │ 63 │ 31 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 16 │ crazedgremlin │ Haskell │ 64 │ 32 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 17 │ Uri Agassi │ Ruby │ 66 │ 34 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 18 │ Sumedh │ JAVA │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 19 │ Danny │ Javascript │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 20 │ deroby │ c# │ 69 │ 37 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 21 │ Adam Speight │ VB │ 70 │ 38 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 22 │ Andrakis │ Erlang │ 82 │ 50 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 23 │ Sp0T │ PHP │ 85 │ 53 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 24 │ brendanb │ Clojure │ 87 │ 55 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 25 │ Merin Nakarmi │ C# │ 174 │ 142 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 26 │ Boopathi │ JAVA │ 517 │ 485 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 27 │ Noyo │ ES6 │ ? │ ? │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 28 │ shiona │ Haskell │ ? │ ? │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 29 │ Vivek │ int │ ? │ ? │ 0 │
└──────┴─────────────────┴──────────────┴─────────┴────────┴───────┘
Respostas:
J,
1817 caracteres - 32 = ⁻15(Como um "corpo da função"; deve estar entre parênteses ou vinculado a um nome.)
Explicação
Tentei fazer uma visão detalhada do que cada peça faz, como Tobia faz nas respostas da APL.
+/&.:*:
poderia ser substituído pelo|@j./
recurso ao complexo truque de magnitude da OI para salvar mais dois caracteres.Exemplo
fonte
ES6,
(48 - 32) = 16(1-32) = -31Versão original:
A definição da função inteira tem 53 caracteres, o corpo apenas 48.
Versão atualizada, aproveitando ao máximo a definição do problema e movendo praticamente tudo do corpo para a assinatura:
A nova definição de função agora é de 63 "socos" total, mas a função BODY agora tem apenas UM DAMN CHARACTER LONG. Além disso, ele não corrompe mais o espaço para nome global! : D
Uso:
fonte
R, (24 - 32) = −8
O corpo da função consiste em 24 caracteres.
Uso:
fonte
sqrt(sum(by(x,x%%2,sum)^2))
Eu apenas não otimizei o sqrt .... caramba :-) +1 :-) PS: é interessante comoby
parece sair primeiro por causa do formato de saída de merda, mas quando vocêsum
passa por cima dele, é corrigido ;-)by
retorna uma matriz unidimensional. Não se deve julgar a função pelo resultado daprint.by
função.by
não retorna uma matriz (btw, o que você quer dizer com "matriz"? Não há nenhuma em R. Você provavelmente quis dizer um vetor), nem um vetor.by
retorna o objeto da classeby
.?array
. Além disso,is.array(by(1,1,I))
retornaTRUE
.Ruby 2.1 ou superior - (total de 39 caracteres - 7 não corporais - 32 deslocamento = 0)
Abordagem ligeiramente diferente. Crio um número complexo
a+b*i
tal quea
eb
são as somas dos números pares e ímpareslist
, respectivamente. Então eu apenas pego o valor absoluto.Minha solução anterior, que tem 5 caracteres, mas funciona em 1.9.3+:
Em uma nota final, se o Rails + Ruby 2.1+ fosse permitido, podemos usar
Array#sum
para reduzir o corpo a meros 25 caracteres:fonte
Python 2.7: 45, não: 40, não: 38 - 32 = 6
Nada muito novo aqui, apenas uma combinação do truque de número complexo que vi no recente desafio de Pitágoras, lambda por compacidade e minimização de sintaxe / parênteses:
Atualizar - salvou alguns caracteres. Obrigado a @DSM pelo truque de aumentar o componente complexo para 0/1.
Ok, ler a pergunta e reconhecer a regra de contagem do 'corpo da função' salva outros 2 caracteres:
Teste de iPython:
fonte
abs
de números complexosAPL (27 - 46 = -19)
por exemplo:
fonte
Mathematica 31-32 = -1
GatherBy[#,OddQ]
produz as listas de pacotes pares e pacotes ímpares.O interior
Tr
encontra os totais, ambos ao quadrado e depois somados (pelo exteriorTr
).N
converte de um número irracional (a raiz quadrada de um número inteiro) em uma aproximação decimal.Exemplo
Se
f[n_]:=
não estiver incluído na contagem, um caractere adicional poderá ser salvo.Exemplo
fonte
Kona, 22-32 = -10
fonte
Perl5: (50 - 32 = 18)
fonte
say
em vez deprint
e<>
em vez de@ARGV
(enquanto fornecendo os argumentos sobre a STDIN em vez de na linha de comando)say
necessário usar umuse
? alternar de uma matriz de argumentos para<>
exigiria um adicionalsplit/ /,
.dc 3 (35 - 32)
Usando matrizes, conforme sugerido por @Tomas. Isso economiza alguns caracteres, porque eu posso calcular a paridade de cada número e usá-la como um índice, em vez de ajustar a paridade com como um método de ramificação e colocar os valores certos nos registros corretos. Também acontece que as matrizes fornecerão um 0 mesmo que a matriz / índice não tenha sido usado, para que você não precise inicializar nada.
Assume que os números já estão na pilha e deixa o resultado como o único valor restante quando terminar.
Teste:
dc 16 (48 - 32)
Primeira versão usando os registradores o e e para armazenar números pares e ímpares.
fonte
sose
;-) talvez você possa obter resultados mais curtos usando comandos de matriz dc ?Python, 9 (55 - 46)
Usar uma função lambda economiza alguns bytes em novas linhas, guias e
return
.Exemplo:
fonte
Rubi (66 - 32 = 34)
teste:
fonte
Math.hypot *a.partition(&:odd?).map{|x|eval x*?+}
barbeia alguns caracteresRubi, 55 - 46 = 9
Teste:
fonte
h
:f=->a{h=[0,0];a.map{|v|h[v%2]+=v};e,o=h;(e*e+o*o)**0.5}
Q, 34-32 = 2
.
fonte
Julia, 40-46 = -6
Implementação
Resultado
fonte
Coffeescript, (57 - 32 = 25)
Implementação
fonte
+=
e mudança0.5
para.5
GolfScript 30
Eu não acho que o GolfScript tenha muita chance neste!
fonte
c #: 69-32 = 37
Código completo:
PS: Apenas por diversão, isso funciona também, infelizmente não altera o número de caracteres necessários:
fonte
Prolog (73 - 32 = 41)
Aqui contamos tudo depois de ': -' como o corpo da função.
Função de chamada assim:
fonte
Matlab (44 - 46 = -2)
O corpo da função possui 44 caracteres:
Função total da seguinte maneira:
Testes da função:
fonte
Python 2.7 - 64-46 = 18
Isso pode ser mais curto usando um pouco de
zip
mágica, mas por enquanto:Para concluir, você pode fazer zip zip, mas custa mais (por alguns caracteres); portanto, o acima exposto permanece, a menos que alguém possa melhorar um destes:
fonte
abs(sum(1j**(i%2)*i for i in x))
.!s%2
? Isso é pelo menos uma mudança incremental pode aceitarC # 174
Legível
fonte
Clojure = 87 - 46 = 41
Dificilmente idiomático, no entanto.
fonte
Haskell, 64C - 46 = 18
Não é muito difícil de ler. Exemplo de execução:
fonte
int e=0,o=0;for(int i :n){if(i%2==0)e+=i;else o+=i;}System.out.println(Math.sqrt(e*e+o*o));
Método real no código java
fonte
PHP 85-32 = 53
$a=$b=0;foreach($x as $q){if(($q%2)==0)$a=$a+$q;else$b=$b+$q;}echo sqrt($a*$a+$b*$b);
Este é o melhor que eu venho sendo um novato. Tenho certeza de que também deve haver versões mais curtas.
EDITAR:
Uma versão reduzida do código pode ser:
Esta versão possui apenas 64 caracteres (21 menos que a resposta original).
Dito isso, 64-32 = 32
fonte
foreach($l as$m)$m%2?$o+=$m:$e+=$m;echo sqrt($o*$o+$e*$e);
VB.net (81c - 11c = 70) - 32 = 38
Via uso liberal do termo Write a function
fonte
XQuery, (63 - 32 = 31)
Implementação
Resultado
O BaseX foi usado como processador XQuery.
fonte
Comprimento: 82C - 32 = 50
Erlang não é bom para isso. A maioria dos atalhos acaba sendo mais caracteres (tuplas etc.)
As únicas coisas reais de nota:
{lists,sum}
é uma referência de funçãolists:sum
e pode ser chamada--
( subtraia a lista ) a lista de números ímpares da lista completaPode ligar usando:
Resultado:
78.49203781276162
fonte
Haskell
57 - 32 = 25
A otimização direta de crazedgremlins responde:
Otimizações:
read$show
é menor quefromIntegral
- 3 caracteress=sum\n
e doiss
têm comprimento total de 8 caracteres, doissum
são apenas 6 caracteres. - 2 caracteresTambém tentei adicionar mais coisas ao operador, mas acabou sendo o mesmo tempo:
fonte