Imprima una tabla de multiplicación física


40

Los rectángulos tienen esta buena propiedad: ¡un rectángulo norte×metro consta de exactamente norte×metro caracteres!

Una propiedad más interesante es que los rectángulos se pueden alinear muy bien en una tabla de multiplicar, por ejemplo, una tabla 3×3 :

# ## ###

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

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

Su desafío es, dado un número norte ( norte>1 ), generar una tabla de multiplicación norte×norte formateada .

Reglas

  • Puede tomar la entrada arriba o abajo norte
  • Se aplican las reglas de E / S predeterminadas
  • Puede elegir cualquier carácter que no sea un espacio en blanco para representar los bloques; todos los demás caracteres (aunque las nuevas líneas son especiales) se consideran espacios en blanco. El carácter elegido puede ser diferente para diferentes entradas, pero debe ser el mismo en toda la entrada.
  • El resultado puede tener caracteres innecesarios, siempre que la tabla se alinee y no haya ocurrencias del carácter elegido que no formen parte de la salida requerida.
  • Los separadores deben tener 1 carácter de ancho / alto, y los rectángulos deben estar empaquetados (es decir, sin separadores entre sus caracteres)
  • Las líneas vacías pueden estar vacías, no se requiere relleno
  • El resultado puede ser una cadena, matriz, vector de líneas, matriz de matrices de caracteres o cualquier cosa 2Dish
  • Alternativamente, puede generar una matriz / vector-de-vectores / cualquier cosa 2Dish de números, pero el fondo y el primer plano deben ser 2 números distintos (que pueden variar de entrada a entrada, pero no a lo largo de una salida) y no pueden estar presentes otros números. También se permiten caracteres circundantes adicionales con este formato (aunque deben coincidir con el número de fondo)
  • Este es el , la respuesta más corta en bytes, por idioma, ¡gana!

Ejemplos

Para la entrada 2, una salida válida de ascii-art, con el carácter , es:

        ∙ ∙∙

Result: ∙ ∙∙.
        ∙ ∙∙

sí, el período está ahí solo para confundirte
Otra respuesta válida como una matriz de números, siendo 2 el número de fondo y 9 el primer 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]]

Un ejemplo de salida no válido sería

#  # #


#  # #

#  # #

ya que los rectángulos tienen separadores entre ellos.

Ejemplo de salidas para 4 4×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 tener filas / columnas adicionales de caracteres de fondo al frente, en lugar de al final de la tabla?
Kirill L.

@KirillL. claro, siempre y cuando las filas se
alineen

2
Nitpick: ∙ (U + 2219: BULLET OPERATOR) no está presente en el conjunto de caracteres ASCII. Tampoco es • (U + 2022: BULLET) o ⋅ (U + 22C5: OPERADOR DE PUNTO) o · (U + 00B7: PUNTO MEDIO). :)
Andreas Rejbrand

Respuestas:


10

Haskell , 43 bytes

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

Pruébalo en línea!

Un enfoque inteligente de Ørjan Johansen que genera 0 y 1, generando cada 10...00parte como la representación de cadena de una potencia 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]]

Pruébalo en línea!

Genera un patrón como [1,0,1,0,0,1,0,0,0,...], luego crea un 2D tomando los minpares. La rareza sin puntos ahorra 2 bytes sobre los más legibles:

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

Pruébalo en línea!


3
Esto se puede acortar con mi viejo truco de números triangulares: 43 bytes
Ørjan Johansen

1
Acabo de darme cuenta flip(map.max)=mapM max.
Ørjan Johansen

@ ØrjanJohansen Whoa, ¿cómo funciona eso? Creo que podrías publicar una respuesta propia :-)
xnor

Establecer la mónada a (->) b, entonces mapM :: (a -> b -> c) -> [a] -> b -> [c].
Ørjan Johansen

@xnor que olvidó cambiar flip(map.max)amapM max
solo ASCII

9

R , 56 54 43 36 30 bytes

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

Pruébalo en línea!

Toma la entrada uno arriba de n (entonces devuelve una matriz 3x3 para n=4 ). Devuelve una matriz de 1s (primer plano) y 0s (fondo) con una fila / columna adicional de ceros al frente.

Gracias a digEmAll por -7 bytes.


Gracias, por cierto, probablemente puede ser incluso 30, si la fila en blanco adicional puede estar al frente, en lugar de al final.
Kirill L.

Oh, pueden ellos? Me lo perdí !
digEmAll

6

JavaScript (ES6),  73 72  69 bytes

Devuelve una cadena compuesta de 1, espacios y saltos de línea.

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

Pruébalo en línea!


JavaScript (ES7),  87 83  82 bytes

Guardado 3 bytes gracias a @dzaima

Devuelve una matriz binaria, que se construye celda por celda.

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

Pruébalo en línea!

¿Cómo?

El ancho w de la matriz viene dado por:

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

(Nota: según lo permitido por las reglas de desafío, generamos una matriz de ancho w+1 ).

De manera similar, la celda ubicada en (X,Y) está vacía si la siguiente cuadrática admite una raíz entera para k=X o k=Y :

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

cuyo determinante es:

Δ=9-4 4(-2-2k)=17+8k


No estoy seguro de si puede guardar bytes, pero la solución de esa cuadrática sería , por lo que habría una raíz entera si-3±17+8k2 es impar, es decir,Δes un cuadrado perfecto impar. ΔΔ
Erik the Outgolfer

5

MATL, 14 10 bytes

:"@:Fv]g&*

Esta respuesta se usa 1para los bloques y0 para el fondo.

Pruébalo en MATL Online

Explicación

     % 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

Pruébalo en línea!

Editar: -2 bytes de ngn. +2 bytes porque las respuestas anteriores no eran válidas (con idea gracias a ngn y dzaima).

Explicación

∘.×⍨∊,\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.

La salida debería verse así:

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

1
podría tomar información para evitar el{ }
ngn

4

Jalea , 7 bytes

‘RÄṬ|þ`

Pruébalo en línea!

Emite una matriz de dígitos, utilizando 0 0 para los rectángulos y 1por el relleno entre ellos. El enlace TIO contiene un pie de página que formatea una matriz de dígitos de manera legible alineando las filas y columnas.

Explicación

‘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

El número en la celda (X,y) de la tabla resultante será 1 si alguno X o y es un número triangular, o 0 0de lo contrario (porque OR bit a bit funciona como OR lógico en 0 y 1). (Usamos R, rango de 1, porque Jelly usa indexación basada en 1, por lo que no tenemos que preocuparnos de que la columna 0 esté incorrectamente llena de 0; tenemos que agregar 1 a la entrada porque la matriz producida por se detiene en el más grande elemento dado en la entrada, por lo que debemos dibujar una línea en el lado derecho y en la parte inferior.) Los espacios entre los números triangulares son los enteros consecutivos, por lo que los bloques rectangulares formados por los espacios entre las líneas terminan como los tamaños solicitado por la pregunta; y el uso de una operación OR (en este caso, bit a bit) permite que las líneas se crucen entre sí correctamente.


¿Por qué es una wiki comunitaria? Si quieres renunciar al representante, puedes dárselo a Erik the Outgolfer
Jonathan Allan

1
CW todas mis respuestas (a menos que piense que podrían obtener una recompensa, en cuyo caso uso una cuenta temporal para ellas). Apuntar a una alta reputación normalmente significa empeorar el sitio (una vez volví a tapar todos los días durante una semana para demostrar que era posible; no fue particularmente difícil y, sin embargo, incluyó muchas preguntas / respuestas superficiales que no lo hicieron) Realmente contribuir mucho al sitio). Además, ganar reputación es principalmente negativo en la cuenta porque hace que el sitio lo fastidie para que haga trabajos de moderación; y ganar privilegios aumenta el riesgo de ganar insignias accidentalmente.
ais523

Además, en su mayoría no estoy de acuerdo con el concepto de propiedad de las publicaciones en SE (aunque principalmente con preguntas en lugar de respuestas, pero no puede CW una pregunta sin la ayuda del moderador). Un marcador CW dice muy claramente "si algo está mal aquí, siéntase libre de editarlo"; así que estaría aplicando un marcador CW a todo, incluso si no renunciara a la reputación. SE está destinado a ser parte wiki, después de todo, pero la gente no siempre lo usa como eso.
ais523

RE "aiming for a high reputation" if you don't want that then just post when you think it is meaningful and avoid what you term "shallow" q&a. Either you feel this answer does add something to the site, in which case post it without CW, or you think it is "shallow", in which case just don't post it. RE "I mostly disagree with the concept of ownership of posts on SE" - well you're simply on the wrong site then.
Jonathan Allan

2
Creo que la respuesta agrega algo al sitio, pero si no es CW, me siento obligado a publicar de una manera que me gane reputación en lugar de publicar lo que creo que sería interesante; cuando era un usuario de 20k, terminé realmente odiando el sitio y casi me alejé del golf de código en general por eso, así que eliminé mi cuenta como resultado. Cuando regresé, solía eliminar mi cuenta con cada respuesta que publicaba (creando una nueva para la siguiente respuesta), pero alguien más señaló que CWing cada respuesta tendría un efecto similar, por lo que hoy en día lo hago.
ais523

4

05AB1E, 9 bytes

Defines a program fNatList[List[Nat]].

Code:

$L×0ýSDδ*

Uses the 05AB1E-encoding. Try it online! or use the pretty-printed version.


Explanation:

$              # Push the number 1 and the input n
 L             # Create the list [1, 2, 3, ..., n]
  ×            # Vectorized string multiplication: 1 × [1, 2, 3, ..., n]
                 This would result in ["1", "11", "111", ..., "1" × n]
   0ý          # Join the resulting list with '0', resulting in "10110111011110111110..."
     S         # Split into single digits: [1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, ...]
      Dδ*      # Multiplication table with itself

4

C# (Visual C# Interactive Compiler), 96 95 bytes

-1 byte thanks to Embodiment of Ignorance

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

Try it online!


not sure if input via argument but output via stdout is allowed
ASCII-only

3
Mixing IO formats is fine
Jo King

1
¿Por qué no agregar el n--en la new stringsección?
Encarnación de la ignorancia


3

Python 2 , 67 bytes

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

Pruébalo en línea!

Imprime líneas en blanco para líneas vacías, lo que permite el desafío.

Misma longitud (con la entrada uno arriba n):

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

Pruébalo en línea!



3

Carbón , 18 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

   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) , 208155 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:"");}}

Pruébalo en línea!

Una versión muy revisada gracias a varias personas útiles (ver los comentarios).




1
@EmbodimentofIgnorance no es válido, no funciona para n> = 10 ...
Solo ASCII

1
@ ASCII-solo esto funciona: tio.run/…
Encarnación de la ignorancia

2
@Stackstuck Sí. Un programa puede finalizar bloqueándose
solo 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:"");}

Puerto de respuesta C # .NET de @ ASCII-only .

Pruébalo en línea.

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)

Es Java 11, no 8, debido al repeatmétodo.
Olivier Grégoire

@ OlivierGrégoire Vaya. Corregido
Kevin Cruijssen

Sin embargo, ¿es aceptable tener una lambda que arroje una excepción? Pensé que estaba bien para un programa completo, pero no para funciones / excepciones
Olivier Grégoire

@ OlivierGrégoire Mientras siga produciendo el resultado esperado, no veo por qué no tbh.
Kevin Cruijssen

1
Esto está vinculado a esta discusión . La respuesta parece ser si se aceptan REPL (que no son por defecto), entonces está bien imprimir en stderr o lanzar una excepción, pero si no se acepta REPL, entonces no se permiten std / excepción.
Olivier Grégoire

2

APL + WIN, 29 bytes

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

Explicación:

(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 

Ejemplo:

⎕:
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}}

Pruébalo en línea!

¿Cómo?

Primero, crea la primera línea, luego itera a través de sus caracteres. Imprima la línea completa si el carácter es '#'; de lo contrario, imprima el carácter único (que es un espacio)


2

Brain-Flak , 170 bytes

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

Pruébalo en línea!


2

Perl 6 , 35 33 bytes

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

Pruébalo en línea!

Llamable anónimo que toma un número e imprime la tabla de multiplicar con * s con una nueva línea final.

Explicación:

{                             }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

Devuelve una matriz de números.

Pruébalo en línea!

Variantes de fcon el mismo número de bytes:

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

¿Ayudan la fila 0 y la columna?
dfeuer

1
@dfeuer: sí, guardan un byte. Vea la primera versión de mi respuesta.
nimi


1

MathGolf , 20 bytes

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

Pruébalo en línea!

MathGolf realmente necesita más funcionalidad para dividir listas y crear listas 2D.

Explicación

╒                      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)
}
.->->

Pruébalo en línea!

Lo bueno es que las reglas permiten el exceso de caracteres.

Editar: +1: Espaciado fijo. Además, muestre usando @ (que no necesita escapar) en lugar de # (que sí)

Editar: -1: Al parecer, esa solución también significaba que ya no necesitaba un período final para forzar una nueva línea en las líneas no vacías. Ordenado.


Ohh, en realidad ni siquiera me di cuenta de esos espacios. Veré si puedo hacer algo al respecto ...
Sara J

1

C ++, 170 156 bytes

Gracias 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

Salida gráfica La entrada esN-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")}

1
.join(' ')no hace nada, '#'puede ser \*en su lugar, las cadenas de nueva línea pueden usar nuevas líneas literales, ambas l.map(str x*)pueden ser (str Xx l)en su lugar. 38 bytes
Jo King

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.