Desafio
Dada uma matriz de número de um dígito, calcule se dois deles somam 10 e imprima-os
Exemplo
Entrada
(1,2,3,4,5,5,6,7)
Isso retorna ((4,6),(5,5),(3,7))
Entrada
(1,2,3,4,5)
Isso retorna ()
. como existe apenas um 5
Entrada
(5,5,5,5,5)
Isso retorna ((5,5),(5,5))
como existe um número ímpar de 5s e cada 5 pode ser usado apenas uma vez
Regras
Aqui estão as regras!
- Suponha que a entrada seja apenas uma matriz não classificada de números inteiros positivos de um dígito
- Cada número será emparelhado apenas uma vez, o que significa que, se houver três 5s, formará apenas 1 par (5,5). Se houver (3,3,7), formará apenas 1 par (3,7)
- Para a entrada: você pode usar qualquer tipo de parênteses (ou falta de), desde que os leitores possam dizer que a entrada é uma única matriz de números.
- Para a saída: deve se parecer com uma matriz de pares. Onde a matriz é da mesma forma que a sua entrada (se você não usou parênteses na entrada, é necessário usar algum tipo de símbolo para que qualquer leitor possa dizer que são pares em uma matriz)
Casos de teste
(1,2,3,4,5,5,6,7) =((4,6),(5,5),(3,7))
(1,2,3,4,5) = ()
(5,5,5,5,5) = ((5,5),(5,5))
(1,2,3,3,4,5,6,7)=((3,7),(4,6))
(9,8,7,6,4,4,3,1)=((9,1),(7,3),(6,4))
Boa sorte!
A shorter
resposta é, melhor!
Editar 1: atualizar as regras e casos de teste a partir de comentários
Edição 2: atualize as regras para definir o formato da entrada.
Edit 3: atualize as regras para definir o formato da saída. tentando ser o mais flexível possível.
(5,5)
para o caso de teste final?(1,2,3,3,4,5,6,7)
1,2,3,4,5,5,6,7
?Respostas:
GolfScript,
454237 caracteresA nova abordagem também aceita matrizes com um único item como entrada. Além disso, é vários caracteres mais curtos.
Versão anterior:
O algoritmo usado neste código é descrito da seguinte maneira:
O código espera uma matriz de pelo menos dois dígitos em STDIN.
Exemplos (veja online ):
fonte
Python 2.7 (70)
Casos de teste:
Um byte extra para o bom parêntese.
fonte
<?$a=fgetcsv(STDIN);while($a){$b=10-array_pop($a);if($a[$b]){unset($a[$b]);echo"($b,",10-$b,")";}}
Javascript,
18818318115314112112311210598caracteresJogar golfe no JS é um pouco difícil, mas eu só queria ter uma ideia do problema, então aqui está o código:
Entrada: por exemplo
[1,2,3,3,4,5,6,7]
. Saída, por exemplo,[[4,6],[3,7]]
para o console.105-> 98: Utilizou o incrível algoritmo de Daniel para reescrever completamente o código! Veja a resposta dele para um algoritmo legível.Coisas completamente bagunçadas e revertidas para 105 caracteres.112-> 105: Inicializado
i
para zero, usou a saída deo.push
para setk
(k=a[i]=a[j]=-o.push...
) e registrou a saída para o console em vez de alertar para eliminar"["+
e,+"]"
já que o console já possui uma saída agradável.123-> 112: Agora foram removidos os colchetes externos na saída, pois o golfscript pode :) Também finalmente se aplicou a sugestão de remoção
|=0
.121-> 123: Alterado
o+="("+p+","+k+"),"
parao.push("("+[p,k]+")")
(adiciona 2 caracteres :() e criouo
uma matriz em vez de uma sequência (o=""
->o=[]
). Agora a saída não está mais errada (como((5,5),(5,5),)
).141-> 121: A partir de agora assumimos que a pergunta significava que poderíamos obter entrada no formato de matriz da linguagem, que no caso de JS é
[a,b,c,...]
e é feitoo
, a saída "acumula" uma string em vez de uma matriz (o.push(...),
->o+=...,
).153-> 141: Redefina as entradas da matriz em vez de removê-las após o uso.
181-> 153: alterações aplicadas a
u=[]
, loops reorganizados ea[i]
&a[j]
-> temp vars, convertidas se lógicas e int lógicas convertidas ema[i]|=0
.183-> 181: Substituído
i<=0
pori+1
e o mesmo paraj
.188-> 183: Colocado
o=[]
dentroprompt()
() e substituído;
for(j=i;
porfor(j=i-1;
().i==j&&
(Obrigado mellamokb, Paul Walls e ryan!)
fonte
i>=0
pori+1
ej>=0
comj+1
para salvar 2 caracteres.u=[]
vez dex
), reorganizei os loops para ir de 0 para cima, atribuaia[i]
ea[j]
para variáveis temporárias para salvar referências repetidas, movi algumas inicializações de variáveis para outras instruções, converti aif
lógica em||
lógica encadeada e converti o int parsing para o mais sucintoa[i]|=0
, para obter uma economia total de 30 caracteres :). Aqui está o meu equipamento de teste demonstrando a precisão da solução: jsfiddle.net/GKUDb/8 e a solução de trabalho com 151 caracteres: jsfiddle.net/DVtW2 .o+="("+[p,k]+")"
).for(a=eval(prompt(o=[])),i=-1;k=a[j=++i]|=0;)for(;p=a[--j];)k+p-10||(o.push("["+[p,k]+"]"),k=a[i]=a[j]=-1);alert(o)
, traz-lo para baixo a 115a=eval(prompt(o=[])),i=-1
ema=eval(prompt(i=o=[]))
sem perda de fidelidade, por mais 3 poupanças de caracteres.J,
545350464544 caracteresUso:
O algoritmo é basicamente:
+/|:(1+i.9)=/
(<.|.)
(então 1 e 9, 2 e 8 etc.)1 9
par) e descarte tudo após os primeiros cinco pares<.4({.,-:@{::)
implementa as duas etapas anteriores)-
o número(>:,.9&-)I.
fonte
Python (142)
A entrada deve ser fornecida com colchetes em vez de colchetes. http://ideone.com/p2QR11
Algoritmo:
Se uma saída seriamente malformada for permitida (90) : http://ideone.com/GR762f
fonte
C,
142.138, 124Teste:
Notas de implementação:
fonte
Perl 52
Prova:
E há um código comentado não destruído:
Talvez as explicações pareçam francês pidgin (eu não sou um escritor nativo de inglês), portanto, se alguém quiser editá-lo e torná-lo mais compreensível, faça-o.
fonte
Javascript -
131129125 caracteresPresumo que a ordem e as matrizes de resultados aninhados não sejam obrigatórias :)
Casos de teste avaliados:
Edit : Como a descrição do problema diz 'Matriz', estamos falando sobre a notação específica de linguagem de uma matriz, certo?
fonte
Mathematica 70
Uso
fonte
PostScript (46)
Isso usa tokens binários codificados manualmente, portanto, aqui está um hexdump:
Eu carregado o arquivo binário se você quiser experimentá-lo.
Isso espera que os números estejam na pilha. Eles podem ser anexados ao código ou fornecidos na linha de comando, por exemplo, ao usar o Ghostscript da seguinte maneira:
Se você insiste na sintaxe da matriz para entrada, isso exige mais dois tokens (
aload pop
) logo no início. Em tokens binários, são mais quatro bytes.Sem jogar golfe e comentou:
fonte
Python 84
Requer entrada entre colchetes, em vez de parênteses.
Pois aproximadamente a mesma resposta foi melhor, veja a resposta de Daniel .
fonte
PHP
150149148146142-> 140Use com a CLI do PHP.
Entrada:
1,2,3,4,5,5,6,7
Resultado:
(3,7)(4,6)(5,5)
Sem golfe:
fonte
SED, 112 caracteres
Provavelmente um pouco mais simples que as outras soluções
fonte
Perl, 72 com a
-p
bandeirafonte
-p
devem ser contados desde o equivalente acrescentariaLINE: while (<ARGV>){...}continue{die "-p destination: $!\n" unless print $_}
#!perl -p
plus newline.