Stampa una tabella di moltiplicazione fisica


40

I rettangoli hanno questa bella proprietà: un rettangolo composto esattamente da caratteri!n×mn×m

Una proprietà .. più interessante è che i rettangoli possono essere ben allineati in una tabella di moltiplicazione, ad esempio una tabella :3×3

# ## ###

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

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

La tua sfida è, dato un numero ( ), produrre una tabella di moltiplicazione formattata .nn>1n×n

Regole

  • Puoi prendere l'ingresso sopra o sotton
  • Si applicano le regole I / O predefinite
  • Puoi scegliere qualsiasi carattere non bianco per rappresentare i blocchi; ogni altro personaggio (anche se le nuove linee sono speciali) è considerato spazio bianco. Il carattere scelto può essere diverso per input diversi, ma deve essere lo stesso per tutto l'input
  • Il risultato può avere caratteri non necessari, purché la tabella sia allineata e non vi siano occorrenze del carattere scelto che non fanno parte dell'output richiesto
  • I separatori devono avere 1 carattere in larghezza / altezza e i rettangoli devono essere impacchettati (ovvero non devono essere presenti separatori tra i loro caratteri)
  • Le righe vuote possono essere vuote, l'imbottitura non è richiesta
  • Il risultato può essere una stringa, una matrice, un vettore di linee, una matrice di matrici di caratteri o qualsiasi cosa 2Dish
  • In alternativa, puoi generare una matrice / vettore di vettori / qualsiasi cosa 2Dish di numeri, ma lo sfondo e il primo piano devono essere 2 numeri distinti (che possono variare da input a input, ma non attraverso un output) e nessun altro numero può essere presente. Anche i caratteri circostanti extra sono ammessi con questo formato (anche se devono corrispondere al numero di sfondo)
  • Questo è , la risposta più breve in byte, per lingua, vince!

Esempi

Per l'input 2, un output ASCII-art valido, con il carattere , è:

        ∙ ∙∙

Result: ∙ ∙∙.
        ∙ ∙∙

sì, il punto è lì solo per confonderti
Un'altra risposta valida come matrice numerica, con 2 come numero di sfondo e 9 in primo piano:

[[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 esempio di output non valido sarebbe

#  # #


#  # #

#  # #

poiché i rettangoli hanno dei separatori tra di loro.

Esempi di output per :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

Possiamo avere righe / colonne extra di caratteri di sfondo davanti, piuttosto che alla fine della tabella?
Kirill L.

@KirillL. certo, fintanto che le file si allineano
dzaima il

2
Nitpick: ∙ (U + 2219: BULLET OPERATOR) non è presente nel set di caratteri ASCII. Né è • (U + 2022: BULLET) o ⋅ (U + 22C5: DOT OPERATOR) o · (U + 00B7: MIDDLE DOT). :)
Andreas Rejbrand il

Risposte:


10

Haskell , 43 byte

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

Provalo online!

Un approccio intelligente di Ørjan Johansen che genera 0 e 1, generando ogni 10...00parte come rappresentazione in stringa di una potenza di 10.

111111111
101001000
111111111
101001000
101001000
111111111
101001000
101001000
101001000

Haskell , 49 byte

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

Provalo online!

Genera un modello simile [1,0,1,0,0,1,0,0,0,...], quindi crea un 2D prendendo le mincoppie. La stranezza inutile salva 2 byte sul più leggibile:

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

Provalo online!


3
Questo può essere abbreviato con il mio vecchio trucco numerico triangolare: 43 byte
Ørjan Johansen

1
Appena realizzato, flip(map.max)=mapM max.
Ørjan Johansen,

@ ØrjanJohansen Whoa, come funziona? Penso che potresti fare con la pubblicazione di una tua risposta :-)
xnor

Impostare la monade su (->) b, quindi mapM :: (a -> b -> c) -> [a] -> b -> [c].
Ørjan Johansen,

@xnor hai dimenticato di passare flip(map.max)amapM max
solo ASCII il

9

R , 56 54 43 36 30 byte

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

Provalo online!

Accetta uno sopra n (quindi restituisce una matrice 3x3 per n=4 ). Restituisce una matrice di 1s (primo piano) e 0s (sfondo) con una riga / colonna aggiuntiva di zero davanti.

Grazie a digEmAll per -7 byte.


Grazie, probabilmente può anche essere 30, se la riga vuota in più può essere davanti, piuttosto che alla fine.
Kirill L.

Oh, possono? Ho perso questo !
digEmAll

6

JavaScript (ES6),  73 72  69 byte

Restituisce una stringa composta da 1, spazi e avanzamenti di riga.

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

Provalo online!


JavaScript (ES7),  87 83  82 byte

Salvato 3 byte grazie a @dzaima

Restituisce una matrice binaria, che viene creata cella per cella.

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

Provalo online!

Come?

La larghezza w della matrice è data da:

w=Tn+n-1=(n+12)+n-1=n(n+3)2-1

(NB: come consentito dalle regole della sfida, invece, viene emessa una matrice di larghezza w+1 )

Allo stesso modo, la cella situata in (X,Y) è vuota se la seguente quadratica ammette una radice intera per K=X o K=Y :

X(X+3)2-1-K=0X2+3X-2-2K=0

il cui determinante è:

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


Non sono sicuro se può salvare byte, ma la soluzione di quel quadratico sarebbe , quindi ci sarebbe una radice intera se3±17+8k2 è dispari, cioèΔè un quadrato dispari perfetto. ΔΔ
Erik the Outgolfer

5

MATL, 14 10 byte

:"@:Fv]g&*

Questa risposta utilizza 1per i blocchi e 0per lo sfondo

Provalo su MATL Online

Spiegazione

     % 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 byte SBCS

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

Provalo online!

Modifica: -2 byte da ngn. +2 byte perché le risposte precedenti non erano valide (con l'idea grazie a ngn e dzaima).

Spiegazione

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

L'output dovrebbe apparire come:

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
potresti dare un contributo per evitare il{ }
ngn

4

Gelatina , 7 byte

‘RÄṬ|þ`

Provalo online!

01

Spiegazione

‘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

(x,y)1xy0Rsi ferma all'elemento più grande indicato nell'input, quindi dobbiamo disegnare una linea sul lato destro e sul fondo.) Gli spazi tra i numeri triangolari sono numeri interi consecutivi, quindi i blocchi rettangolari formati dagli spazi tra le estremità delle linee come le dimensioni richieste dalla domanda; e l'uso di un'operazione OR (in questo caso bit a bit) consente alle linee di incrociarsi correttamente.


Perché questa è una wiki della comunità ?! Se vuoi rinunciare al rappresentante, puoi semplicemente darlo a Erik the Outgolfer
Jonathan Allan,

1
CW tutte le mie risposte (a meno che non penso che possano ottenere una taglia, nel qual caso uso un account temporaneo per loro). Puntare a una reputazione elevata significa di solito mirare a peggiorare il sito (una volta ricollocavo ogni giorno per una settimana per dimostrare che era possibile; non era particolarmente difficile, e tuttavia comportava molte domande / risposte superficiali che non contribuisce davvero molto al sito). Inoltre, guadagnarsi la reputazione è principalmente negativo sull'account perché rende il sito fastidioso nel fare il lavoro di moderazione; e ottenere privilegi aumenta il rischio di ottenere accidentalmente badge.
ais523

Inoltre, per lo più non sono d'accordo con il concetto di proprietà dei post su SE (anche se principalmente con domande piuttosto che risposte, ma non puoi fare una domanda CW senza l'aiuto del moderatore). Un marcatore CW dice molto chiaramente "se qualcosa non va qui, sentiti libero di modificarlo"; quindi applicherei un marcatore CW a tutto, anche se non rinuncia alla reputazione. SE, dopo tutto, è pensato per essere parte della wiki, ma la gente non la usa sempre così.
ais523

RE "mirando ad un'alta reputazione" se non lo desideri, pubblica semplicemente quando pensi che sia significativo ed evita ciò che definisci "superficiale". O ritieni che questa risposta aggiunga qualcosa al sito, nel qual caso pubblicala senza CW, o pensi che sia "superficiale", nel qual caso semplicemente non pubblicarla. RE "Per lo più non sono d'accordo con il concetto di proprietà dei post su SE" - beh, allora sei semplicemente sul sito sbagliato.
Jonathan Allan,

2
Penso che la risposta aggiunga qualcosa al sito, ma se non è CW, mi sento in dovere di pubblicare in un modo che mi guadagnerebbe la reputazione piuttosto che pubblicare ciò che penso sarebbe interessante; quando ero un utente di 20k, ho finito per odiare il sito e mi sono quasi allontanato dal code golf in generale per questo, quindi ho eliminato il mio account di conseguenza. Quando sono tornato, ero solito cancellare il mio account con ogni risposta che avevo pubblicato (creandone uno nuovo per la risposta successiva), ma qualcun altro ha sottolineato che CWing ogni risposta avrebbe avuto un effetto simile, quindi oggi lo faccio invece.
ais523

4

05AB1E , 9 byte

fNatList[List[Nat]]

Codice:

$L×0ýSDδ*

Utilizza il 05AB1E -encoding . Provalo online! o usa la versione piuttosto stampata .


Spiegazione:

$ # Premi il numero 1 e l'ingresso n 
 L # Crea l'elenco [1, 2, 3, ..., n ]
  × # Moltiplicazione di stringhe vettoriale: 1 × [1, 2, 3, ..., n ]
                 Ciò comporterebbe ["1", "11", "111", ..., "1" × n ]
   0ý # Unisciti all'elenco risultante con '0', risultante in "10110111011110111110 ..."
     S # Dividi in cifre singole: [1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, ...]
      Dδ * # Tabella di moltiplicazione con se stessa

4

C # (compilatore interattivo Visual C #) , 96 95 byte

-1 byte grazie a Embodiment of Ignorance

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

Provalo online!


non sono sicuro se l'input tramite argomento ma l'output tramite stdout è consentito
solo ASCII

3
Mescolare i formati IO va bene
Jo King il

1
Perché non aggiungere il n--nella new stringsezione?
Incarnazione dell'ignoranza


3

Python 2 , 67 byte

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

Provalo online!

Stampa linee vuote per linee vuote, che la sfida consente.

Stessa lunghezza (con input uno sopra n):

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

Provalo online!



3

Carbone , 18 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

   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 byte

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

Provalo online!

Una versione molto rivista grazie a varie persone utili (vedi i commenti).




1
@EmbodimentofIgnorance non valido, non funziona per n> = 10 ...
ASCII il

1
@ ASCII-funziona solo: tio.run/…
Incarnazione dell'ignoranza il

2
@Stackstuck Sì. Un programma può terminare in modo anomalo
solo ASCII il


3

Java 11, 109 byte

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

Porta della risposta C # .NET solo per @ ASCII .

Provalo 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, non 8, a causa del repeatmetodo.
Olivier Grégoire il

@ OlivierGrégoire Oops .. Risolto
Kevin Cruijssen il

Tuttavia, è accettabile avere una lambda che genera un'eccezione? Ho pensato che fosse ok per un programma completo, ma non per funzione / eccezioni
Olivier Grégoire,

@ OlivierGrégoire Finché emette ancora il risultato atteso, non vedo perché non tbh.
Kevin Cruijssen il

1
Questo è collegato a questa discussione . La risposta sembra essere se REPL sono accettati (cosa che non sono di default), quindi va bene stampare su stderr o lanciare un'eccezione, ma se REPL non è accettato allora non sono ammessi std / eccezioni.
Olivier Grégoire il

2

APL + WIN, 29 byte

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

Spiegazione:

(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 

Esempio:

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

Rubino , 55 byte

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

Provalo online!

Come?

Innanzitutto, crea la prima riga, quindi scorre i suoi caratteri. Stampa l'intera riga se il carattere è '#', altrimenti stampa il singolo carattere (che è uno spazio)


2

Brain-Flak , 170 byte

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

Provalo online!


2

Perl 6 , 35 33 byte

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

Provalo online!

Callable anonimo che accetta un numero e stampa la tabella di moltiplicazione con * s con una nuova riga finale.

Spiegazione:

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

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

Restituisce una matrice di numeri.

Provalo online!

Varianti di fcon lo stesso numero di byte:

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

Le righe e le colonne 0 aiutano?
lunedì

1
@dfeuer: sì, salvano un byte. Vedi la prima versione della mia risposta.
nimi


1

MathGolf , 20 byte

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

Provalo online!

MathGolf ha davvero bisogno di avere alcune funzionalità in più per dividere gli elenchi e creare elenchi 2D.

Spiegazione

╒                      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

Inchiostro , 151 152 151 byte

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

Provalo online!

Meno male che le regole consentono i personaggi in eccesso.

Modifica: +1: spaziatura fissa. Inoltre, visualizza usando @ (che non necessita di escape) invece di # (che fa)

Modifica: -1: Apparentemente quella correzione significava anche che non avevo più bisogno di un periodo finale per forzare una nuova riga sulle linee non vuote. Neat.


Ohh, in realtà non ho nemmeno notato quegli spazi. Vedrò se posso fare qualcosa al riguardo ...
Sara J

1

C ++, 170 156 byte

Grazie 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 byte

Uscita grafica. L'input è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 byte

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

1
.join(' ')non fa nulla, '#'può essere \*invece, le stringhe di newline possono usare letteralmente newline, entrambe l.map(str x*)possono essere (str Xx l)invece. 38 byte
Jo King

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.