Роздрукуйте таблицю фізичного множення


40

Прямокутники мають цю приємну властивість - прямокутник n×m складається з рівно n×m символів!

Ще цікавішою властивістю є те, що прямокутники можна добре вирівняти в таблиці множення - наприклад, таблиці 3×3 :

# ## ###

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

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

Ваша задача полягає в тому, щоб, задавши число n ( n>1 ), вивести форматизовану таблицю множення n×n .

Правила

  • Ви можете взяти вхід один над або нижче n
  • Застосовуються правила вводу / виводу за замовчуванням
  • Ви можете обрати будь-який символ, який не є пробілом, щоб представляти блоки; кожен інший символ (хоча нові рядки особливі) вважається пробілом. Обраний символ може бути різним для різних входів, але повинен бути однаковим на вході
  • Результат може мати непотрібні символи, якщо таблиця вирівнюється вгору і не виникає випадків обраного символу, які не є частиною необхідного виводу
  • Роздільники повинні бути шириною 1 символу / висотою, а прямокутники повинні бути упаковані (тобто немає роздільників між їх символами)
  • Порожні рядки можуть бути порожніми, прокладка не потрібна
  • Результатом може бути рядок, матриця, вектор ліній, масив символьних масивів або що-небудь 2Dish
  • Ви також можете вивести матрицю / вектор-векторів / що-небудь 2Dish чисел, але фон і передній план повинні бути двома різними номерами (які можуть змінюватись вхідними даними, але не у всьому виході), і ніяких інших чисел не може бути. Додаткові навколишні символи дозволені і в цьому форматі (хоча вони повинні відповідати фоновому номеру)
  • Це , найкоротша відповідь у байтах, за мовою, виграш!

Приклади

Для вводу 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. звичайно, поки ряди вишикуються
dzaima

2
Nitpick: ∙ (U + 2219: BULLET OPERATOR) відсутній у наборі символів ASCII. Не дорівнює • (U + 2022: BULLET) або ⋅ (U + 22C5: DOT OPERATOR) або · (U + 00B7: MIDDLE DOT). :)
Андреас Рейбранд

Відповіді:


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

Хаскелл , 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
Це можна скоротити за допомогою моєї старої
трюкової трикової

1
Просто зрозумів, flip(map.max)=mapM max.
Ørjan Johansen

@ ØrjanJohansen Whoa, як це працює? Я думаю, ви могли б зробити, коли ви опублікували власну відповідь :-)
xnor

(->) bТоді встановіть монаду mapM :: (a -> b -> c) -> [a] -> b -> [c].
Ørjan Johansen

@xnor ви забули змінити flip(map.max)наmapM max
лише

9

R , 56 54 43 36 30 байт

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

Спробуйте в Інтернеті!

Бере вхід один вище n (тому повертає матрицю 3x3 для n=4 ). Повертає матрицю розміром 1s (передній план) та 0s (фон) із додатковим рядком / стовпцем нулів спереду.

Завдяки digEmAll на -7 байт.


Дякую, BTW може бути навіть 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

(Примітка: Як дозволяють правила виклику, ми виводимо матрицю шириною )w+1

Аналогічно, осередок, розташований у , порожній, якщо наступний квадратик допускає цілий корінь або або :(X,Y)k=Xk=Y

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

визначальним фактором якого є:

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


Не впевнений, чи може він зберігати байти, але рішенням цієї квадратики було б , тож буде цілий корінь, якщо непарне, тобто , - це непарний досконалий квадрат. 3±17+8k2 ΔΔΔ
Ерік Аутгольфер

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

(x,y)1xy0Rзупиняється на найбільшому елементі, вказаному на вході, тому нам потрібно намалювати лінію в правій та нижній частині.) Проміжки між трикутними числами є цілими послідовними числами, тому прямокутні блоки, утворені проміжками між рядками, закінчуються вгору відповідно до розмірів, що вимагаються питанням; а використання операції АБО (у цьому випадку порозрядно) дозволяє лініям правильно перетинати один одного.


Чому це вікі спільноти ?! Якщо ви хочете відмовитись від представника, ви можете просто надати його Еріку Переможнику
Джонатану Аллану

1
Я вказую на всі свої відповіді (якщо я не думаю, що вони можуть отримати винагороду; в такому випадку я використовую для них тимчасовий рахунок). Прагнення до високої репутації зазвичай означає прагнути погіршити сайт (я один раз переробляв щодня протягом тижня, щоб довести, що це можливо; це було не особливо складно, і все ж це стосувалося безлічі дрібних питань / відповідей, які не були ' t дуже багато сприяють сайту). Крім того, здобуття репутації в основному є негативним для облікового запису, оскільки це змушує сайт занурювати вас в роботу по модерації; а отримання пільг збільшує ризик випадкового отримання значків.
ais523

Крім того, я здебільшого не погоджуюся з концепцією власності на повідомлення в SE (хоча в основному це питання, а не відповіді, але ви не можете CW питання без допомоги модератора). Маркер CW дуже чітко говорить «якщо тут щось не так, сміливо відредагуйте»; тож я б застосував маркер CW до всього, навіть якщо він не відмовився від репутації. Зрештою, SE покликана бути частиною вікі, але люди не завжди використовують це як таке.
ais523

RE "прагнення до високої репутації", якщо ви цього не хочете, просто опублікуйте, коли вважаєте, що це має сенс, і уникайте того, що ви називаєте "дрібним" питанням. Або ви відчуваєте, що ця відповідь щось додає на сайт, в такому випадку розміщуйте його без CW, або ви вважаєте, що він "дрібний", і в цьому випадку просто не публікуйте його. RE "Я здебільшого не погоджуюся з концепцією власності на пости в SE" - ну ви просто тоді не на тому веб-сайті.
Джонатан Аллан

2
Я думаю, що відповідь щось додає на сайт, але якщо це не CW, я відчуваю, що я змушений розміщувати повідомлення таким чином, який би здобув мені репутацію, а не публікувати те, що, на мою думку, було б цікавим; ще коли я був користувачем у 20 тис., я зрештою ненавиджу сайт і майже взагалі відвернувся від коду гольфу через нього, тому в результаті видалив свій рахунок. Коли я повернувся, я видаляв свій обліковий запис з кожною опублікованою вами відповіддю (створюючи нову для наступної відповіді), але хтось інший зазначив, що 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 # Interactive Compiler) , 96 95 байт

-1 байт завдяки втіленню невігластва

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

Спробуйте в Інтернеті!


не впевнений , що якщо вхід з допомогою аргументу , але виводиться через стандартний висновок дозволено
ASCII-тільки

3
Змішування форматів IO добре
Jo King

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

Порт відповіді C # .NET лише для @ ASCII .

Спробуйте в Інтернеті.

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 Поки він все ще дає очікуваний результат, я не бачу, чому б не тбх.
Кевін Круїссен

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^*

Спробуйте в Інтернеті!

Анонімний дзвінок, який приймає число, і друкує таблицю множення з *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.