Imprimir uma tabela de multiplicação física


40

Os retângulos têm essa propriedade legal - um retângulo consiste exatamente em caracteres!n×mn×m

Uma propriedade mais interessante é que os retângulos podem ser alinhados de maneira agradável em uma tabela de multiplicação - por exemplo, uma tabela :3×3

# ## ###

# ## ###
# ## ###

# ## ###
# ## ###
# ## ###

Seu desafio é, dado um número ( ), gerar uma tabela de multiplicação formatada .nn>1n×n

Regras

  • Você pode inserir uma entrada acima ou abaixo den
  • Regras de E / S padrão aplicáveis
  • Você pode escolher qualquer caractere que não seja um espaço em branco para representar os blocos; todos os outros caracteres (embora as novas linhas sejam especiais) são considerados espaços em branco. O caractere escolhido pode ser diferente para entradas diferentes, mas deve ser o mesmo em toda a entrada
  • O resultado pode ter caracteres desnecessários, desde que a tabela se alinhe e não haja ocorrências do caractere escolhido que não façam parte da saída necessária
  • Os separadores devem ter 1 caractere de largura / altura e os retângulos devem ser compactados (ou seja, sem separadores entre os caracteres)
  • As linhas vazias podem estar vazias, o preenchimento não é obrigatório
  • O resultado pode ser uma sequência, matriz, vetor de linhas, matriz de matrizes de caracteres ou qualquer coisa 2Dish
  • Como alternativa, é possível gerar uma matriz / vetor de vetores / qualquer item 2D de números, mas o plano de fundo e o primeiro plano devem ser 2 números distintos (que podem variar de entrada para entrada, mas não em toda a saída) e nenhum outro número pode estar presente. Caracteres circundantes extras também são permitidos com este formato (embora eles devam corresponder ao número do plano de fundo)
  • Isso é , a resposta mais curta em bytes, por idioma, vence!

Exemplos

Para a entrada 2, uma saída ascii-art válida, com o caractere , é:

        ∙ ∙∙

Result: ∙ ∙∙.
        ∙ ∙∙

sim, o período existe apenas para confundi-lo.
Outra resposta válida como uma matriz numérica, sendo 2 o número de segundo plano e 9 o primeiro plano:

[[9,2,9,9,2,2],
 [2,2,2,2,2,2],
 [9,2,9,9,2,2],
 [9,2,9,9,2,2]]

Um exemplo de saída inválido seria

#  # #


#  # #

#  # #

como os retângulos têm separadores entre eles.

Exemplo de saídas para :4×4

# ## ### ####

# ## ### ####
# ## ### ####

# ## ### ####
# ## ### ####
# ## ### ####

# ## ### ####
# ## ### ####
# ## ### ####
# ## ### ####


1 0 1 1 0 1 1 1 0 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 1 0 1 1 1 0 1 1 1 1
1 0 1 1 0 1 1 1 0 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 1 0 1 1 1 0 1 1 1 1
1 0 1 1 0 1 1 1 0 1 1 1 1
1 0 1 1 0 1 1 1 0 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 1 0 1 1 1 0 1 1 1 1
1 0 1 1 0 1 1 1 0 1 1 1 1
1 0 1 1 0 1 1 1 0 1 1 1 1
1 0 1 1 0 1 1 1 0 1 1 1 1

Podemos ter linhas / colunas extras de caracteres de segundo plano na frente, e não no final da tabela?
Kirill L.

@KirillL. claro, desde que as linhas
estejam

2
Nitpick: ∙ (U + 2219: BULLET OPERATOR) não está presente no conjunto de caracteres ASCII. Tampouco • (U + 2022: BULLET) ou ⋅ (U + 22C5: OPERADOR DE PONTO) ou · (U + 00B7: PONTO MÉDIO). :)
Andreas Rejbrand 17/03

Respostas:


10

Haskell , 43 bytes

f n=map=<<flip(map.max)$show.(10^)=<<[1..n]

Experimente online!

Uma abordagem inteligente de Ørjan Johansen gerando zeros e zeros, gerando cada 10...00parte como a representação de uma potência de 10.

111111111
101001000
111111111
101001000
101001000
111111111
101001000
101001000
101001000

Haskell , 49 bytes

f n=map=<<flip(map.max)$[0^i|x<-[1..n],i<-[0..x]]

Experimente online!

Gera um padrão como [1,0,1,0,0,1,0,0,0,...], em seguida, cria um 2D tirando os minpares. A estranheza sem ponto salva 2 bytes sobre os mais legíveis:

f n|l<-do x<-[1..n];0:(1<$[1..x])=[[a*b|a<-l]|b<-l]

Experimente online!


3
Isso pode ser abreviado com meu antigo truque numérico triangular: 43 bytes
Ørjan Johansen

11
Apenas percebi flip(map.max)=mapM max.
Ørjan Johansen 18/03

@ ØrjanJohansen Whoa, como isso funciona? Eu acho que você poderia fazer com postar uma resposta de sua preferência :-)
xnor 18/03

Defina a mônada como (->) b, então mapM :: (a -> b -> c) -> [a] -> b -> [c].
Ørjan Johansen 18/03

@xnor você esqueceu de mudar flip(map.max)paramapM max
somente ASCII

9

R , 56 54 43 36 30 bytes

x=!!sequence(2:scan())-1;x%o%x

Experimente online!

nn=41s0s

Graças a digEmAll por -7 bytes.


Obrigado, BTW, provavelmente pode ser 30, se a linha em branco extra puder estar na frente, e não no final.
Kirill L.

Oh, eles podem? Eu senti falta disso !
digEmAll 16/03

6

JavaScript (ES6),  73 72  69 bytes

Retorna uma string composta de 1, espaços e feeds de linha.

n=>(g=s=>n-->0?g(s+`${p+=1} `):s[~n]?(+s[~n]?s:'')+`
`+g(s):'')(p='')

Experimente online!


JavaScript (ES7),  87 83  82 bytes

Guardado 3 bytes graças a @dzaima

Retorna uma matriz binária, que é construída célula por célula.

n=>[...Array(n*(n+3)/2)].map((_,y,a)=>a.map(h=(z,x)=>(17+8*x)**.5%1&&(z||h(1,y))))

Experimente online!

Quão?

w

w=Tn+n1=(n+12)+n1=n(n+3)21

(Nota: conforme permitido pelas regras de desafio, produzimos uma matriz de largura )w+1

Da mesma forma, a célula localizada em está vazia se o seguinte quadrático admitir uma raiz inteira para ou :(X,Y)k=Xk=Y

x(x+3)21k=0x2+3x22k=0

cujo determinante é:

Δ=94(22k)=17+8k


Não tenho certeza se ele pode salvar bytes, mas a solução desse quadrático seria ; portanto, haveria uma raiz inteira se for ímpar, ou seja , é um quadrado perfeito ímpar. 3±17+8k2 ΔΔΔ
Erik the Outgolfer

5

MATL, 14 10 bytes

:"@:Fv]g&*

Esta resposta usa 1para os blocos e 0para o fundo

Experimente no MATL Online

Explicação

     % Implicitly grab the input as an integer, N
     %   STACK: { 3 }
:    % Create an array from 1...N
     %   STACK: { [1, 2, 3] }
"    % For each element M in this array
  @: % Create an array from 1...M
     %   STACK (for 1st iteration): { [1] }
     %   STACK (for 2nd iteration): { [1; 0], [1, 2] }
     %   STACK (for 3rd iteration): { [1; 0; 1; 2; 0], [1, 2, 3] }
  F  % Push a zero to the stack
     %   STACK (for 1st iteration): { [1], 0 }
     %   STACK (for 2nd iteration): { [1; 0], [1, 2], 0 }
     %   STACK (for 3rd iteration): { [1; 0; 1; 2; 0], [1, 2, 3], 0 }
  v  % Vertically concatenate everything on the stack
     %   STACK (for 1st iteration): { [1; 0] }
     %   STACK (for 2nd iteration): { [1; 0; 1; 2; 0] }
     %   STACK (for 3rd iteration): { [1; 0; 1; 2; 0; 1; 2; 3; 0] }
] 
g    % Convert everything to be boolean (turns all non-zeros to 1)
     %   STACK: { [1; 0; 1; 1; 0; 1; 1; 1; 0] }
&*   % Perform element-wise multiplication to expand this array out into the 2D grid
     % Implicitly display the result


4

APL (Dyalog Unicode) , 12 10 12 bytes SBCS

∘.×⍨∊,\0,⎕⍴1

Experimente online!

Editar: -2 bytes de ngn. +2 bytes porque as respostas anteriores eram inválidas (com ideia graças a ngn e dzaima).

Explicação

∘.×⍨∊,\0,⎕⍴1

             Take input.
           1  An array of 1s of length our input. Example: 1 1 1
       0,      Prepend a 0. Example: 0 1 1 1
     ,\        Take all the prefixes and concatenate them. Example: 0  0 1  0 1 1  0 1 1 1
              Flatten the list. Example: 0 0 1 0 1 1 0 1 1 1
∘.×⍨           Turn the above list into a multiplication table of 0s and 1s
               by multiplying the list with itself.

A saída deve se parecer com:

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 0 1 1 0 1 1 1
0 0 0 0 0 0 0 0 0 0
0 0 1 0 1 1 0 1 1 1
0 0 1 0 1 1 0 1 1 1
0 0 0 0 0 0 0 0 0 0
0 0 1 0 1 1 0 1 1 1
0 0 1 0 1 1 0 1 1 1
0 0 1 0 1 1 0 1 1 1

11
você poderia tomar entrada como para evitar o{ }
NGN

4

Geléia , 7 bytes

‘RÄṬ|þ`

Experimente online!

Gera uma matriz de dígitos, usando para os retângulos e para o preenchimento entre eles. O link TIO contém um rodapé que formata uma matriz de dígitos de maneira legível por humanos, alinhando as linhas e colunas.01

Explicação

‘RÄṬ|þ`
 R       Take a range from 1 to
‘          {the input} plus 1
  Ä      Cumulative sum; produces the first {input}+1 triangular numbers
   Ṭ     Produce an array with 1s at those indexes, 0s at other indexes
     þ   Create a table of {the array}
      `    with itself
    |      using bitwise OR

O número na célula da tabela resultante será se ou for um número triangular ou caso contrário (porque OR bit a bit funciona como OR lógico em 0 e 1). (Usamos o intervalo 1, porque o Jelly usa a indexação baseada em 1, para que não tenhamos que nos preocupar com a coluna 0 incorretamente cheia de 0s; precisamos adicionar 1 à entrada porque o array produzido por(x,y)1xy0Rpara no maior elemento dado na entrada, portanto, precisamos desenhar uma linha no lado direito e na parte inferior.) As lacunas entre os números triangulares são os números inteiros consecutivos; portanto, os blocos retangulares formados pelas lacunas entre as linhas terminam. conforme os tamanhos solicitados pela pergunta; e o uso de uma operação OR (neste caso, bit a bit) permite que as linhas se cruzem corretamente.


Por que este é um wiki da comunidade ?! Se você quiser renunciar ao representante, você pode apenas dar a Erik, o Outgolfer
Jonathan Allan

11
CW todas as minhas respostas (a menos que eu ache que elas podem receber uma recompensa, caso em que eu uso uma conta temporária para elas). Almejar uma reputação alta normalmente significa ter como objetivo piorar o site (uma vez eu repappei todos os dias por uma semana para provar que era possível; não era particularmente difícil, e ainda envolvia muitas perguntas / respostas superficiais que não ' realmente contribui muito para o site). Além disso, ganhar reputação é principalmente negativo na conta, pois faz com que o site o leve a fazer um trabalho de moderação; e ganhar privilégios aumenta o risco de ganhar emblemas acidentalmente.
ais523 16/03

Além disso, eu discordo principalmente do conceito de propriedade de postagens no SE (embora principalmente com perguntas e não com respostas, mas você não pode responder uma pergunta sem a ajuda do moderador). Um marcador da CW diz muito claramente "se algo estiver errado aqui, fique à vontade para editá-lo"; então eu aplicaria um marcador CW em tudo, mesmo que não renunciasse à reputação. Afinal, o SE é parte do wiki, mas as pessoas nem sempre o usam como esse.
ais523 16/03

RE "buscando uma reputação alta", se você não quiser, basta postar quando achar que é significativo e evitar o que você chama de perguntas e respostas "rasas". Ou você acha que essa resposta adiciona algo ao site; nesse caso, publique-o sem a CW, ou você acha que é "superficial"; nesse caso, apenas não o publique. RE "Eu discordo principalmente do conceito de propriedade de postagens no SE" - então você está simplesmente no site errado.
Jonathan Allan

2
Acho que a resposta adiciona algo ao site, mas, se não for da CW, me sinto obrigado a postar de uma maneira que me ganhe reputação, em vez de postar o que acho interessante; quando eu era um usuário de 20k, acabei odiando o site e quase me afastei do código golf em geral por causa disso, então excluí minha conta como resultado. Quando voltei, costumava excluir minha conta com todas as respostas que publicava (criando uma nova para a próxima resposta), mas alguém apontou que o CWing de todas as respostas teria um efeito semelhante, então hoje faço isso.
ais523 16/03

4

05AB1E , 9 bytes

Define um programa .fNatList[List[Nat]]

Código:

$L×0ýSDδ*

Usa a codificação 05AB1E . Experimente online! ou use a versão impressa bonita .


Explicação:

$ # Pressione o número 1 e a entrada n 
 L # Crie a lista [1, 2, 3, ..., n ]
  × # Multiplicação de cadeias vetorizadas: 1 × [1, 2, 3, ..., n ]
                 Isso resultaria em ["1", "11", "111", ..., "1" × n ]
   0ý # Entre na lista resultante com '0', resultando em "10110111011110111110 ..."
     S # Dividir em dígitos únicos: [1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, ...]
      Dδ * # Tabela de multiplicação consigo mesma

4

C # (compilador interativo do Visual C #) , 96 95 bytes

-1 byte graças à Modalidade de Ignorância

n=>{var l="";for(;n>0;)l=new string('#',n--)+' '+l;for(;n<l.Length;)WriteLine(l[n++]>32?l:"");}

Experimente online!


não tenho certeza se a entrada via argumento, mas a saída via stdout é permitida
somente ASCII

3
Misturar formatos de entrada / saída é bom
Jo King

11
Por que não adicionar n--na new stringseção?
Modalidade de ignorância


3

Python 2 , 67 bytes

s='';n=input()
while n:s='#'*n+' '+s;n-=1
for c in s:print(c>' ')*s

Experimente online!

Imprime linhas em branco para linhas vazias, que o desafio permite.

Mesmo comprimento (com a entrada um acima n):

r=range(input())
for n in r:print(' '.join(i*'#'for i in r)+'\n')*n

Experimente online!



3

Carvão , 18 bytes

≔⪫EN×#⊕ι θEθ⭆θ⌊⟦ιλ

Experimente online! Link é a versão detalhada do código. Explicação:

   N                Input number
  E                 Map over implicit range
       ι            Current value
      ⊕             Incremented
    ×               Repetitions of
     #              Literal `#`
 ⪫                  Join with spaces
≔        θ          Assign to variable
           θ        Retrieve variable
          E         Map over characters
             θ      Retrieve variable
            ⭆      Replace characters with
              ⌊     Minimum of
               ⟦    List of
                ι   Row character
                 λ  Column character
                    Implicitly print each row on its own line

3

C # (.NET Core) , 208 155 bytes

class M{static void Main(string[]a){int i=int.Parse(a[0]);var l="";for(;i>0;)l=new string('#',i--)+' '+l;for(;;)System.Console.WriteLine(l[i++]>32?l:"");}}

Experimente online!

Uma versão muito revisada, graças a várias pessoas úteis (veja os comentários).




11
@EmbodimentofIgnorance inválido, não funciona para n> = 10 ...
ASCII-only

11
@ Somente ASCII funciona: tio.run/…
Modalidade de ignorância

2
@Stackstuck Sim. É permitido que um programa seja encerrado travando
somente ASCII


3

Java 11, 109 bytes

n->{var l="";for(;n>0;)l="x".repeat(n--)+" "+l;for(;n<l.length();)System.out.println(l.charAt(n++)>32?l:"");}

Porta da resposta C # .NET do @ ASCII-only .

Experimente online.

n->{                       // Method with integer parameter and no return-type
  var l="";                //  Line-String, starting empty
  for(;n>0;)               //  Loop until `n` is 0:
    l=...+l;               //   Prepend to `l`:
       "x".repeat(n--)+" " //    Repeat "x" `n` amount of times, appended with a space
                           //    And decrease `n` by 1 afterwards with `n--`
    for(;n<l.length();)    //   Inner loop as long as `n` is smaller than the length of `l`:
      System.out.println(  //    Print with trailing newline:
        l.charAt(n++)>32?  //     If the `n`'th character of the line-String is NOT a space:
                           //     And increase `n` by 1 afterwards with `n++`
         l                 //      Print the line-String
        :                  //     Else:
         "");}             //      Print nothing (so only the newlines)

É Java 11, não 8, por causa do repeatmétodo.
Olivier Grégoire

@ OlivierGrégoire Ops .. Resolvido
Kevin Cruijssen 18/03

No entanto, é aceitável ter um lambda que lança uma exceção? Eu pensei que estava tudo bem para um programa completo, mas não para funções / exceções
Olivier Grégoire

@ OlivierGrégoire Contanto que ele ainda produz o resultado esperado, não vejo por que não tbh.
Kevin Cruijssen 18/03

11
Isso está vinculado a esta discussão . A resposta parece ser se o REPL é aceito (o que não é por padrão), então é bom imprimir no stderr ou lançar uma exceção, mas se o REPL não for aceito, nenhum std / exceção será permitido.
Olivier Grégoire

2

APL + WIN, 29 bytes

m/⍉(m←¯1↓∊(⍳n),¨¯1)/(n,n←⎕)⍴1

Explicação:

(n,n←⎕)⍴1 prompt for integer n and create a nxn matrix of 1s

(m←¯1↓∊(⍳n) replicate the columns by 1,2,.....n and insert 0s between each replication

m/⍉ repeat replication and 0 insertion for the rows from above 

Exemplo:

⎕:
3
1 0 1 1 0 1 1 1
0 0 0 0 0 0 0 0
1 0 1 1 0 1 1 1
1 0 1 1 0 1 1 1
0 0 0 0 0 0 0 0
1 0 1 1 0 1 1 1
1 0 1 1 0 1 1 1
1 0 1 1 0 1 1 1



2

Ruby , 55 bytes

->n{(s=(1..n).map{|x|?#*x}*' ').chars.map{|c|c<?!?c:s}}

Experimente online!

Quão?

Primeiro, crie a primeira linha e, em seguida, itere através de seus caracteres. Imprima a linha inteira se o caractere for '#'; caso contrário, imprima o caractere único (que é um espaço)



2

Perl 6 , 35 33 bytes

{((\*Xx$_+1)~"
"Xx$_+1)>>.say}o^*

Experimente online!

Chamada anônima que pega um número e imprime a tabela de multiplicação com *s com uma nova linha à direita.

Explicação:

{                             }o^* # Change the input to the range 0..n-1
  (\*Xx$_+1)    # Cross string multiply '*' by all of range 1..n
                # This creates the string "* ** *** ****" etc.
            ~"\n"                 # Append a newline
                 Xx$_+1           # Cross string multiply again
 (                     )>>.say    # And print all the lines

1

Haskell, 69 68 bytes

(a#b)0=[]
(a#b)n=(a#b)(n-1)++b:(a<$[1..n])
f n=((1#0)n#(0<$(1#0)n))n

Retorna uma matriz de números.

Experimente online!

Variantes fcom a mesma contagem de bytes:

f n=((#)<*>(0<$)$(1#0)n)n
f n|l<-(1#0)n=(l#(0<$l))n

A linha e coluna 0 ajudam?
dfeuer 16/03

11
@fefe: sim, eles salvam um byte. Veja a primeira versão da minha resposta.
nimi 16/03

1

Stax , 7 bytes

é╫▐§╘←╘

Execute e depure

O personagem escolhido é backtick. (Como você codifica o formato na remarcação?)

Isso significa ae bé considerado espaço em branco estranho.


1

MathGolf , 20 bytes

╒ÉÄ10;]h\■mÆε*╣¡§y╠n

Experimente online!

O MathGolf realmente precisa de mais funcionalidades para dividir listas e criar listas 2D.

Explicação

╒                      range(1,n+1)
 É                     start block of length 3
  Ä                    start block of length 1
   1                   push 1
    0                  push 0
     ;                 discard TOS
      ]                end array / wrap stack in array
                       the stack now contains the list [1, 0, 1, 1, 0, 1, 1, 1, 0, 1, ...]
       h               length of array/string without popping (used for splitting string)
        \              swap top elements
         ■             cartesian product with itself for lists, next collatz item for numbers
          m            explicit map
           Æ           start block of length 5
            ε*         reduce list by multiplication (logical AND)
              ╣¡       push the string " #"
                §      get character at index 0 or 1 based on logical AND value
                       block ends here, stack is now ['#',' ','#','#',' ','#',...]
                 y     join array without separator to string
                  ╠    pop a, b, push b/a (divides the string using the length of a single line)
                   n   join array of strings with newlines

1

Tinta , 151 152 151 bytes

VAR k=0
=t(n)
~k=n
-(u)
~n--
{n+1:->s(k-n)->u}->->
=r(c)
->g(c)->
{k-c:<>->r(c+1)}->->
=g(n)
{n>1:@<>->g(n-1)}@->->
=s(n)
{n:
->r(1)->
->s(n-1)
}
.->->

Experimente online!

Ainda bem que as regras permitem caracteres em excesso.

Editar: +1: espaçamento fixo. Além disso, exiba usando @ (que não precisa ser escapado) em vez de # (o que é necessário)

Edit: -1: Aparentemente, essa correção também significava que eu não precisava mais de um período à direita para forçar uma nova linha nas linhas não vazias. Arrumado.


Ah, na verdade eu nem percebi esses espaços. Vou ver se consigo fazer algo sobre eles ...
Sara J

1

C ++, 170 156 bytes

Graças a dzaima

#include<string>
using v=std::string;v f(int a){v s;for(int i=1;i<=a;++i,s+='\n')for(int k=0;k<i;++k,s+='\n')for(int j=1;j<=a;++j)s+=v(j,'#')+' ';return s;}


0

SmileBASIC, 83 77 bytes

Saída gráfica. Entrada éN-1

INPUT N
FOR J=0TO N
X=0FOR I=0TO N
GFILL X,Y,X+I,Y+J
X=X+I+2NEXT
Y=Y+J+2NEXT


0

Perl 6, 63 bytes

{(1..$_).map(((1..$_).map("#"x*).join(" ")~"\n")x*).join("\n")}

11
.join(' ')não faz nada, '#'pode ser \*, em vez disso, as seqüências de nova linha podem usar novas linhas literais, ambas l.map(str x*)podem ser (str Xx l). 38 bytes
Jo King

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.