Adicione sem adição (ou qualquer um dos 4 operadores aritméticos básicos)

40

Problema:

Seu objetivo é somar dois números de entrada sem usar qualquer um dos seguintes operadores matemáticos: +,-,*,/.

Além disso, você não pode usar nenhuma função interna projetada para substituir esses operadores matemáticos.

Pontuação:

O menor código (em número de bytes) vence.

Atualizar

A maioria dos programas que eu vi concatenou duas matrizes contendo seus números ou a forma first numberde um caractere, anexou second numbercaracteres e contou todos.

Menor contador de matrizes: APL com 8 caracteres, de Tobia

Concatenação de matriz mais curta : Golfscript with 4 chars, by Doorknob

Solução logarítmica mais curta: TI-89 Basic com 19 caracteres, da Quincunx

Solução de integração: Mathematica com 45 caracteres, de Michael Stern

O mais legal, na minha opinião: operadores bit a bit em javascript, por dave

O médico
fonte
Será que ele tem carros alegóricos?
Ismael Miguel
7
Terá números negativos? (Atualmente, todas as respostas supor que os números serão positivos, então você provavelmente não deve mudar isso)
Doorknob
4
E as soluções matemáticas? Você esqueceu de listar aqueles! Isso se integra, e isso brinca com logaritmos
Justin
3
Por que você aceitou uma das soluções mais longas? É porque aceita números negativos, enquanto as soluções mais curtas ( isto e isto ) não? Nesse caso, minha resposta suporta números negativos (também suporta ponto flutuante) e é mais curta que esta. Você marcou esta pergunta como código-golfe , portanto, você é obrigado a aceitar a solução mais curta .
23714 Justin
2
Defina "número". Algum inteiro? Inteiros não negativos? Eles precisam ser da base 10?
precisa saber é o seguinte

Respostas:

2

Smalltalk, 21 13

Todos os itens a seguir funcionam apenas em números inteiros positivos. Veja a outra resposta do Smalltalk para uma resposta séria.

versão 1

mudando para um número inteiro grande e solicitando seu alto índice de bits (ruim, a indexação ST é baseada em 1, então eu preciso de uma mudança à direita adicional):

(((1<<a)<<b)>>1)highBit

versão 2

semelhante e até um pouco mais curto (devido às regras de precedência do Smalltalk, e nenhuma mudança à direita necessária):

1<<a<<b log:2 

version3

outra variação do tema "tamanho da solicitação de concatenação da coleção",
dados dois números a e b,

((Array new:a),(Array new:b)) size

usando intervalos como coleção, obtemos uma versão mais amigável à memória ;-) em 21 caracteres:

((1to:a),(1to:b))size

não recomendado para trituração de números pesados, no entanto.

version4

Para sua diversão, se você quiser trocar tempo pela memória, tente:

Time secondsToRun:[
   Delay waitForSeconds:a.
   Delay waitForSeconds:b.
]

que geralmente é preciso o suficiente (mas não garante ;-)))

version5

escreva em um arquivo e peça seu tamanho

(
    [
        't' asFilename 
            writingFileDo:[:s |
                a timesRepeat:[ 'x' printOn:s ].
                b timesRepeat:[ 'x' printOn:s ]];
            fileSize 
    ] ensure:[
        't' asFilename delete
    ]
) print
blabla999
fonte
45

Javascript (25)

while(y)x^=y,y=(y&x^y)<<1

Isso adiciona duas variáveis ​​x e y, usando apenas operações bit a bit e armazena o resultado em x.

Isso funciona com números negativos também.

Dave
fonte
11
@dave, se você estiver mudando para um tempo, poderá salvar mais dois caracteres com while(y)x^=y,y=(y&x^y)<<1!
Dom Hastings
11
Versão mais legível do código: adicione dois números sem usar operadores aritméticos .
Franck Dernoncourt
3
@ user3125280, o problema não é "fazer disso sem fazer disso" (que é um pouco sem sentido), mas sim "fazer disso sem operadores matemáticos básicos"
Brian S
8
@ user3125280, desculpe, mas qualquer grosseria que você interpretou no meu comentário não foi intencional. Eu acho que você terá dificuldade em encontrar muitas pessoas que concordam que o XOR deve ser agrupado com o PLUS na categoria "aritmética básica". Mesmo além de encontrar pessoas que concordam, o OP chama explicitamente quais operadores não são permitidos e o XOR não é um deles. Portanto, esta é uma resposta válida.
Brian S
3
for(;y;y=(y&x^y)<<1)x^=yé 1 byte mais curto :)
William Barbosa
22

C - 38 bytes

main(){return printf("%*c%*c",3,0,4);}

Eu trapaceio um pouco aqui, o OP disse para não usar nenhum operador matemático .

O *no printf()formato significa que a largura do campo usada para imprimir o caractere é obtida a partir de um argumento printf(), neste caso, 3 e 4. O valor de retorno printf()é o número de caracteres impressos. Portanto, imprimir um ' 'com largura de campo 3 e outro com largura de campo 4 gera um total de 3 + 4 caracteres.

O valor de retorno são os números adicionados na printf()chamada.

syb0rg
fonte
3
Você deve fazer 3 e 4 parâmetros, e a função não precisa ser main. Além disso, se você não se importa o que você imprimir, você pode substituir um ' 'com 0e omitir o segundo.
ugoren
17

Python - 49 bytes

Assumindo entrada por posicionamento em variáveis xe y.

from math import*
print log(log((e**e**x)**e**y))

Esta solução de 61 bytes é um programa completo:

from math import*
print log(log((e**e**input())**e**input()))

Considerando que você não proibiu a exponenciação, tive que postar isso. Quando você simplifica a expressão usando propriedades dos logaritmos, você simplesmente obtém print input() + input().

Isso suporta números de ponto negativo e de ponto flutuante.

Nota: Eu segui o conselho do mordedor e dividi esta resposta em três. Esta é a solução Mathematica , e esta é a solução básica TI-89 .

Justin
fonte
Eu estava tentando fazer algo semelhante ao javascript, mas esqueci qual era a fórmula, já que faz alguns anos a última vez que a vi e estava pesquisando na internet para encontrá-la.
Victor Stafusa 16/02
4
@ Victor Criei a fórmula por conta própria. Lembro-me de matemática muito claramente.
23630 Justin
11
Seu Mathematica está muito próximo, você só precisa capitalizar os símbolos internos. Log [Log [(E ^ E ^ x) ^ (E ^ y)]] funciona (23 caracteres ou 22 se você usar a notação @ para o agrupamento da função externa).
Michael Stern
"Se eu posso assumir a entrada colocando as variáveis ​​x e y .." Eu acho que você pode - outros o fazem também.
blabla999
@ MichaelStern: você pode salvar mais dois caracteres saltando os parênteses E^y. Usar Log[Log[(E^E^x)^E^y]]parece funcionar bem.
21414 alexandrchan
14

JavaScript [25 bytes]

~eval([1,~x,~y].join(''))
Andrew Templeton
fonte
11
Sua resposta parece ruim (e atrai votos negativos), mas na verdade é uma boa resposta. Exclua este para se livrar das votações negativas e repassá-lo com algum texto explicando. Vou votar sua nova resposta.
Victor Stafusa
11
Agora parece muito bom, eu gosto. Certamente vale mais votos positivos.
VisioN
13

Mathematica, 21 bytes

Existem várias maneiras de fazer isso no Mathematica. Primeiro, use a função Acumular e lance tudo, exceto o número final na saída. Como na minha outra solução abaixo, presumo que os números de entrada estejam nas variáveis ae b. 21 bytes.

Last@Accumulate@{a, b}

Mais divertido, embora tenha 45 caracteres, use os números para definir uma linha e integrar sob ela.

Integrate[Fit[{{0, a}, {2, b}}, {x, 1}, x], {x, 0, 2}]

Como bônus, ambas as soluções funcionam para todos os números complexos, não apenas números inteiros positivos, como parece ser o caso de algumas outras soluções aqui.

Michael Stern
fonte
2
Eu amo a integração! (embora, estritamente falando, isso acrescente algo). 1
blabla999
A 1ª solução é inválida. Citando o autor do desafio: "Além disso, você não pode usar nenhuma função interna projetada para substituir esses operadores matemáticos". Eu tinha dado a esta solução: function _(){return array_sum(func_get_args());}. Eu tive que derrubar porque não consegui encontrar uma maneira curta de "consertar".
Ismael Miguel
@Ismael Miguel Accumulate [] não foi projetado para substituir o Plus. Por acaso, fornece a soma de uma lista de números entre suas saídas, e eu aproveito isso.
Michael Stern
Mas faz a soma de todos os elementos nessa lista, certo? Se isso acontecer, na minha opinião, é tão inválido quanto usar array_sum()no php, que faz exatamente a mesma coisa.
Ismael Miguel
3
@ Ismael Miguel Existe uma função Mathematica que soma uma matriz, chamada Total []. Concordo que seria contra as regras especificadas para usar essa função, mas não o fiz. A saída de Acumular [{a, b}] não é a + b.
Michael Stern
12

GolfScript, 6 4 caracteres / bytes

Entrada na forma de 10, 5(=> 15).

~,+,

A +concatenação é de matriz, não adição.

Como funciona é que ,é usado para criar uma matriz do tamanho que o número é ( 0,1,...,n-2,n-1). Isso é feito para os dois números e as matrizes são concatenadas. ,é usado novamente para uma finalidade diferente, para encontrar o comprimento da matriz resultante.

Agora, aqui está o truque . Eu realmente gosto deste porque abusa do formato de entrada. Ele olha como ele está apenas introduzir um array, mas realmente, uma vez que a entrada está sendo executado como código GolfScript, o primeiro ,já está feito para mim! (A versão antiga de 6 caracteres estava ~,\,+,no formato de entrada 10 5, que eu retirei 2 caracteres eliminando o \,(swap-array)).

Versão antiga (12) :

Cria uma função f.

{n*\n*+,}:f;

A repetição e a concatenação das cordas *e +são respectivamente funções não aritméticas.

Explicação: ncria uma cadeia de um caractere (uma nova linha). Isso é repetido várias avezes, e a mesma coisa é feita b. As cadeias são concatenadas e, em seguida, ,são usadas para o comprimento da cadeia.

Maçaneta da porta
fonte
Também funciona para números negativos?
Michael Stern
@ MichaelStern Não, mas isso nunca foi mencionado na pergunta. Hmm, eu adicionei um comentário. A maioria (de fato, todas ) das outras respostas também assume pontos positivos.
Maçaneta
Veja minha solução Mathematica. No idioma certo, são possíveis soluções para números negativos.
Michael Stern
@MichaelStern LOL @ "idioma certo" neste site de todos os lugares ...
Tobia
10

C, 29 27 bytes

Usando a aritmética do ponteiro:

f(x,y)char*x;{return&x[y];}

x é definido como um ponteiro, mas o chamador deve passar um número inteiro.

Um usuário anônimo sugeriu o seguinte - também 27 bytes, mas os parâmetros são inteiros:

f(x,y){return&x[(char*)y];}
Ugoren
fonte
A primeira forma provavelmente quebra mal se passar dois ints nos sistemas agora comuns, onde inttem 32 bits, e os ponteiros têm 64 bits. O segundo evita esse problema.
hvd 17/02
@ DVD, ambos funcionam, pelo menos no Linux de 64 bits. Parâmetros inteiros são estendidos para o tamanho do registro da máquina de qualquer maneira.
ugoren
Ah, é justo, concordou que esse provavelmente será o caso comum. Comentarei novamente se eu puder encontrar um exemplo concreto que não funcione. :)
hvd 17/02
8

Brainf * ck, 9 36

,>,[-<+>]

++[->,[->>[>]+[<]<]<]>>>[<[->+<]>>]<

Isso funciona sem o uso de adição simples; ele passa e estabelece uma trilha de 1 e depois os conta

Nota: Os +e -são apenas incrementos simples e nada pode ser feito no cérebro sem eles. Eles não são realmente adição / subtração, então acredito que isso ainda conta.

ASKASK
fonte
-1. Esta é uma adição simples. Se você fez algo que não é adição, multiplicação, etc, então conta, mas, como está, isso não conta.
266 Justin Justin
@Quincunx eu consertei; eu fiz isso por goign através e deixando um rastro de queridos e, em seguida, varrendo e 'pegar' que trilha
ASKASK
3
Invertida. Bom trabalho.
Justin
6

J (6)

Você não disse que não poderíamos usar a função succ:

>:@[&0

Uso:

   9>:@[&0(8)
17

Faz apenas 9 repetições de >:8.

A abordagem lista concatenação funciona, também: #@,&(#&0). E - eu sei que é contra as regras - não posso deixar essa resposta passar sem a solução mais j-ish: *&.^(multiplicação sob exponenciação).

James Wood
fonte
5

Postscript, 41

Definimos função com expressão 41 bytes, desde que:

/a{0 moveto 0 rmoveto currentpoint pop}def

Então, nós o chamamos, por exemplo, como:

gs -q -dBATCH -c '/a{0 moveto 0 rmoveto currentpoint pop}def' -c '10 15 a ='

Que dá

25.0

Ele lida facilmente com negativos e carros alegóricos, ao contrário da maioria dos concorrentes :-)

user2846289
fonte
4

festança, 20 caracteres

(seq 10;seq 4)|wc -l
Nik O'Lai
fonte
4

Smalltalk (agora sério), 123 118 105 (*)

Desculpe por responder duas vezes, mas considere essa uma resposta séria, enquanto a outra era mais parecida com humor. O seguinte é realmente executado exatamente neste exato momento em todas as nossas máquinas (no hardware). Estranho que não viesse à mente de mais ninguém ...

Combinando dois semi-somadores e executando todos os bits das palavras em paralelo, obtemos a versão legível (entradas a, b; saída em s):

  s := a bitXor: b.            
  c := (a & b)<<1.             

  [c ~= 0] whileTrue:[        
     cn := s & c.
     s := s bitXor: c.
     c := cn<<1.
     c := c & 16rFFFFFFFF.
     s := s & 16rFFFFFFFF.
  ].
  s           

O loop é para transportar propagação. As máscaras garantem que números inteiros assinados sejam manipulados (sem eles, apenas números não assinados são possíveis). Eles também definem o comprimento da palavra, sendo o anterior para operação de 32 bits. Se você preferir a adição de 68 bits, mude para 16rFFFFFFFFFFFFFFFFFFF.

versão golf (123 caracteres) (evita a máscara longa reutilizando em m):

[:a :b||s c n m|s:=a bitXor:b.c:=(a&b)<<1.[c~=0]whileTrue:[n:=s&c.s:=s bitXor:c.c:=n<<1.c:=c&m:=16rFFFFFFFF.s:=s&m].s]

(*) Usando -1 em vez de 16rFFFFFFFF, podemos jogar melhor, mas o código não funciona mais para números de precisão arbitrários, apenas para smallIntegers do tamanho de palavras de máquinas (a representação para largeIntegers não está definida no padrão Ansi):

[:a :b||s c n|s:=a bitXor:b.c:=(a&b)<<1.[c~=0]whileTrue:[n:=s&c.s:=s bitXor:c.c:=n<<1.c:=c&-1.s:=s&-1].s]

isso reduz o tamanho do código para 105 caracteres.

blabla999
fonte
Este é o código-golfe, então golf a sua resposta.
Victor Stafusa
11
nenhuma chance de ganhar, mas eu vou fazer isso para você ;-)
blabla999
É bom ver uma resposta do Smalltalk!
Escova de dentes
4

APL, 8 e 12

Nada de novo aqui, a versão que conta o array:

{≢∊⍳¨⍺⍵}

e o log ○ versão do log:

{⍟⍟(**⍺)**⍵}

Eu apenas pensei que eles pareciam legais no APL!

{≢     }       count
  ∊            all the elements in
   ⍳¨          the (two) sequences of naturals from 1 up to
     ⍺⍵        both arguments

 

{⍟⍟        }   the double logarithm of
   (**⍺)       the double exponential of ⍺
        *      raised to
         *⍵    the exponential of ⍵
Tobia
fonte
2
Para ser justo, tudo parece legal no APL.
Michael Stern
Você pode transformar o primeiro em uma função de prefixo tácito para 5:≢∘∊⍳¨
Adám
@ Adám Sim, mas não gosto de funções tácitas e as acho difíceis de ler.
Tobia 27/07
@Tobia Talvez você não goste deles porque os acha difíceis de ler? Estou dirigindo uma oficina sobre isso ... Você viu minha lição sobre isso ?
Adám 27/07
@ Adám legal, obrigado! Irá verificar.
Tobia
4

sed, 359 bytes (sem a formatação sofisticada)

Desculpe pela resposta tardia e provavelmente a resposta mais longa aqui de longe. Mas eu queria ver se isso é possível com o sed:

                       s/([^ ]+) ([^ ]+)/\1:0::\2:/
                       :d /^([^:]+):\1::([^:]+):/tx
                       s/(:[^:]*)9([_:])/\1_\2/g;td
s/(:[^:]*)8(_*:)/\19\2/g;s/(:[^:]*)7(_*:)/\18\2/g;s/(:[^:]*)6(_*:)/\17\2/g
s/(:[^:]*)5(_*:)/\16\2/g;s/(:[^:]*)4(_*:)/\15\2/g;s/(:[^:]*)3(_*:)/\14\2/g
s/(:[^:]*)2(_*:)/\13\2/g;s/(:[^:]*)1(_*:)/\12\2/g;s/(:[^:]*)0(_*:)/\11\2/g
                       s/:(_+:)/:1\1/g; y/_/0/; # #
                       bd;  :x  s/.*::([^:]+):/\1/;
                       # # # # # # #  # # # # # # #

Isso é semelhante a https://codegolf.stackexchange.com/a/38087/11259 , que simplesmente incrementa números em uma sequência. Mas, em vez disso, realiza as operações de incremento em um loop.

A entrada é obtida de STDIN no formato "x y". Isso é transformado primeiro em "x: 0 :: y:". Em seguida, incrementamos todos os números que vêm depois dos caracteres ":", até obtermos "x: x: :( x + y):". Então finalmente retornamos (x + y).

Saída

$ printf "%s\n" "0 0" "0 1" "1 0" "9 999" "999 9" "12345 67890" "123 1000000000000000000000"  | sed -rf add.sed
0
1
1
1008
1008
80235
1000000000000000000123
$

Observe que isso funciona apenas para os números naturais. No entanto (pelo menos em teoria), ele funciona para números inteiros arbitrariamente grandes. Como estamos realizando operações de incremento de x em y, a ordem pode fazer uma grande diferença na velocidade: x <y será mais rápido que x> y.

Trauma Digital
fonte
4

Traço , 18 bytes

time -f%e sleep $@

Requer tempo GNU 1.7 ou superior. A saída é para STDERR.

Experimente online!

Observe que isso não funcionará no B ash, pois seu comando de tempo interno difere do tempo do GNU.

Ao custo de um byte adicional, \timepode ser usado em vez de timeforçar o Bash a usar o comando externo.

Dennis
fonte
o que acontece se uma das entradas é negativa?
Michael Stern
4
Falha. Assim como todas as outras respostas.
Dennis
5
Drats! Eu esperava que desse o resultado antes que a pergunta fosse feita.
Tobia
3
Sim. Eu também esperava que, ao inserir aleatoriamente, sleep -3eu pudesse acelerar meus programas. Que decepção.
Alfe 17/02
11
O @userunknown também \timedeve funcionar no Bash.
Dennis
3

Javascript (67)

Provavelmente há muito melhor

a=Array;p=Number;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Michael M.
fonte
Você não deve dar uma resposta definitiva sem saber se precisa de boias ou não. E não vai lidar com NaN. Mas é um bom código!
Ismael Miguel
Eu acho que tudo isso joinsé desnecessário. O Arrayconstrutor cria uma matriz de undefineds, que pode ser contada:a=Array;p=parseInt;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Ben Reich
@BenReich, você está certo, graças
Michael M.
@ Michael Além disso, o Numberconstrutor salva 2 caracteres maisparseInt
Ben Reich
@ Michael Além disso, se você remover o alert, a saída ainda iria para o console, mas isso tornaria a resposta um pouco menos divertida. Você também pode reutilizar a promptvariável em vez de alerta (o construtor alerta o argumento com o prompt). Enfim, boa resposta!
Ben Reich
3

Ruby, 18 caracteres

a.times{b=b.next}

E mais duas variantes detalhadas, 29 caracteres

[*1..a].concat([*1..b]).size

Outra versão, 32 caracteres

(''.rjust(a)<<''.rjust(b)).size
Nik O'Lai
fonte
3

Geração de código on-the-fly

Sim, há realmente uma adição lá, mas não o operador + e nem mesmo uma função de estrutura que adiciona, em vez disso, geramos um método instantâneo que faz a adição.

public static int Add(int i1, int i2)
{
    var dm = new DynamicMethod("add", typeof(int), new[] { typeof(int), typeof(int) });
    var ilg = dm.GetILGenerator();
    ilg.Emit(OpCodes.Ldarg_0);
    ilg.Emit(OpCodes.Ldarg_1);
    ilg.Emit(OpCodes.Add);
    ilg.Emit(OpCodes.Ret);
    var del = (Func<int, int, int>)dm.CreateDelegate(typeof(Func<int, int, int>));
    return del(i1, i2);
}
fejesjoco
fonte
2

Ruby 39

f=->a,b{[*1..a].concat([*1..b]).length}
Hauleth
fonte
2

R 36

function(x,y)length(rep(1:2,c(x,y)))

onde repconstrói um vetor de xuns seguidos por ydois.

modelo
fonte
2
Você pode fazer um programa que faz o mesmo um pouco menor:length(rep(1:2,scan()))
Masclins
2

TI Básico 89 - 19 bytes

Execute isso na sua TI-89 (tela inicial ou aplicativo de programação):

ln(ln((e^e^x)^e^y))

Isso usa regras de log para calcular x+y, assim como nesta solução . Como bônus, funciona para números decimais e números inteiros. Funciona para todos os números reais. Se as regras do logaritmo ainda são válidas com expoentes complexos, isso também funciona para números complexos. No entanto, minha calculadora cospe lixo quando tento inserir expoentes complexos.

Justin
fonte
3
Não há ln1 byte no TI Basic? Além disso, você pode soltar os parênteses de fechamento, reduzindo isso para 15 bytes.
ɐɔıʇǝɥʇuʎs
2

Agradeço a Michael Stern por me ensinar a notação Mathematica .

Mathematica - 21 20 bytes

Log@Log[(E^E^x)^E^y]

Isso usa a mesma abordagem que esta solução , mas está no Mathematica para torná-la mais curta. Isso funciona para números negativos e de ponto flutuante, além de números inteiros em xe y.

Simplificar a expressão usando regras de log gera x+y, mas isso é válido, pois usa exponenciação, não um dos quatro operadores básicos.

Justin
fonte
Tem certeza de que funciona para números complexos?
Michael Stern
2

Aritmética de cordas

Convertemos os dois números em strings, fazemos a adição com o corte de strings (com carry e tudo, você sabe) e depois analisamos de volta para inteiro. Testado com i1, i2 em 0..200, funciona como um encanto. Encontre uma adição neste!

public static int Add(int i1, int i2)
{
    var s1 = new string(i1.ToString().Reverse().ToArray());
    var s2 = new string(i2.ToString().Reverse().ToArray());
    var nums = "01234567890123456789";
    var c = '0';
    var ret = new StringBuilder();
    while (s1.Length > 0 || s2.Length > 0 || c != '0')
    {
        var c1 = s1.Length > 0 ? s1[0] : '0';
        var c2 = s2.Length > 0 ? s2[0] : '0';
        var s = nums;
        s = s.Substring(int.Parse(c1.ToString()));
        s = s.Substring(int.Parse(c2.ToString()));
        s = s.Substring(int.Parse(c.ToString()));
        ret.Append(s[0]);
        if (s1.Length > 0)
            s1 = s1.Substring(1);
        if (s2.Length > 0)
            s2 = s2.Substring(1);
        c = s.Length <= 10 ? '1' : '0';
    }
    return int.Parse(new string(ret.ToString().ToCharArray().Reverse().ToArray()));
}
fejesjoco
fonte
2

C (79)

void main(){int a,b;scanf("%d%d",&a,&b);printf("%d",printf("%*c%*c",a,0,b,0));}
Pruthvi Raj
fonte
2

Python - 22 caracteres

len(range(x)+range(y))
pydud
fonte
11
Eu acho que isso conta como adição?
TheDoctor
11
é concatenação
pydud 17/02
2

APL: 2

1⊥

Isso converte os números da base 1, então (n * 1 ^ 1) + (m * 1 ^ 2), que é exatamente n + m.

Pode ser experimentado em TryApl.org

Moris Zucca
fonte
2

TI-BASIC, 10

Adiciona XeY

ln(ln(e^(e^(X))^e^(Y
Timtech
fonte
11
Você com certeza sabe copiar soluções: codegolf.stackexchange.com/a/21033/9498
Justin
Primeiro, isso não funciona porque usa log (em vez de ln (. Segundo, na verdade são dez bytes se escritos no formato ln (ln (e ^ (e ^ (X ^)) ^ e ^ (Y.
lirtosiast
2

K, 2 bytes

#&

Exemplo de uso:

  #&7 212
219

Aplique o operador "where" (monádico &) aos números em uma lista de entrada (possivelmente liberando o formato de entrada). Isso produzirá uma lista contendo o primeiro número de zeros, seguido pelo segundo número de zeros:

  &3 2
0 0 0 1 1

Normalmente, esse operador é usado como uma "coleta" para produzir uma lista dos índices dos elementos diferentes de zero de uma lista booleana, mas a forma generalizada é útil ocasionalmente.

Em seguida, basta fazer a contagem dessa lista (monádica #).

Se minha interpretação dos requisitos de entrada for inaceitável, a seguinte solução um pouco mais longa fará o mesmo truque:

{#&x,y}
JohnE
fonte
2

Pitão , 29 bytes

AQW!qG0=k.&GH=HxGH=k.<k1=Gk)H

Experimente online!

Minha primeira submissão aqui!

Isso compila para:

assign('Q',eval_input())     # Q
assign('[G,H]',Q)            #A
while Pnot(equal(G,0)):      #  W!qG0
  assign('k',bitand(G,H))    #       =k.&GH
  assign('H',index(G,H))     #             =HxGH  (index in this case is XOR)
  assign('k',leftshift(k,1)) #                  =k.<k1
  assign('G',k)              #                        =Gk)
imp_print(H)                 #                            H
bengdahl
fonte
11
Bem vindo ao site!
Assistente de trigo 07/02