O que você ganha quando multiplica 6 por 9? (42)


60

Eu amo matemática. Mas não consigo encontrar uma única calculadora que possa se multiplicar corretamente. Eles parecem acertar tudo, exceto 6 * 9 (é a questão da vida, do universo e de tudo! Como eles erraram ?!). Quero que todos escrevam para mim uma função que possa multiplicar 2 números corretamente (e 6 * 9 é igual a 42 em vez de 54. 9 * 6 é igual a 54 ainda).

Ah, e eu vou ter que construir a fonte no Minecraft para que ... o menor número de bytes seja possível!

Recapitular

  • Pegue 2 números como entrada (o tipo não importa, mas apenas 2 itens serão passados, e a ordem deve ser consistente. Portanto, os fluxos e as matrizes são válidos desde que preservem a ordem em que foram inseridos. Ou seja, um mapa venceu funciona porque não preserva a ordem)
  • Saída de vários de ambos os números, exceto se forem 6 e 9, e saída 42 (a ordem é importante!)
    • PS. Eu nunca fui muito bom em contar, então acho que apenas números inteiros de 0 a 99 são números reais (o tipo usado não importa)
  • Menos bytes por idioma ganha!

Entre os melhores:


1
@ JonathanAllan Sim, adicionei regras para isso.
Tezra

73
Coincidentemente, o ID da pergunta tem 42duas vezes.
Erik the Outgolfer

1
se apenas números inteiros até 99 forem números reais, por exemplo, 9 * 11 é um prompt válido, mas 10 * 10 não é, certo?
the wanderer dark

14
@EriktheOutgolfer ... e os 12 stands para o subtrair se a entrada é 6 e 9.
Adám

11
@EriktheOutgolfer Mesmo se você ler o ID ao contrário.
T. Sar - Restabelece Monica

Respostas:


65

Mathematica, 15 bytes

A contagem de bytes assume a codificação ANSI do Windows (CP-1252).

6±9=42
±n__:=1n

Define um operador binário ±que resolve o problema. Simplesmente definimos 6±9=42como um caso especial que tem precedência e, em seguida, adicionamos uma definição de fallback que ±iguala à multiplicação. Este último usa um truque de golfe bastante interessante. A razão pela qual isso funciona é realmente bastante elaborada e precisamos examinar as seqüências . Uma sequência é semelhante ao que é conhecido como splat em outros idiomas. É basicamente uma "lista" sem nenhum invólucro. Por exemplo, f[1, Sequence[2, 3, 4], 5]é realmente justo f[1, 2, 3, 4, 5]. O outro conceito importante é que todos os operadores são apenas açúcar sintático. Em particular, ±pode ser usado como um operador unário ou binário e representa a cabeça PlusMinus. Então ±xé PlusMinus[x]e a±bé PlusMinus[a,b].

Agora nós temos a definição ±n__. Isso é uma abreviação para definir PlusMinus[n__]. Mas n__representa uma sequência arbitrária de argumentos. Portanto, isso realmente adiciona uma definição para uso binário (e n-ário) PlusMinustambém. O valor desta definição é 1n. Como isso multiplica os argumentos? Bem, 1nusa a multiplicação implícita do Mathematica por justaposição, portanto é equivalente a 1*n. Mas *também é apenas uma abreviação de Times[1,n]. Agora, né sequência de argumentos. Então, se invocarmos a±b, isso realmente se tornará Times[1,a,b]. E é só isso a*b.

Eu acho muito legal como esse abuso de sintaxe nos permite definir um operador binário usando sintaxe unária. Poderíamos agora fazer PlusMinus[2,3,4]cálculos 24(o que também pode ser escrito como ±##&[2,3,4]ou 2±Sequence[3,4]mas está ficando louco nesse ponto).


Eu particularmente gosto de como isso é basicamente um patch para minha 'calculadora': 3 Por diversão, isso também funciona para *? : 3
Tezra

3
O @Tezra também *é um operador embutido, portanto, Unprotecté necessário adicionar mais definições, mas Unprotect[Times];6*9=42deve funcionar (não é possível testar agora).
Martin Ender

1
Fazer isso com o operador * é tão ruim ... Adoro! >: 3
Tezra

1
Como posso votar quando existem exatamente 42 outras pessoas?!? Aqui está o meu "futuro +1" a ser concedido depois que alguém o quebrar! :-)
The Vee

1
@MartinEnder Aww; Mas é o Mathematica mais curto e o meu favorito até agora. : 3
Tezra 5/06


25

C, 32 31 29 28 bytes

-2 graças ao Digital Trauma
-1 graças à musicman523

#define f(a,b)a^6|b^9?a*b:42

Bem simples. Declara uma função macro fque recebe dois argumentos ae b.
Se aé 6e bé 9, retorne 42. Caso contrário, retorne ax b.

Experimente online!


2
Use em ^vez de ==e ajuste a lógica um pouco: #define f(a,b)a^6||b^9?a*b:42- economiza 2 bytes.
Digital Trauma

@DigitalTrauma Cheers: D
MD XF

1
Eu acho que você pode usar |em vez de ||para salvar outro byte, uma vez que ainda tem menor precedência do que^
musicman523

@ musicman523 Obrigado! Edição.
MD XF

1
Você deve atualizar sua versão Atalho para tirar essas mudanças também
musicman523

17

JavaScript (ES6), 20 bytes

x=>y=>x-6|y-9?x*y:42

Explicação:

Seff x == 6 e y == 9, x-6|y-9será 0 (falso) e 42 será o resultado.

Snippet:

f=

x=>y=>x-6|y-9?x*y:42

console.log(f(6)(9));
console.log(f(9)(6));


4
Muito bem feito; gostaria de ter pensado nisso. +1
Shaggy

14

Python 2 , 30 29 bytes

Obrigado a Jonathan Allan por salvar um byte!

lambda x,y:x*[y,7][6==x==y-3]

Experimente online!


2
Salve um byte usando o fato de que 6 * 7 é 42:lambda x,y:x*[y,7][6==x==y-3]
Jonathan Allan

@JonathanAllan Ohh, isso é legal! Obrigado! :)
Adnan

Esta solução também funciona em Python 3
AMK 22/08

Exatamente o que eu consegui! Não consigo encontrar nenhuma maneira de jogar ainda mais.
FlipTack

12

05AB1E , 15 11 9 bytes

-4 bytes graças a @Emigna

-2 bytes graças a @Adnan

P¹69SQi42

Experimente online!

Como funciona

P          # multiply input
 ¹         # push first number
  69       # the number 69
    S      # split per character
     Q     # equality for both inputs
       i42 # if so, print 42
           # otherwise print product

Você pode salvar 4 bytes com‚D96SQi42ëP
Emigna

@Emigna huh ... Por que ,no começo?
Neil A.

Emparelhar as 2 entradas para comparar apenas uma vez como uma lista.
Emigna

Suponho 6Qs9Q*que teria funcionado tão bem para a mesma contagem de bytes.
Emigna

Alterar o formato de entrada economiza 2 bytes:P¹69SQi42
Adnan

10

Java (OpenJDK 8) ,24 22 bytes

-2 bytes graças a @ OlivierGrégoire

a->b->a==6&b==9?42:a*b

Experimente online!


3
Bem-vindo ao PPCG! Não sei muito sobre Java, mas você poderia remover a System.out.println()chamada e deixar a função retornar o resultado?
ETHproductions

2
@ LưuVĩnhPhúc não em Java, porque eu teria que escrever, (a^6|b^9)==0pois não há comparação implícita "diferente de 0". O snippet de código resultante teria 27 bytes. De qualquer forma, obrigado pela sugestão, e me diga se eu entendi sua dica.
Bashful Beluga

1
@Riker Nope, não funciona assim em java. Por exemplo, o trecho int a = 5; if (a) do_some_stuff(); else do_other_stuff();fornece um Type mismatch: cannot convert from int to booleanerro de compilação. Eles devem ser feitos explicitamente com valores booleanos; consulte SO e ORACLE .
Bashful Beluga

3
Você pode usar currying de sobra um byte, e você pode se livrar do ponto e vírgula que não seja parte do lambda de sobra outro byte: a->b->a==6&b==9?42:a*b.
Olivier Grégoire

1
Apenas uma observação do porquê o 0 não é falso. Java é tipo seguro para que 0 é um inteiro não um typecasting boolean e inseguros não é permitido para que você não pode usar valores Falsas
Martin Barker

6

Ruby, 24 bytes

->a,b{a==6&&b==9?42:a*b}

a^6|b^9<1pode funcionar como booleano. Difícil de testar no meu smartphone.
Eric Duminil

1
@EricDuminil Infelizmente, essa expressão é analisada como (((a^6)|b)^9), por exemplo a.^(6).|(b).^(9), para que não funcione corretamente. a-6|b-9==0funcionaria, mas isso não é mais curto.
Ventero

@ Ventero: Eu não pensei nisso. Obrigado. a,b==6,9seria bom, mas também não funciona.
Eric Duminil

6

Brain-Flak , 158 154 148 140 138 126 bytes

(({}<>)(((([()()()]<>)){})<({}{}({}))>{(()()()){}(<{}>)}{}))([()]{()(<{}>)}{})(({<{}>{}((<>))}{}){}<{}>{<({}[()])><>({})<>}{})

Experimente online!

Explicação

Esse código é bem simples. Fazemos cópias dos dois principais itens da pilha, subtraímos 6 de um e 9 do outro. Depois, pegamos notos dois valores. Nós, andesses valores, multiplicamos o resultado por 12. Multiplique as entradas e subtraia os dois resultados.


2
Você pode usar letras maiúsculas note and/ ou maiúsculas ), lendo sua descrição e me enganando.
MD XF

6

Fatorio, 661 bytes, 6 combinadores com 9 conexões

Há um combinador constante definido para a saída A e B. Altere-os para definir a entrada.

Cadeia de projeto (0.15.18):

0eNrNVm2O2jAQvcv8rEKFvSHLRuqPtrfYCkUhGWAkYkfOGDVCOUBv0bP1JLWTLQuB3U0QbfcPYvzxZt68eYr3sNxaLA0phngPlGlVQfxtDxWtVbr1a1yXCDEQYwEBqLTwUY4Z5WgmmS6WpFLWBpoASOX4HWLRBG8C+EScKr6MIJtFAKiYmLCrpw3qRNliicaleK2SAEpduata+fQObiI+zgKo/R+XIyeDWbcrA18IG71NlrhJd+RuuytPmInby1ucyq+uyFScnPHakWHrVg4VdScmnz2fPzQhjnxQlKlpS4zhk7ugLZd2BCTu0NS8IbXusMvalWgVJyuji4SUA4OYjcWmS606nm31wv8YzI+7SS66axbusHxh1zeITGaJ21C4w41XtyeHHCXH9D+o8eVUjYd3qoY47bc86rWPo158/yze2iCqPtxsmHx3r9ry3E6ylU9cTUv0aITDygwPZaaGeFMgUzbM99NBg/aMegPnV+gxRg6oLtFNZFsjfLhiJB+huZn1B87O7Crr/0Pnfz11vug5/9ePn+/E+2Hf++4beNHV8uzgRWWica6ejnDKiraM5oWXwhtC2CcVDo+FxfAWDfwc3Y9jLv4288cj5qG8IXU3Ie2zKj56xgXgZrNqOURhKGfR/GE6nzfNb7OMaxo=

A saída é o sinal Z e deve ser obtida dos decisores superior e inferior.

Captura de tela


waaa ... primeira vez que eu ver uma resposta factorio em xD PPCG
V. Courtois


6

Geléia , 8 7 bytes

Vf96SạP

A entrada é como uma matriz de dois números inteiros: primeiro o operando direito, depois o esquerdo.

Experimente online!

Como funciona

Vf96SạP  Main link. Argument: [b, a]

V        Cast [b, a] to string, then eval the resulting string.
         For [b, a] = [9, 6], this yields 96.
 f96     Filter with 96, yielding [96] if V returned 96, [] otherwise.
    S    Take the sum, yielding either 96 or 0.
      P  Compute the product of [b, a], yielding ba = ab.
     ạ   Compute the absolute difference of the results to both sides.
         When the sum is 0, this simply yields the product.
         However, when [b, a] = [9, 6], this yields 96 - 54 = 42.

Isso tem -1 grau de liberdade. Como essas coincidências ocorrem até você?
Lirtosiast 29/11

5

Fatorio, 581 bytes, 3 combinadores com 4 conexões

Cadeia de projeto (0.16.36):

0eNqllNtu4jAQht9lLldmldNCFWkvto/RCkUhGWAkYkfOGDVCefeOnV1Km7ACemPJ9vibf04+webgsLWkGfITUGV0B/nrCTra6fLgz7hvEXIgxgYU6LLxO2/HpeZFZZoN6ZKNhUEB6RrfII+HtQLUTEw44sKmL7RrNmjF4AyqsaIa7SVHQWs6eWq0dy+46OcvBT3ki1hc1GSxGi8T5XWwNYdig/vySPJYXvxFFnJXB0znT7dkOy4mYR3JspOTs6DRYoFHtD3vSe98XP/CFZ9xtsqe0mW29KdNW9qgOYffgjCOW3eHk+eR3fai1WkuttY0BWlhQM7W4TC61mPAIYzYLxbry6yS7FKxJFs54rANFdhZRP3VMBnWQk08ZvZ+ChpExqSCyX9bYVLCRfxRwbmabenAaK+03rX0/RnT5z7VJbroQnUH7HkGlq7OsDFtc8WYzWJ8WxbTs4rSEu8bZKpuGoXopkn4gH5vGEKiO/SMO5vbtCgDEjTCjwcm5AWGO4ZgknX16Tq7OhRfHiZXypU91PTRd6ZYdIjo8PnmF3+1AvmfuuBq+bRKYmnWKM2G4R1hAPnz

O combinador constante inferior esquerdo deve ser definido como saída A e B como entrada. A saída é o sinal Z do combinador aritmético inferior direito.

insira a descrição da imagem aqui

Top left: 2147483640 A, 2147483637 B
Top right: If everything = 2147483646 output B, input count
Bottom left: (input) A, (input) B
Bottom right: A * B -> Z

5

MATL , 11 bytes

[BE]=?42}Gp

Entrada é uma matriz com os dois números.

Experimente online!

Explicação

[BE]    % Push array [6, 9]
=       % Implicit input: array of two numbers. Compare with [6, 9] element-wise
?       % If the two entries are true
  42    %   Push 42
}       % Else
  G     %   Push input
  p     %   Product of array
        % Implicit end. Implicit display

4

GW-BASIC , 55 bytes

1INPUT A:INPUT B
2IF A=6THEN IF B=9THEN ?"42":END
3?A*B

Resultado:

resultado

A primeira máquina no pcjs possui o IBM BASIC, que é praticamente a mesma coisa. Para testar isso, vá até lá, bata Runna máquina, pressione Enter- Entere digite BASICApara entrar no modo BÁSICO. Em seguida, digite o código-fonte (ele será impresso automaticamente para você), digite RUN, digite dois números inteiros e pronto!


3
Tem certeza de que o número de bytes está correto? O GW-BASIC usa uma codificação na qual algumas palavras, como INPUT, são codificadas em menos bytes do que os caracteres que as compõem sugerem. A contagem, portanto, parece alta para mim.

@ ais523 Bem, eu passei por isso wce consegui 55 ... colado no meu emulador e tinha o comportamento esperado.
MD XF

3
Certo, o que quero dizer é que você provavelmente está pontuando mais alto do que o necessário. Faça com que o GW-BASIC salve o arquivo e verifique o tamanho do arquivo resultante no disco; deve ser menor.

@ ais523 Salvo como OUT.BAS: i.stack.imgur.com/32eH1.png Bytecount é o valor médio.
MD XF

OK, eu não esperava isso, mas acho que é uma lavagem nessa situação. (Ou talvez haja mais de um formato de gravação?)


4

Verifique , 34 33 bytes

.:+&>#v
#>42#v#9-!\>6-!*?
 d* ##p

Cheque é o meu novo esolang. Ele usa uma combinação de semântica 2D e 1D.

Entrada são dois números passados ​​por argumentos de linha de comando.

Explicação

A pilha começa com os argumentos da linha de comando. Vamos chamar os argumentos ae b.

A primeira parte, .:+&essencialmente duplica a pilha, deixando-a como a, b, a, b. >envia 0 para a pilha (faz parte de um literal numérico preenchido por 9).

#muda para semântica 2D e vredireciona o IP para baixo. O IP é executado imediatamente em um #, que volta à semântica 1D novamente.

9-!verifica se bé igual a 9 (subtraindo 9 e assumindo o NOT lógico). \>6-!depois verifica se aé igual a 6. A pilha agora contém a, b, 1, 1se e somente se b==9e a==6. Multiplicar com *leva o AND lógico desses dois valores, fornecendo a, b, 1se as entradas eram 6e 9, e a, b, 0caso contrário.

Depois disso, o IP é executado em um ?. Isso mudará para o modo 2D se o valor da pilha superior for diferente de zero e, caso contrário, continuará no modo 1D.

Se o valor da pilha superior foi 1, isso significa que os outros valores da pilha são 6e 9, então pressionamos 42 para a pilha com >42e, em seguida , passamos para o segundo #na última linha.

Se o valor da pilha superior for 0, a execução será movida para a próxima linha. dremove o 0(como ?não faz isso) e multiplicamos as duas entradas por *. A entrada ##e saída do modo 2D, sem fazer nada.

Os ramos agora se juntaram novamente. A pilha contém 6, 9, 1, 42ou a*b. pimprime o valor da pilha superior e o programa termina, descartando o restante da pilha.


Parece uma linguagem bacana!
Não uma árvore

3

JavaScript (ES6), 25 bytes

x=>y=>[x*y,42][x==6&y==9]

3

Python 3 , 36 33 bytes

lambda x,y:42if x==6==y-3else x*y

Experimente online!


1
Versão alternativa, mesmo tamanho: lambda x:x[0]*x[1]if x!=(6,9)else 42. A única diferença é o tipo de entrada.
musicman523

Nevermind - sua versão editada é mais curto :)
musicman523

O código que você postou não funciona, então mudei para a versão de trabalho no TIO ao qual você vinculou.
ETHproductions

Funciona para mim: Em [1]: f = lambda x, y: 42if 6 == x == y-3else x * y Em [2]: f (6,9) Fora [2]: 42 Em [3 ]: f (9,6) Fora [3]: 54 @ETHproductions
Martmists

@Martmists Você estava faltando um espaço, em seguida, porque o seu código eraf=lambda x,y:42if6==x==y-3else x*y
ETHproductions

3

APL (Dyalog) , 10 bytes

×-12×6 9≡,

Experimente online!

× o produto (dos argumentos)

- menos

12× doze vezes

6 9≡ se (6,9) é idêntico a

, a concatenação (dos argumentos)


Oh wow eu só vi isso e minha resposta J é exatamente o mesmo como este: / exceto um byte mais
Conor O'Brien

@ ConorO'Brien Faz sentido. J e APL tácito são basicamente equivalentes, exceto pelas primitivas de vários caracteres de J (e necessitando de Cap para um final no topo).
Adám 5/17/17

3

R, 41 eu acho que não sei contar bytes sou novo: D

function(a,b){

if(a==6&b==9){42} else {a*b}

}

Defino uma função cujos argumentos são aeb nesta ordem . Se a é igual a 6 eb é igual a 9, retorna 42; caso contrário, a vezes b


Bem vindo ao site! :)
DJMcMayhem

Bem vinda. Leve em consideração que novas linhas e espaços também contam. No seu caso, se você remover novas linhas e espaços (que você pode) É apenas 41.
Masclins

1
Você pode cortar dois bytes usandoifelse(a==6&b==9,42,a*b)
Masclins

Você pode reduzir a coisa toda para 33 bytes como function(a,b)`if`(a-6|b-9,a*b,42).
rturnbull

Isso é apenas 41 bytes depois que você remove o espaço em branco desnecessário; até então, são 47 bytes.
Pavel

3

SPL , 356 bytes

a.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]Ajax:Listen to your heart!Puck:Listen to your heart!Are you as big as the sum of a big big big cat and a cat?If so, am I as big as the sum of a big big cat and a big cat?If so, you are as big as the product of I and the sum of I and a cat.If not, you are as big as the product of you and I.Open your heart

Com novas linhas e espaços:

a.                       *Title*
Ajax,.                   *Declare variable Ajax*
Puck,.                   *Declare variable Puck*
Act I:.
Scene I:.
[Enter Ajax and Puck]
Ajax: Listen to your heart!                  *Set Puck's value to user input*
Puck: Listen to your heart!                  *Set Ajax's value to user input*
      Are you as big as the sum of a big 
       big big cat and a cat?                *Is Ajax=9?* 
      If so, am I as big as the sum of a 
       big big cat and a big cat?            *Is Puck=6?* 
      If so, you are as big as the product 
       of I and the sum of I and a cat.      *If so, set Ajax=42* 
      If not, you are as big as the product 
       of you and I.                         *If not set Ajax=(Ajax)(Puck)*
      Open your heart                        *Print Ajax's value*


3

ML padrão (MLton) , 22 20 bytes

Guardado 2 bytes graças a @Laikoni!

fun$6 $9=42| $x y=x*y

Experimente online!

Esse é o tipo de coisa para a qual o SML se destina, e é por isso que ele vence shortC e Python.

A versão antiga parecia muito melhor. : P



@Laikoni Uau, eu não tinha ideia de que você poderia usar $como identificador! Por que isso não é compilado se você remove o espaço entre |e $?
precisa

O SML distingue identificadores alfanuméricos e simbólicos , o que pode ser bastante útil para jogar golfe. |$é analisado como um único identificador simbólico, para que tudo quebre. Planejo escrever uma pergunta sobre dicas para o SML em breve e adicionar uma resposta sobre esses dois tipos de identificadores.
Laikoni

2

Pitão, 12 bytes

-*FQ*12q(6 9

Experimente online

Explicação

 -*FQ*12q(6 9
  *FQ             Take the product
        q(6 9)Q   Check if the (implicit) input is (6, 9)
 -   *12          If so, subtract 12

Solução inteligente. Eu tentei com declarações ternárias em 15:AQ?&q6Gq9G42*GH
Tornado547 14/12


2

Gelatina , 10 bytes

⁼6,9ȧ42ȯ⁸P

Um link monádico com uma lista dos dois números.

Experimente online!

Quão?

⁼6,9ȧ42ȯ⁸P - Link: list of numbers [a,b]
 6,9       - 6 paired with 9, [6,9]
⁼          - equals? (non-vectorising) (1 or 0)
     42    - literal answer, 42
    ȧ      - logical and               (42 or 0)
        ⁸  - link's left argument, [a,b]
       ȯ   - logical or                (42 or [a,b])
         P - product                   (42 or a*b)

Você poderia ter usado ?, como eu fiz. ;)
Erik the Outgolfer,

Ah, porque ,é especial porque faz parte do padrão regex literal; portanto, 6,9é analisado como um único token e o rápido $pode combiná-lo . Você raciocina isso ou apenas tenta e percebe que funcionou?
Jonathan Allan

1
Eu raciocinei isso.
Erik the Outgolfer


2

SILOS , 81 67 bytes

readIO
J=i
readIO
a=(J-6)^2+(i-9)^2
a/a
a-1
a*12
x=J*i+a
printInt x

Experimente online!

Em certo sentido, a adição funciona como uma porta NAND interessante no SILOS.

-14 bytes graças a @Leaky Nun

Essencialmente, criamos um número "a" que é 0 (falso) se j é 6 ei = 9, então o dividimos por si só, subtraímos um e multiplicamos por 12 para adicionar ao nosso produto.

Se "a" foi 1 após subtrair um e multiplicar, ele se torna um não operacional, no entanto, quando a é 0, 0/0 gera silenciosamente um erro (que é capturado automaticamente) a torna-se 0 e depois se torna -1 e acabamos subtraindo 12 do nosso produto.




@LeakyNun ooh, isso é inteligente.
Rohan Jhunjhunwala

Na verdade, 0/0torna-se 0.
Leaky Nun

@LeakyNun, pretendia dizer, se torna 0 e depois diminui. Fixação.
Rohan Jhunjhunwala


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.