Распечатать физическую таблицу умножения


40

Прямоугольники имеют это приятное свойство - прямоугольник состоит ровно из символов!N×мN×м

Еще более интересное свойство заключается в том, что прямоугольники можно правильно выровнять в таблице умножения - например, в таблице :3×3

# ## ###

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

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

Ваша задача состоит в том, чтобы, учитывая число ( ), вывести отформатированную таблицу умножения .NN>1N×N

правила

  • Вы можете взять вход выше или нижеN
  • Применяются правила ввода / вывода по умолчанию
  • Вы можете выбрать любой непробельный символ для представления блоков; любой другой символ (хотя символы новой строки являются специальными) считается пробелом. Выбранный символ может быть разным для разных входов, но должен быть одинаковым на протяжении всего ввода
  • Результат может содержать ненужные символы, если таблица выровнена и нет выбранных символов, которые не являются частью требуемого вывода
  • Разделители должны иметь ширину 1 символ / высоту, а прямоугольники должны быть упакованы (т.е. не должно быть разделителей между их символами)
  • Пустые строки могут быть пустыми, заполнение не требуется
  • Результат может быть строкой, матрицей, вектором строк, массивом символьных массивов или чем-то 2Dish
  • В качестве альтернативы вы можете вывести матрицу / вектор-вектор / что-нибудь двумерное из чисел, но фон и передний план должны состоять из 2 различных чисел (которые могут варьировать входные данные для ввода, но не во всех выходных данных), и никакие другие числа не могут присутствовать. В этом формате также разрешены дополнительные окружающие символы (хотя они должны совпадать с номером фона)
  • Это , самый короткий ответ в байтах, за язык, выигрывает!

Примеры

Для ввода 2допустимый вывод ascii-art с символом ∙:

        ∙ ∙∙

Result: ∙ ∙∙.
        ∙ ∙∙

да, период просто для того, чтобы сбить вас с толку.
Другой действительный ответ в виде числовой матрицы, где 2 - номер фона, а 9 - передний план:

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

Пример неверного вывода будет

#  # #


#  # #

#  # #

поскольку прямоугольники имеют разделители между ними.

Пример выходов для :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

Можем ли мы иметь дополнительные строки / столбцы фоновых символов впереди, а не в конце таблицы?
— Кирилл Л.

@KirillL. конечно, до тех пор, пока ряды не
— выровняются

2
Nitpick: ∙ (U + 2219: ОПЕРАТОР ПУЛЯ) отсутствует в наборе символов ASCII. Также не • (U + 2022: ПУЛЯ) или ⋅ (U + 22C5: ОПЕРАТОР ТОЧКИ) или · (U + 00B7: СРЕДНЯЯ ТОЧКА). :)
— Андреас Рейбранд

Ответы:


10

Haskell , 43 байта

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

Попробуйте онлайн!

Умный подход Эрджана Йохансена, выводящий с 0 и 1, генерирующий каждую 10...00часть как строковое представление степени 10.

111111111
101001000
111111111
101001000
101001000
111111111
101001000
101001000
101001000

Haskell , 49 байтов

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

Попробуйте онлайн!

Создает шаблон как [1,0,1,0,0,1,0,0,0,...], затем создает 2D, беря minпары. Бесполезная странность экономит 2 байта по сравнению с более читабельным:

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

Попробуйте онлайн!


3
Это можно сократить с помощью моего старого трюка с треугольными числами: 43 байта
— Орджан Йохансен

1
Просто понял flip(map.max)=mapM max.
— Орджан Йохансен

@ ØrjanJohansen Вау, как это работает? Я думаю, что вы могли бы сделать с размещением собственного ответа :-)
— xnor

(->) bЗатем установите монаду в mapM :: (a -> b -> c) -> [a] -> b -> [c].
— Орджан Йохансен

@xnor вы забыли перейти flip(map.max)наmapM max
— только ASCII

9

R , 56 54 43 36 30 байт

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

Попробуйте онлайн!

Принимает входное значение выше N (поэтому возвращает матрицу 3x3 для Nзнак равно4 ). Возвращает матрицу из 1s (на переднем плане) и 0s (на заднем плане) с дополнительной строкой / столбцом нулей впереди.

Спасибо digEmAll за -7 байт.


Спасибо, кстати, это может быть даже 30, если дополнительная пустая строка может быть впереди, а не в конце.
— Кирилл Л.

О, они могут? Я пропустил это !
— digEmAll

6

JavaScript (ES6),  73 72  69 байт

Возвращает строку из 1, пробелов и перевода строки.

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

Попробуйте онлайн!


JavaScript (ES7),  87 83  82 байта

Сохранено 3 байта благодаря @dzaima

Возвращает двоичную матрицу, которая строится ячейка за ячейкой.

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

Попробуйте онлайн!

Как?

Ширина w матрицы определяется как:

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

(NB: Как разрешено правилами вызова, мы выводим матрицу ширины w+1 )

Точно так же ячейка, расположенная в (X,Y) , пуста, если следующий квадратик допускает целочисленный корень для k=X или k=Y :

x(x+3)2−1−k=0x2+3x−2−2k=0

чей определитель:

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


Не уверен, что это может сохранить байты, но решение этой квадратичной будет , так что будет целочисленный корень, если√-3±17+8К2 нечетно, то естьΔявляется нечетным совершенным квадратом. ΔΔ
— Эрик Outgolfer

5

MATL, 14 10 байт

:"@:Fv]g&*

Этот ответ использует 1для блоков и 0для фона

Попробуйте это на MATL Online

объяснение

     % 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 байтов SBCS

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

Попробуйте онлайн!

Редактировать: -2 байта от ngn. +2 байта, потому что предыдущие ответы были неверными (с идеей благодаря ngn и dzaima).

объяснение

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

Вывод должен выглядеть так:

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
Вы можете принять участие, ⎕чтобы избежать{ }
— нгн

4

Желе , 7 байт

‘RÄṬ|þ`

Попробуйте онлайн!

01

объяснение

‘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

(Икс,Y)1ИксY0RṬостанавливается на самом большом элементе, указанном во входных данных, поэтому нам нужно нарисовать линию справа и снизу.) Пробелы между треугольными числами являются последовательными целыми числами, поэтому прямоугольные блоки, образованные промежутками между строками, заканчиваются как размеры, запрошенные вопросом; и использование операции ИЛИ (в данном случае, побитовой) позволяет линиям правильно пересекать друг друга.


Почему это вики сообщества? Если вы хотите отказаться от представителя, вы можете просто отдать его Эрику Аутгольферу
— Джонатан Аллан

1
Я CW все мои ответы (если я не думаю, что они могут получить награду, в этом случае я использую для них временную учетную запись). Стремление к высокой репутации обычно означает стремление сделать сайт еще хуже (я однажды в течение недели каждый раз переоткрывал каждый день, чтобы доказать, что это возможно; это было не особенно сложно, и все же в нем было много мелких вопросов / ответов, которые не давали ». т реально внести свой вклад в сайт много). Кроме того, получение репутации в основном отрицательно для аккаунта, поскольку это заставляет сайт заниматься модерацией; и получение привилегий увеличивает риск случайного получения значков.
— ais523

Кроме того, я в основном не согласен с концепцией владения постами на SE (хотя в основном с вопросами, а не с ответами, но вы не можете CW вопрос без помощи модератора). Маркер CW очень четко говорит: «если здесь что-то не так, не стесняйтесь редактировать его»; поэтому я бы применил маркер CW ко всему, даже если бы он не потерял репутацию. В конце концов, SE предназначен для того, чтобы быть частью вики, но люди не всегда используют его так.
— ais523

RE "стремление к высокой репутации", если вы не хотите этого, просто пишите, когда вы думаете, что это имеет смысл, и избегайте того, что вы называете "мелкими" вопросами и ответами. Либо вы чувствуете, что этот ответ добавляет что-то на сайт, в этом случае публикуйте его без CW, либо вы думаете, что он «поверхностный», в этом случае просто не публикуйте его. RE "Я в основном не согласен с концепцией владения постами на SE" - ну, вы просто не на том сайте.
— Джонатан Аллан

2
Я думаю, что ответ добавляет что-то на сайт, но если это не CW, я чувствую себя обязанным публиковать таким образом, чтобы получить мою репутацию, а не публиковать то, что я считаю интересным; Когда я был пользователем 20k, я действительно очень ненавидел сайт и из-за этого чуть не отвернулся от Code Golf в целом, поэтому в результате удалил свой аккаунт. Когда я возвращался, я обычно удалял свою учетную запись при каждом опубликованном ответе (создавая новый для следующего ответа), но кто-то еще указывал, что CWing для каждого ответа будет иметь аналогичный эффект, поэтому в настоящее время я делаю это вместо этого.
— ais523

4

05AB1E , 9 байтов

f: Nat→List[List[Nat]]

Код:

$L×0ýSDδ*

Использует кодирование 05AB1E . Попробуйте онлайн! или используйте печатную версию .


Объяснение:

$ # Нажмите 1 и введите n 
 L # Создать список [1, 2, 3, ..., n ]
  × # Умножение векторной строки: 1 × [1, 2, 3, ..., n ]
                 Это приведет к ["1", "11", "111", ..., "1" × n ]
   0ý # Соедините результирующий список с '0', что приведет к "10110111011110111110 ..."
     S # Разделить на однозначные числа: [1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, ...]
      Dδ * # Таблица умножения с собой

4

C # (интерактивный компилятор Visual C #) , 96 95 байт

-1 байт благодаря варианту невежества

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

Попробуйте онлайн!


не уверен, разрешен ли ввод через аргумент, но вывод через stdout
— только ASCII

3
Смешивать форматы ввода-вывода - хорошо
— Джо Кинг,

1
Почему бы не добавить n--в new stringраздел?
— Воплощение Невежества




3

Древесный уголь , 18 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

   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 байтов

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

Попробуйте онлайн!

Очень пересмотренная версия благодаря различным полезным людям (см. Комментарии).




1
@EmbodimentofIgnorance недействителен, не работает для n> = 10 ...
— только ASCII

1
@ ASCII-только это работает: tio.run/…
— Воплощение невежества

2
@Stackstuck Да. Программа может завершиться сбоем
— только ASCII


3

Java 11, 109 байт

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

Порт @ ASCII-only ответа C # .NET .

Попробуйте онлайн.

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, а не 8, из-за repeatметода.
— Оливье Грегуар

@ OlivierGrégoire Упс .. Исправлено
— Кевин Круйссен

Впрочем, допустимо ли иметь лямбду, которая выдает исключение? Я думал, что это нормально для полной программы, но не для функции / исключений
— Оливье Грегуар

@ OlivierGrégoire До тех пор, пока он все еще выводит ожидаемый результат, я не вижу, почему бы не tbh.
— Кевин Круйссен

1
Это связано с этим обсуждением . Похоже, что ответом является то, что если REPL приняты (что они не являются по умолчанию), тогда можно распечатать на stderr или выдать исключение, но если REPL не принято, то никакие std / исключения не допускаются.
— Оливье Грегуар

2

APL + WIN, 29 байт

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

Объяснение:

(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 

Пример:

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

Рубин , 55 байт

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

Попробуйте онлайн!

Как?

Сначала создайте первую строку, затем выполните итерации по ее символам. Вывести всю строку, если символ «#», в противном случае вывести один символ (который является пробелом)



2

Perl 6 , 35 33 байта

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

Попробуйте онлайн!

Anonymous Callable, который берет число и печатает таблицу умножения с *s с завершающим переводом строки.

Объяснение:

{                             }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 байт

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

Возвращает матрицу чисел.

Попробуйте онлайн!

Варианты fс одинаковым количеством байтов:

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

Помогают ли строка и столбец 0?
— dfeuer

1
@dfeuer: да, они сохраняют байт. Смотрите первую версию моего ответа.
— Ними


1

MathGolf , 20 байтов

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

Попробуйте онлайн!

MathGolf действительно нужно получить больше функциональности для разделения списков и создания 2D списков.

объяснение

╒                      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

Чернила , 151 152 151 байт

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

Попробуйте онлайн!

Хорошо, что правила допускают лишние символы.

Изменить: +1: фиксированный интервал. Кроме того, отображать с помощью @ (который не нуждается в экранировании) вместо # (который делает)

Редактировать: -1: Очевидно, это исправление также означало, что мне больше не нужен завершающий период для принудительного переноса новой строки на непустых строках. Ухоженная.


Ох, я даже не заметил этих мест. Я посмотрю, смогу ли я что-нибудь с ними сделать ...
— Сара Дж.


0

SmileBASIC, 83 77 байт

Графический вывод. Ввод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 байта

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

1
.join(' ')ничего не делает, '#'может быть \*вместо этого, строки новой строки могут использовать буквальные переводы строк, обе l.map(str x*)могут быть (str Xx l)вместо. 38 байт
— Джо Кинг

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.