Bem, embora esse desafio tenha sido um enorme sucesso, ele também foi muito trivial de resolver. Portanto, para quem procura mais desafios, criei uma sequência para esse desafio, na qual você deve contar agora o número de retângulos únicos . Confira!
Agora, para aqueles que procuram resolver este desafio, aqui está.
Bem, ainda não temos um desafio como esse, então aqui vamos nós.
Considere esta 3 x 3
grade de retângulos:
Quantos retângulos existem? Bem, contando visualmente, podemos ver que na verdade existem 36
retângulos, incluindo todo o próprio plano, que são mostrados no GIF animado abaixo:
A tarefa
A contagem de retângulos, como mostrado acima, é a tarefa. Em outras palavras, dado 2 inteiros maiores do que ou igual a 0
, m
e n
, onde m
representa a largura e n
representa a altura, a saída do número total de rectângulos em que m x n
grade de rectângulos.
Regras
O uso de quaisquer recursos internos que resolvem diretamente esse problema é explicitamente proibido.
Esse desafio não é encontrar a resposta mais curta, mas encontrar a resposta mais curta em todos os idiomas. Portanto, nenhuma resposta será aceita.
As brechas padrão são proibidas.
Casos de teste
Apresentado no formato Array of Integers Input -> Integer Output
:
[0,0] -> 0
[1,1] -> 1
[3,3] -> 36 (Visualized above)
[4,4] -> 100
[6,7] -> 588
Referências
Lembre-se, este é o código-golfe , portanto o código mais curto vence!
588
para o último caso de teste.Respostas:
Python, 22 bytes
A fórmula
m*n*(m+1)*(n+1)/4
é reduzida usando o complemento de bit~m=-(m+1)
, expressando(m+1)*(n+1)
como~m*~n
.Por que o número de retângulos
m*n*(m+1)*(n+1)/4
? Cada retângulo é especificado pela escolha de duas linhas horizontais (superior e inferior) e duas linhas verticais (esquerda e direita). Existemm+1
linhas horizontais, das quais escolhemos um subconjunto de duas linhas distintas. Portanto, o número de opções échoose(m+1,2)
, qual ém*(m+1)/2
. Multiplicar pelasn*(n+1)/2
opções de linhas verticais fornece o resultado.fonte
Gelatina , 4 bytes
Experimente online!
Como alternativa, também 4 bytes
Experimente online!
fonte
בHP
e /‘c2P
e talvez outras alternativas de 4 bytes.nth
emth
.R
converte cada número no índice 1 com base:[1, 2, ..., n]
.S
é a soma e€
meio 'each' para que cada lista é somados, dando uma lista como:[nth triangle number, mth triangle number]
. Em seguida,P
pega o produto dessa lista, que fornece o resultado desejado.Javascript (ES6), 17 bytes
Um garfo desta resposta .
fonte
Mathematica, 15 bytes
Esta é uma função sem nome, recebendo dois argumentos inteiros e retornando o número de retângulos.
Explicação
A implementação é basicamente uma forma muito eficiente do produto dos dois números triangulares. Pode valer a pena ler a seção "Sequências de argumentos" neste post para obter detalhes, mas tentarei resumir a essência aqui.
##
expande para uma sequência de todos os argumentos. Isso é semelhante a splatting em outros idiomas. Por exemplo, se os argumentos forem3
e4
, então{1, 2, ##, 5}
você fornecerá{1, 2, 3, 4, 5}
. Mas isso não funciona apenas em listas, mas em qualquer expressão, por exemplof[1, 2, ##, 5]
, também seriaf[1, 2, 3, 4, 5]
.Isso fica interessante quando você combina
##
com os operadores. Todos os operadores no Mathematica são apenas mãos curtas para algumaf[...]
expressão semelhante (possivelmente aninhada). Por exemplo,a+b
éPlus[a, b]
ea-b
realmente representaPlus[a, Times[-1, b]]
. Agora, quando você combina##
com operadores, o que o Mathematica faz é expandir os operadores primeiro, tratando##
como um único operando e expandi-los apenas no final. Ao inserir##
nos lugares certos, podemos, portanto, usá-lo para multiplicar e adicionar os operandos.Vamos fazer isso para o código acima:
Expandindo-o para sua forma completa, obtemos o seguinte:
Vamos inserir os argumentos da função
a
eb
:E agora nós o convertemos novamente em notação matemática padrão:
Um pouco de reorganização mostra que este é o produto dos números triangulares:
Curiosidade: essa implementação é tão divertida que tem o mesmo comprimento que a embutida para calcular um único número triangular
PolygonalNumber
.fonte
C, 25 bytes
Versão purista (27):
Versão ISO-er (35):
fonte
Água-viva , 16 bytes
O formato de entrada é
[x y]
, a saída é apenas o resultado.Experimente online!
Solução alternativa, mesma contagem de bytes:
Explicação
Hora de dar a Jellyfish a introdução que merece! :)
Água-viva é a linguagem de Zgarb , baseada em seu desafio de sintaxe 2D . A semântica é amplamente inspirada em J, mas a sintaxe é uma obra de arte. Todas as funções são caracteres únicos e dispostas em uma grade. As funções recebem seus argumentos do próximo token ao sul e leste deles e retornam o resultado ao norte e oeste. Isso permite que você crie uma rede interessante de chamadas de função nas quais você reutiliza valores passando-os para várias funções de várias direções.
Se ignorarmos o fato de que alguns dos tokens no programa acima são operadores especiais (funções de nível superior), o programa acima seria escrito assim em uma linguagem sã:
Vamos analisar o código de baixo para cima. A entrada é alimentada pelo
i
, que, portanto, avalia como[x y]
.A
+
parte superior recebe essa entrada juntamente com o literal1
e, portanto, incrementa os dois elementos a serem fornecidos[(x+1) (y+1)]
(a maioria das operações é encadeada automaticamente por listas).O outro valor de
i
é enviado para a esquerda, mas asE
divisões são o argumento leste, norte e oeste. Isso significa que as entradas à direita*
são realmente[x y]
e,[(x+1) (y+1)]
portanto, isso é calculado[x*(x+1) y*(y+1)]
.O próximo
*
passo é realmente modificado pelo anterior,/
que o transforma em uma operação fold. Dobrar*
um par simplesmente o multiplica, de modo que conseguimosx*(x+1)*y*(y+1)
.Agora
%
é apenas uma divisão, então calculax*(x+1)*y*(y+1)/4
. Infelizmente, isso resulta em uma flutuação, por isso precisamos arredondá-la com o unário|
. Finalmente, esse valor é alimentado para op
qual imprime o resultado final.fonte
R,
4035 bytesBem, é hora de pular no fundo do poço! Aqui está o meu código R , inspirado na resposta @xnor:
EDIT : Nesta versão, R pedirá duas vezes entradas.
fonte
cat(prod(choose(scan()+1,2)))
tem 29 bytes.CJam,
1210 bytes2 bytes salvos graças a Martin.
Experimente online!
Este é um bloco que pega uma lista de 2 elementos da pilha e deixa a solução na pilha. Programa completo utilizável para testes:
riari+{_:)+:*4/}~
.Baseado na excelente solução python do xnor.
Explicação:
fonte
{_:~+:*4/}
~
CJam. Apenas use)
.Matlab,
2319 bytesImplementação da fórmula
m*n*(m+1)*(n+1)/4
Uso:
ans([m,n])
fonte
MATL , 6 bytes
Entrada é uma matriz do formulário
[m,n]
.Experimente online!
Explicação
Cálculo direto baseado na fórmula
m*(m+1)*n*(n+1)/4
.fonte
J, 8 bytes
Uso:
fonte
Java 7,
3938 bytesJava 8,
2625191817 bytesCom base na excelente resposta de @xnor . Vários bytes salvos graças a @DavidConrad . Experimente aqui.
Código de teste (Java 7):
Experimente aqui.
Saída:
fonte
return
ea->b->
é um byte menor que(a,b)->
.Function<Integer, Function<Integer, Integer>>
como parâmetro, ele não seria seguido por um ponto e vírgula.;
na única declaração J8 lambdas.return
.. Além disso, quase nunca programa em Java 8 (daí todas as minhas respostas em Java 7), mas como façoa->b->
para trabalhar? Aqui está o ideone para o caso atual.MathOperation.operation
a tomar apenas umint
, retornar umFunction<Integer, Integer>
, e quando você chamá-lo, você inicialmente passar apenas o primeiro parâmetro,a
e, em seguida, chamar.apply(b)
noFunction
. Você também precisa importarjava.util.function.Function
. Aqui está um ideone com as mudanças.Ruby, 22 bytes
Roubando o truque do @ xnor e fazendo um stabby-lambda:
Chamada de exemplo:
Ou como proc, também 22 bytes:
O que poderíamos chamar:
fonte
Labirinto ,
1311 bytesExperimente online!
Explicação
Isso também calcula o produto dos números triangulares como a maioria das respostas. O bloco 2x2 principal é um pequeno loop:
Na primeira iteração
*
não faz nada, de modo que a ordem real do loop é esta:O código restante é apenas linear:
O labirinto tenta executar
/
novamente, o que finaliza o programa devido a uma divisão por zero.fonte
Pyke, 6 bytes
Experimente aqui!
fonte
05AB1E, 4 bytes
Explicação
Usa a fórmula descrita em A096948
Recebe a entrada como [n, m] .
Experimente online
fonte
Pitão,
86 bytesDois bytes salvos graças ao @DenkerAffe.
A entrada é esperada como uma lista como
[m,n]
. Experimente aqui .Explicação:
fonte
F
vez de.*
e remover o,Q
pois ele é adicionado implicitamente.F
mas não conseguia descobrir como usá-lo e achei que precisava usá-lo.*
... Obrigado!C #, 19 bytes
Uma função anônima baseada na resposta do @ xnor.
fonte
Lua,
7463 bytesA função recebe a entrada como parâmetros numéricos.
Devido à maneira como Lua é implementada, essa é tecnicamente uma função, com variável args, que pode ser chamada envolvendo-a em uma instrução "function" ou carregando-a do código-fonte usando "loadstring"
fonte
Queijo Cheddar , 23 bytes
fonte
n*(n+1)
pode ser golfed paran^2+n
m->n->...
Brain-Flak ,
8480 bytesExperimente online!
Provavelmente muito abaixo do ideal, principalmente por causa da reutilização do código em relação aos números dos triângulos, mas pelo menos temos uma solução Brain-Flak que funciona.
Infelizmente, parece falhar fazendo um loop infinito com o
0 0
testcase, mas todos os outros funcionam bem.fonte
Convexo, 7 bytes
Eu sei que isso pode ser menor, só não consigo descobrir até agora ...
Experimente online!. Usa a codificação CP-1252.
fonte
APL (Dyalog) , 9 bytes
Experimente online!
fonte
Pyt , 3 bytes
Explicação:
Experimente online!
fonte