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


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+n1=(n+12)+n1=n(n+3)21

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

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

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

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

Δ=94(22k)=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 байтов

fNatList[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.