Já houve muitos desafios "Não __ sem _ _" antes, mas espero que este seja um dos mais desafiadores.
O desafio
Você deve escrever um programa que use dois números naturais (números inteiros> 0) de STDIN e imprima a soma dos dois números em STDOUT. O desafio é que você deve usar o mínimo de sinais +
e -
sinais possíveis. Você não tem permissão para usar nenhuma função de soma ou negação.
Exemplos
entrada
123
468
saída
591
entrada
702
720
saída
1422
Desempatador:
Se dois programas tiverem o mesmo número de caracteres +
e -
, o vencedor será a pessoa com menos caracteres /
*
(
)
=
.
,
e 0-9
.
Não permitido: idiomas nos quais os operadores padrão de adição / subtração e incremento / decremento são símbolos diferentes +
ou -
não são permitidos. Isso significa que o espaço em branco no idioma não é permitido.
fonte
+
ou-
...+
,-
e desempate personagens? ... ou você precisa mudar as regras novamente :-)Respostas:
Perl (sem +/-, sem desempate, 29 caracteres)
Como bônus, você pode fazer o código somar mais de dois números adicionando mais
x
s aos!!xx!
.Como alternativa, aqui estão duas soluções de 21 caracteres com 1 e 3 desempatadores, respectivamente
Nota: Essas soluções usam a
say
função, disponível desde o Perl 5.10.0 com a-E
opção de linha de comando ou comuse 5.010
. Veja o histórico de edições desta resposta para versões que funcionam em perls mais antigos.Como funciona a solução sem desempate?
s!!xx!
é um operador de substituição de regexp , operando por padrão na$_
variável, que substitui a cadeia vazia pela cadeiaxx
. (Normalmente/
é usado como delimitador regexp em Perl, mas realmente quase qualquer personagem pode ser usado eu escolhi.!
Já que não é um tie-breaker.) Esta é apenas uma maneira elegante de antecedendo"xx"
a$_
- ou, uma vez que$_
começa vazio (indefinido, na verdade), é realmente uma maneira de escrever$_ = "xx"
sem usar o sinal de igual (e com um caractere a menos também).s!x!$"x<>!eg
é outra substituição de expressão regular, desta vez substituindo cadax
no$_
com o valor da expressão$" x <>
. (Ag
opção especifica substituição global,e
especifica que a substituição deve ser avaliada como código Perl em vez de ser usada como uma seqüência literal.)$"
É uma variável especial cujo valor padrão passa a ser um espaço único; usá-lo em vez de" "
salvar um caractere. (Qualquer outra variável conhecida por ter um valor de um caractere, como$&
ou$/
, funcionaria igualmente bem aqui, exceto que o uso$/
me custaria um desempate.)O
<>
operador de entrada de linha , no contexto escalar, lê uma linha da entrada padrão e a retorna. Ox
antes é o operador de repetição de strings Perl e é realmente o núcleo desta solução: retorna seu operando esquerdo (um caractere de espaço único) repetido o número de vezes fornecido pelo seu operando direito (a linha que acabamos de ler como entrada).y!!!c
é apenas uma maneira obscura de (ab) usar o operador de transliteração para contar os caracteres em uma string ($_
por padrão, novamente). Eu poderia ter escritosay length
, mas a versão ofuscada é um personagem menor. :)fonte
code-golf
com algumas restrições de origem?R (24 caracteres)
O que isso faz:
scan
lê a entrada de STDIN (ou um arquivo)sequence
gera sequências inteiras a partir de 1 e concatena as seqüências. Por exemplo,sequence(c(2, 3))
resultados no vetor1 2 1 2 3
length
calcula o número de elementos no vetor concatenadoExemplo 1:
Exemplo 2:
fonte
D
pouco girando para a vitória
como bônus, o código compilado não contém uma operação de adição (embora não seja possível falar pela chamada readf)
fonte
Python 2, 43 bytes
fonte
print sum(input(),input())
GolfScript
Sem +/- ou desempatadores:
Versão muito mais simples, com dois caracteres desempatadores, usando o mesmo truque de concatenação de lista que outras pessoas estão usando:
Suponho que o GolfScript não seja desqualificado por ter
)
um operador de incremento, pois na verdade não o estou usando.fonte
C (apenas 32 bits)
A aritmética dos ponteiros é igualmente boa.
Como isso corresponde aos requisitos?
* Não
+
ou-
* Não
/
,=
,.
,0
-9
* Apenas 3 pares de parênteses, o que me parece mínima (você precisa
main
,scanf
,printf
).* Um
*
(a abordagem do ponteiro exige).* Quatro
,
(poderia salvar uma definindo variáveis normais, nãoac,av
)fonte
C ++ 0 +/-, 3 desempatadores
fonte
Haskell, 0 + 2
Isso usa nenhum
+
ou-
caracteres e apenas dois=
do conjunto de caracteres de desempatador, um dos quais é obrigatório para ligaçãomain
. A soma é feita concatenando listas dos comprimentos apropriados.fonte
EDIT Isso foi publicado ANTES que as regras fossem alteradas para não permitir
sum
...A linguagem R: Não há chamadas para
+
ou-
... E 9 caracteres para desempate!Exemplo:
A
[1] 579
é a resposta 579 ([1]
é para acompanhar onde está o vetor de resultado, pois em R todos os valores são vetores - nesse caso, o comprimento 1)Observe que R possui
+
operadores exatamente como a maioria dos idiomas - acontece que também possuisum
um conjunto de vetores.Nesse caso,
readLines
retorna um vetor de string de comprimento 2. Eu o coagido a numérico (dobra) e somado ...Apenas para mostrar alguns outros recursos do R:
fonte
colSums
... Talvez também ilegalize "funções do tipo negação" enquanto estiver trabalhando ...A linguagem R
Novas regras, nova resposta, mesmo idioma. Nenhuma chamada
+
ou-
ATUALIZAÇÃO Usando
scan
, ele cai para 11 caracteres desempatadores (e 27 caracteres no total).Original: 13 personagens desempate!
Exemplo:
Desta vez, o resultado é alcançado pela multiplicação da matriz. A resposta é exibida como uma matriz 1x1.
fonte
scan()
vez dereadlines(n=2)
Haskell, 0
+
/-
,62 desempate (=
)(não usa o truque de concatenação de string / lista)
fonte
Javascript, 56
Graças a @JiminP na ponta ~~! Eu estou indo para menos bytes, então a economia de 1 byte no prompt p =; ainda vale a pena. Entendo sua argumentação sobre caracteres desempatadores, mas, para ser sincero, você prefere o mínimo de bytes :-p
Versão, 69
Graças a alguns comentários de @Ilmari e @JiminP, retirei 13 bytes da minha solução original.
Originalmente, 82
fonte
concat
e inserir cálculosalert
é mais curto.i=parseInt;p=prompt;alert(Array(i(p())).concat(Array(i(p()))).length)
BTW, eu não sabia queArray(n)
retorna uma matriz com comprimenton
. O console do Google Chrome me deu[]
e eu pensei que não havia nada ...p=prompt
não é bom. E,parseInt(x)
é quase equivalente a~~x
.alert(Array(~~prompt())['concat'](Array(~~prompt()))['length'])
(12 caracteres de desempate) PS. Eu poderia usar isso como minha entrada, mas isso me dá uma sensação de roubo.C
fonte
APL (sem +/-, sem desempate, 8 ou 10 caracteres)
Essa entrada é semelhante às outras que concatenam seqüências geradas a partir da entrada e encontram o comprimento ... mas está no APL, que pode parecer confuso mesmo para um pequeno problema como esse. Eu usei o Dyalog APL , que oferece uma licença educacional gratuita.
Código:
Da direita para esquerda:
⎕
) solicita a entrada do usuário e a avalia.¨
) aplica a função de gerador de índice (⍳
) a cada um dos itens da matriz à sua direita./
), que dobra a matriz usando a função de concatenação (,
). Para esse desafio,⌿
é utilizado o operador de redução unidimensional ( ), juntamente com o operador de concatenação ao longo do primeiro eixo (⍪
).⊃
) fornece o conteúdo da matriz fechada (a bolsa).⍴
) fornece os comprimentos das dimensões de uma matriz. Nesse caso, como temos uma matriz unidimensional, obtemos o número de itens na matriz, que é o nosso resultado.Se precisarmos produzir explicitamente o resultado, podemos fazer o seguinte:
Código Python comparável, com os símbolos APL correspondentes acima:
Eu gostaria de saber se há uma versão mais curta possível em APL - outra, versão mais simples que eu vim com que tem mais desempates (embora ainda em 8 caracteres) é:
⍴(⍳⎕),⍳⎕
.fonte
Eu não vi ninguém fazer isso da maneira da Engenharia Elétrica, então aqui está a minha opinião (em rubi):
É um pouco feio, mas faz o trabalho. Os dois valores são comparados pouco a pouco
AND
. Se eles não tiverem nenhum bit em comum, não haverá "carry" na próxima coluna binária; portanto, a adição poderá ser concluída bit-XOR
a- bit . Se houver um transporte, você precisará adicioná-lo ao bit a bitXOR
. Aqui está um pequeno script em rubi que eu usei para garantir que minha lógica digital não estivesse muito enferrujada:Felicidades!
fonte
Semente ,
3904384611 bytes, 0 +/-, 10 desempatadoresfonte
Shell, 52
Esta é basicamente a mesma resposta que dei para outro problema.
fonte
xargs -n1 jot | wc -l
o que leva a mesma-
reduçãoawk
, mas eu não posso ver como evitá-la noxargs
C
fonte
/*=.
, 7(
, 7)
, 7,
, 1[0-9]
C #
Não é o mais curto de todos os tempos:
fonte
J,
15caracteres, 1 desempate, programa incompletoEsta é a minha tentativa de J. Não é um programa completo, porque ainda não descobri como escrever um. Basta colocar essa linha em um script para obter a função
p
que pode ser usada para adicionar uma quantidade arbitrária de números. É uma mônada e pega uma lista de números a serem adicionados (comop 1 2 3 4
):A ideia é muito simples. A função é escrita em estilo tácito, também sem sentido. Aqui está uma definição pontiaguda:
Leia da direita para a esquerda. Na versão tácita,
@
compõe as partes da função. (como um ∘ em matemática [(f∘g) (x) = f (g (x)])y
é o parâmetro dep
.~
torna um verbo reflexivo. Para algum verbom
,m~ a
é igual aa m a
.#
(cópiaa#b
): Cada elemento ema
é replicadoi
vezes, ondei
está o elemento no mesmo índice que o elemento atuala
deb
. Assim,#~
replica um itemn
n
vezes.#
(count#b
): conta o número de elementos emb
.Conclusão: J é impressionante e menos legível que o Perl (o que a torna ainda mais impressionante)
Edições
#
vez dei.
. sim! Menos caracteres que golfscript.Mais de um programa
Este pergunta para entrada, mas ainda não é um programa completo: (13 caracteres, 3 disjuntores)
fonte
Javascript (17 caracteres desempatadores)
: P ("Ofuscado" para reduzir o número de caracteres de desempate. Internamente, é
b=prompt(a=prompt(y=function(a){c=new Uint8Array(a);for(i in c)if(i==~~i)x.push(1)},x=[]));y(a);y(b);alert(x.length);
.)fonte
C #,
Programa funciona em 1 linha; separados em várias linhas para evitar a rolagem horizontal.
fonte
Clojure (44 caracteres)
Edit: corrigido para imprimir em STDOUT em vez de apenas retornar a soma.
fonte
Scala
Código:
fonte
K, 11
O mesmo truque de concatenação da solução R. Leitura da direita para a esquerda: enumere as duas variáveis de entrada, concatene e depois conte.
fonte
PowerShell ,
2742 bytes, 0+-
,41 secundárioAgradecimentos ao mazzy por salvar um
+
e quatro secundáriosExperimente online! ou Pretty Table por mais 3 bytes
-Ou- adicionando quatro secundários para salvar 19 bytes:
3223 bytes,10+-
,125 secundários-9 bytes graças a mazzy
Experimente online!
Para cada argumento,
n
enviamos elementos de matriz (consistindo em,[n]
mas isso não é importante) para o pipeline, que são agrupados pelos parênteses e depois contados.fonte
|fl
um formato bonito Experimente online!Barril (SBCS no wiki Barril)
Basicamente, uma porta da resposta R.
Explicação
fonte
05AB1E , 2
4bytes, 0+
/-
Experimente online!
Desculpas se eu não entendi esse desafio, mas fiquei surpreso por não haver resposta 05AB1E. Resposta mais curta nesse idioma que eu poderia sugerir que não usa + ou a função soma incorporada.
Explicação:
-2 bytes graças ao Grimy.
fonte
Python 3
Sem depender de somas ocultas em outras funções.
Experimente online!
fonte
D
desta vez usando comprimentos de matriz
fonte