Desafio bastante simples hoje:
Escreva um programa ou função que receba um número inteiro positivo N e imprima ou retorne uma lista classificada dos números exclusivos que aparecem na tabela de multiplicação cujos multiplicandos de linha e coluna variam de 1 a N, inclusive.
A lista pode ser classificada em ordem crescente (do menor para o maior) ou em ordem decrescente (do maior para o menor) e pode ser impressa em qualquer formato razoável.
O código mais curto em bytes vence!
Exemplo
Quando N = 4, a tabela de multiplicação se parece com:
1 2 3 4
-----------
1| 1 2 3 4
|
2| 2 4 6 8
|
3| 3 6 9 12
|
4| 4 8 12 16
Os números únicos na tabela são 1, 2, 3, 4, 6, 8, 9, 12, 16
. Eles já estão classificados, então
1, 2, 3, 4, 6, 8, 9, 12, 16
pode ser sua saída exata para N = 4. Mas, como a classificação pode ser revertida e há alguma margem de manobra na formatação, essas também seriam saídas válidas:
[16,12,9,8,6,4,3,2,1]
1
2
3
4
6
8
9
12
16
16 12 9 8 4 3 2 1
Casos de teste
N=1 -> [1]
N=2 -> [1, 2, 4]
N=3 -> [1, 2, 3, 4, 6, 9]
N=4 -> [1, 2, 3, 4, 6, 8, 9, 12, 16]
N=5 -> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 20, 25]
N=6 -> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 30, 36]
N=7 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 28, 30, 35, 36, 42, 49]
N=8 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 28, 30, 32, 35, 36, 40, 42, 48, 49, 56, 64]
N=9 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 54, 56, 63, 64, 72, 81]
N=10 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 50, 54, 56, 60, 63, 64, 70, 72, 80, 81, 90, 100]
N=11 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 36, 40, 42, 44, 45, 48, 49, 50, 54, 55, 56, 60, 63, 64, 66, 70, 72, 77, 80, 81, 88, 90, 99, 100, 110, 121]
N=12 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 36, 40, 42, 44, 45, 48, 49, 50, 54, 55, 56, 60, 63, 64, 66, 70, 72, 77, 80, 81, 84, 88, 90, 96, 99, 100, 108, 110, 120, 121, 132, 144]
fonte
Respostas:
Pitão, 8 bytes
Experimente online.
Explicação:
SQ
pega a entrada da lista avaliada (Q
) e faz uma lista[1, 2, ..., Q]
.^SQ2
leva consigo o produto cartesiano dessa lista - todas as combinações possíveis de produtos.*M
multiplica todos esses pares para formar todos os resultados possíveis na tabela de multiplicação e oS{
torna único e o classifica.fonte
M
. +1Python 2,
6151 bytesAgradecemos ao xnor por reduzir algumas sintaxes.
fonte
set(...)
pode ser apenas um conjunto de comp{...}
. Além disso, as funções são permitidas por padrão aqui, para que você possa escreverlambda n:...
.f=lambda n:n*[0]and sorted(set(range(n,n*n+n,n)+f(n-1)))
.APL,
1816 bytesEsta é uma função monádica sem nome. A saída está em ordem crescente.
Explicação:
Corrigido um problema e economizado 2 bytes graças a Thomas Kwa!
fonte
CJam,
1412 bytesVersão mais recente com melhorias propostas pelo @aditsu:
Esta é uma função anônima. Experimente online , com o código de entrada / saída necessário para testá-lo.
A @Martin propôs outra solução muito elegante (
{,:)_ff*:|$}
) com o mesmo comprimento. Eu usei o do aditsu porque era muito mais parecido com a minha solução original.A principal diferença para minha solução original é que isso mantém o
0
valor na sequência original, que economiza 2 bytes no início. Você pensaria que isso não ajudaria, porque você precisa remover o0
valor do resultado. Mas o núcleo da ideia do @ aditsu é0^
o final, que é uma diferença definida0
. Isso remove0
e, ao mesmo tempo, como é uma operação de conjunto, elimina elementos duplicados do conjunto de soluções. Como eu já precisava de 2 bytes para eliminar as duplicatas antes, a remoção0
é essencialmente gratuita.Explicação:
fonte
{2m*::)::*_&$}
,{)2m*::*_&$0-}
{,:)_ff*:|$}
{)2m*::*0^$}
Oitava, 22 bytes
fonte
Julia, 24 bytes
Esta é uma função anônima que aceita um número inteiro e retorna uma matriz inteira.
Ungolfed:
fonte
MATLAB, 24 bytes
fonte
zsh,
8656 bytesgraças a @Dennis por salvar 30 (!) bytes
Explicação / não destruído:
Isso não funciona no Bash porque o Bash não se expande
{1..$1}
- apenas o interpreta literalmente (portanto,a=5; echo {1..$a}
gera em{1..5}
vez de1 2 3 4 5
).fonte
Ruby,
5048 bytesUngolfed:
Usando loop aninhado para multiplicar cada número com qualquer outro número até n e, em seguida, classificando a matriz.
50 bytes
Uso:
fonte
R, 39 bytes
Isso lê um número inteiro de STDIN e grava uma lista delimitada por espaço em STDOUT.
Criamos a tabela de multiplicação como uma matriz usando
outer
, achatamos implicitamente em um vetor e classificamos usandosort
, selecionamos elementos exclusivos usandounique
e imprimimos o espaço delimitado usandocat
.fonte
Mathematica, 25 bytes
fonte
K, 17 bytes
Não há muito a dizer aqui. Classifique (
t@<t:
) os itens exclusivos (?
) do,/
autoproduto cartesiano multiplicado ( ) achatado ( ) (t*\:t:
1) de 1 até N (1+!
), inclusive .Em ação:
fonte
Haskell,
5554 bytesExemplo de uso:
f 4
->[1,2,3,4,6,8,9,12,16]
.nub
remove elementos duplicados de uma lista.Edit: @Zgarb encontrou um supérfluo
$
.fonte
J,
2120 bytesObrigado a @Zgarb por -1 byte!
Minha primeira resposta J! Dicas de golfe são apreciadas, se houver algo para jogar golfe.
Esta é uma função monádica; pegamos o produto externo pela multiplicação da lista
1..input
, achatamos, pegamos elementos exclusivos e classificamos.fonte
Kotlin, 70 bytes
Versão não destruída:
Teste com:
fonte
Shell + utilitários comuns, 41
Ou alternativamente:
Bash + coreutils, 48
Constrói uma expansão de braquete dentro de uma expansão aritmética:
\$[{1..n}*{1..n}]
expande para as expansões aritméticas$[1*1] $[1*2] ... $[1*n] ... $[n*n]
que são avaliadas e passadas paraprintf
, que imprimem uma por linha, às quais são canalizadassort
.O uso cuidadoso de cotações, escapa e
eval
garante que as expansões ocorram na ordem necessária.Ou alternativamente:
Pure Bash, 60
fonte
Pitão, 10
Experimente on-line ou execute um conjunto de testes
fonte
Minkolang 0.14 ,
252218 bytesLembrei-me de que implementei de maneira muito conveniente produtos cartesianos antes que essa pergunta fosse publicada !
Experimente aqui. (Saídas na ordem inversa.)
Explicação
fonte
JavaScript (ES6),
9290 bytesExplicação
Teste
fonte
Perl 6 , 27 bytes
Exemplo de uso:
fonte
Haskell, 51 bytes
Muito chato. Apenas filtra a lista
[1..n*n]
para os elementos do formulárioa*b
coma
eb
dentro[1..n]
. Usarfilter
fornece o mesmo comprimentoTentei por um tempo gerar a lista de produtos com algo mais inteligente
concatMap
oumapM
, mas só obtive resultados mais longos. Uma verificação mais sofisticada da associação chegou a 52 bytes, 1 byte mais, mas talvez possa ser reduzida.fonte
(*)<$>..<*>..
como esteJAVA - 86 bytes
Ungolfed
fonte
Pitão, 11 bytes
Isso é semelhante à resposta de Julia. Obrigado a @Maltysen
fonte
PHP,
74,7370bytesUngolfed:
Anterior:
while(($j=$i++)<$n)for(;$j++<$n;)$a[]=$i*$j;$a=array_unique($a);sort($a);
Não tem 100% de certeza do que fazer com a saída, mas
$a
contém uma matriz com os números correspondentes.$n
é o número geven via$_GET['n']
, comregister_globals=1
fonte
TeaScript ,
3735 caracteres; 40 bytesGuardado 2 bytes graças a @Downgoat
TeaScript é JavaScript para jogar golfe.
Experimente online!
Ungolfed e explicação
fonte
r
em vez deA.r
para as faixas de geraçãoC, 96 bytes
Isso imprime os números em ordem decrescente. As sugestões são bem-vindas, pois isso parece longe de ser o ideal.
fonte
JavaScript (ES6), 86 bytes
Procurando encurtá-lo (talvez tente aninhar loops).
fonte
Perl 5, 91 bytes
para ser executado passando o argumento na linha de comando. Faltam poucas declarações para executar com restrições e avisos.
fonte
Python,
124102 bytesMais pitônico!
fonte
l.append(i*j)
na mesma linha que o if condicional. Eu acho que acaba tendo 102 bytes no total.+=
vez deappend
.list(set(l))
não é garantido que seja resolvido.Perl 5, 67 bytes
fonte