Давайте створимо мозаїку з цифрами


25

Виклик

З огляду на позитивне ціле число , повторити кожен з його цифр кількість разів , відповідне його становищу в . Іншими словами, кожну цифру слід повторити разів (для кожного , 1-індексується), створюючи таким чином нове число:Nг1,г2,г3,,гнNгкк1кн

г1г2г2г3г3г3гнгнгнгнн разів¯

Потім запишіть його як по горизонталі, так і по вертикалі і заповніть пробіли копіями цифри, що відповідає більшому індексу між індексом стовпців та індексом рядків порожнього пробілу. Кінцевий результат повинен виглядати так:

[г1г2г2г3г3г3г2г2г2г3г3г3г2г2г2г3г3г3г3г3г3г3г3г3г3г3г3г3г3г3г3г3г3г3г3г3]

Технічні характеристики

Ви можете прийняти як ціле число, рядок, список цифр або список символів, що представляють цифри. Висновком може бути рядок, розділений рядком, рядком / цілими числами, або список списків символів / цифр, але, будь-ласка, включіть також версію з симпатичним друком. Якщо висновок є рядком, розділеним новим рядком, також прийнятно:N

  • мати пробіли / пробіли пробілів до тих пір, поки візуальний зовнішній вигляд не зміниться
  • розділіть стовпці, використовуючи послідовні пробіли кількості або рядки з послідовною (ненульовою) кількістю нових рядків

Ви можете взяти введення та надати вихід за допомогою будь-якого стандартного методу , зауваживши, що ці лазівки за замовчуванням заборонені. Це , тому постарайтеся виконати завдання в найменшій кількості байтів, якими ви зможете керувати на своїй обраній мові .

Тестові справи

65:

655
555
555

---------------

203:

200333
000333
000333
333333
333333
333333

--------------

233:

233333
333333
333333
333333
333333
333333

---------------

5202:

5220002222
2220002222
2220002222
0000002222
0000002222
0000002222
2222222222
2222222222
2222222222
2222222222

---------------

12345:

122333444455555
222333444455555
222333444455555
333333444455555
333333444455555
333333444455555
444444444455555
444444444455555
444444444455555
444444444455555
555555555555555
555555555555555
555555555555555
555555555555555
555555555555555

Чи маємо ручку дві однакові цифри поруч?
Дом Гастінгс

@DomHastings Так, ви повинні з ними впоратися. Додано тестовий випадок, що ілюструє це.
Містер Xcoder

Відповіді:


9

JavaScript (ES7), 70 байт

Вводиться як рядок. Повертає рядок із зворотним подачею рядків.

s=>(g=x=>(c=s[(x>y?x:y)**.5-1>>1])?c+g(x+8):x>y?`
`+g(1,y+=8):'')(y=1)

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

Як?

Метод

Ми будуємо вихідний символ за символом, проходячи через квадратну матрицю і перетворюючи кожну клітинку в індекс у рядок введення.iх,у

Координати до рядкового індексу

Верхня межа від n t h - значної області (0-індексується) вздовж кожної осі задається A000096 :уннтгод

u0=0,u1=2,u2=5,u3=9,u4=14,u5=20,

ун=н(н+3)2
у0=0,у1=2,у2=5,у3=9,у4=14,у5=20,

Давши ціле число , ми можемо з’ясувати, в якій області n = x+ 1 воно знаходиться, розв’язавши:кн=х+1

х²+3х-2к=0

Призводить до:

n=

х=1+8к-32
н=1+8к-32+1=1+8к-12

Для кожної комірки визначаємо:(х,у)

vх,у=макс(1+8х,1+8у)

Ці значення перетворюються в індекси у рядок введення, виконуючи: i x , yvх,уiх,у

iх,у=vх,у-12
 v(x,y) |  0  1  2  3  4  5  6  7  8  9        i(x,y) |  0  1  2  3  4  5  6  7  8  9
--------+-------------------------------      --------+-------------------------------
    0   |  1  9 17 25 33 41 49 57 65 73           0   |  0  1  1  2  2  2  3  3  3  3
    1   |  9  9 17 25 33 41 49 57 65 73           1   |  1  1  1  2  2  2  3  3  3  3
    2   | 17 17 17 25 33 41 49 57 65 73           2   |  1  1  1  2  2  2  3  3  3  3
    3   | 25 25 25 25 33 41 49 57 65 73           3   |  2  2  2  2  2  2  3  3  3  3
    4   | 33 33 33 33 33 41 49 57 65 73   -->     4   |  2  2  2  2  2  2  3  3  3  3
    5   | 41 41 41 41 41 41 49 57 65 73           5   |  2  2  2  2  2  2  3  3  3  3
    6   | 49 49 49 49 49 49 49 57 65 73           6   |  3  3  3  3  3  3  3  3  3  3
    7   | 57 57 57 57 57 57 57 57 65 73           7   |  3  3  3  3  3  3  3  3  3  3
    8   | 65 65 65 65 65 65 65 65 65 73           8   |  3  3  3  3  3  3  3  3  3  3
    9   | 73 73 73 73 73 73 73 73 73 73           9   |  3  3  3  3  3  3  3  3  3  3

Умови зупинки

Ми знаємо, що досягли:

  • права межа матриці, коли символу в не існує, і у нас x > yiх,ух>у

  • нижня межа матриці, коли символу не існує, а у насху


7

J , 16 15 байт

-1 байт завдяки FrownyFrog!

{~#\<:@>./~@##\

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

Приймає Nяк рядок.

Пояснення вихідного рішення:

              #\   finds the length of the successive prefixes of the input (1 2 3...)
            #~     copies each digit as many times (1 2 2 3 3 3...)  
       >./~@       and creates a table of the max of the row/col numbers
  [:<:@            then subtract 1 from each element (for indexing)
{~                 select the corresponding digit from the input

Тестовий сеанс із введенням 203:

   #\ '203'
1 2 3

   #~#\ '203'
1 2 2 3 3 3

   >./~@#~#\ '203'
1 2 2 3 3 3
2 2 2 3 3 3
2 2 2 3 3 3
3 3 3 3 3 3
3 3 3 3 3 3
3 3 3 3 3 3

   <:@>./~@#~#\ '203'
0 1 1 2 2 2
1 1 1 2 2 2
1 1 1 2 2 2
2 2 2 2 2 2
2 2 2 2 2 2
2 2 2 2 2 2

   ({~[:<:@>./~@#~#\) '203'
200333
000333
000333
333333
333333
333333

1
Так, крім розміщення відповіді ), ваша відповідь APL така ж, як і у моєї.
Ерік Аутгольфер

Я справді взагалі не знаю J, але [:<:@здається досить дорогим. Чи можете ви замість цього додати щось до списку, який ви індексуєте, щоб врахувати 1-індексацію (наприклад, додати 0, щоб перемістити кожну необхідну позицію елемента 1 праворуч)?
Містер Xcoder

@ Mr.Xcoder Я думав про це. Я спробую це побачити, чи врятує це байт.
Гален Іванов

@EriktheOutgolfer {⍵[∘.⌈⍨(/⍨)⍳⍴⍵]} ?
Гален Іванов

@GalenIvanov Так, це.
Ерік Аутгольфер



6

R , 59 байт

function(a){m=outer(x<-rep(g<-seq(a),g),x,pmax);m[]=a[m];m}

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

  • Я помітив, що прийняття вектора цифр прийнятно, і це дозволило мені зберегти 21 байт :)
  • -2 байти завдяки пропозиції @Giuseppe прийняти лише векторний символ
  • -2 байти, що задаються у визначенні аргументів

1
Ви можете взяти aяк вектор символів, що дозволяє вам встановити g=seq(a)безпосередньо.
Джузеппе

@Giuseppe: саме так!
digEmAll


5

05AB1E , 14 11 10 байт

Збережено 1 байт завдяки магічній урній / Аднану

ƶJDv¬N×?=¦

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

Пояснення

ƶ            # repeat each element its index (1-based) times 
 J           # join to string
  Dv         # for N in [0 ... len(string)-1] do
    ¬N×      # push the head repeated N times
       ?     # print without newline
        =    # print the rest of the string without popping
         ¦   # remove the head


1
Мені немає жодного кредиту, кредит - Adnans: codegolf.stackexchange.com/a/87074/59376
Magic Octopus Urn

@MagicOctopusUrn: Ах, це геніально! Дякую обом;)
Емінья,



3

Excel VBA, 95 байт

Анонімна функція негайного вікна VBE, яка приймає введення [A1]та виводить на консоль

n=[len(A1)]:For y=1To n:For l=1To y:?:For x=1To n:?String(x,Mid([A1],IIf(x>y,x,y)));:Next x,l,y

Негольфірованний і прокоментував

n=[len(A1)]                         ''  Get Length
For y=1To n                         ''  Iterate down input
For l=1To y                         ''  Iterate down repeat lines
?                                   ''  Print Newline
For x=1To n                         ''  Iterate accross input
?String(x,Mid([A1],IIf(x>y,x,y)));  ''  Print x of the `max(x,y)`th digit in input
Next x,r,y                          ''  Loop, Loop, Loop

2

MATL , 15 12 байт

tftY"t!2$X>)

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

Я підозрюю, що це можна скоротити, але це не так вже й погано ...

          % implicit input, '230'
t         % duplicate input. Stack: ['230','230']
f         % indices of nonzero values. Stack: ['230',[1,2,3]]
t         % duplicate. Stack: ['230',[1,2,3],[1,2,3]]
Y"        % run-length decoding. Stack: ['230',[1,2,2,3,3,3]]
t         % duplicate. Stack: ['230',[1,2,2,3,3,3],[1,2,2,3,3,3]]
!         % transpose. Stack: ['230',[1,2,2,3,3,3],[1;2;2;3;3;3]]
2$X>      % elementwise maximum of 2 inputs, with broadcast.
          % Stack:
          % ['230',
          % [1, 2, 2, 3, 3, 3;
          %  2, 2, 2, 3, 3, 3;
          %  2, 2, 2, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3]]
 )        % index into G
          % implicit end, display stack contents

2

Додайте ++ , 35 байт

L,bLRdBcB]£X¦Ω+d‽b>1€Ω_A€Ω:AbLR¦+$T

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

Як це працює

Ми приймаємо введення як список цифр, не заважаючи нам а) переводити на цифри з BD, а також не потрібно зберігати цифри, що займе два байти.

bLRннdBcB][[1,1],[2,2]...[н,н]]£X¦Ω+

Потім ми дублюємо цей масив і таблицю його по максимуму, d‽b>. Тобто кожен елемент масиву є парним один з одним елементом з другого масиву, і команда діадичного максимуму виконується над парою. Для прикладу введення [6 5] , це створює масив [1 2 2 2 2 2 2 2 2] , який є сплющеною версією мозаїки, як індекси для масиву. На жаль, додати ++ використовує 0-індексовані масиви, так що ми повинні зменшуємо кожен елемент: 1€Ω_.

A€Ω:х

х(х-1)2

хтгод AbLR¦+Tн$T


1

Вугілля деревне , 17 байт

F⮌…LθUO⊕⊘×ι⁺³ι§θι

Спробуйте в Інтернеті! Пояснення:

F⮌…Lθ

Проведіть петлю над індексами символів у зворотному порядку.

⊕⊘×ι⁺³ι

Обчисліть розмір квадрата.

UO...§θι

Намалюйте квадрат, використовуючи поточний символ.




1

Вугілля деревне , 14 байт

E⭆θ×⊕κι×⊕κι‖O↗

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

Як?

E⭆θ×⊕κι×⊕κι‖O↗ - implicitly print the result of...
E                - map:
  ⭆              -   over: string map:       
    θ             -     over: first input
     ×            -     using: repeat
        ι         -       what: ι (loop value)
      ⊕κ          -       by: incremented κ (loop counter)
         ×        -   using: repeat
            ι     -     what: ι (loop value)
          ⊕κ      -     by: incremented κ (loop counter)
             ‖O  - Reflect with overlap:
                ↗ -   direction: up-right

... чи можна цим методом пограти в гольф?


"... чи можна цим методом пограти в гольф?" Навіть рішення Ніла довше, тому я не бачу ніякої надії тут. : P
Ерік Аутгольфер

×⊕κιхоча двічі.
Джонатан Аллан

Річ у тому, що присвоїти це змінній непросто, оскільки значення ιта κзмінюються при кожній ітерації циклу Each.
Ерік Аутгольфер

Це має бути функцією, але я не знаю, чи це можливо.
Джонатан Аллан

Поставити запитання - чи можливо це в 3 (або 5, залежно від того, як визначено функцію) байтів або менше. ;) (Очевидна відповідь, звичайно, ні.)
Ерік Аутгольфер

1

Стакс , 12 байт

ü°√¿«│⌠º₧@\τ

Запустіть і налагоджуйте його

Використовуючи цей алгоритм .

Пояснення:

c%R:BXm]i*xit+ Full program, implicit input
c%             Length of input
  R            1-based range
   :B          Repeat each element according to the range ("123" -> "122333")
     X         Save to X register
      m        Map:
       ]         Character -> string
        i*       Repeat by iteration index
          xit    Trim first <iteration index> elements from X
             +   Concatenate
                 Implicit output with newline

Стакс , 20 19 18 16 байт

ù↔‼i,ÑΓæ☺=╘‼æ↕4╝

Запустіть і налагоджуйте його

Пояснення:

c%R:BX%mYx%{y|Mvx@m Full program, implicit input
c%                  Length of input
  R                 1-based range
   :B               Repeat each element according to the range ("123" -> "122333")
     X              Save to X register
      %             Length
       m            Map over 1-based range:
        Y             Save index to Y register
         x%           Push length of X register
           {      m   Map over 1-based range:
            y|M         Maximum of both indices
               v        1-based -> 0-based (decrement)
                x@      Index into X register
                      Implicit output with newline

1

Attache , 34 байт

{_[Table[Max,Flat!{_&_}=>1:#_]-1]}

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

Пояснення

Працює аналогічно J-відповіді Галена Іванова .

{_[Table[Max,Flat!{_&_}=>1:#_]-1]}
{                                }   anonymous function: _ is input, array of digits
                                     example: _ := [2, 0, 3]
                         1:#_        the range 1 to Size[_]
                                     > e.g.: [1, 2, 3]
                  {   }=>            over each number N:
                   _&_                   map to N repeated N times
                                     > e.g.: [[1], [2, 2], [3, 3, 3]]
             Flat!                   flatten it
                                     > e.g.: [1, 2, 2, 3, 3, 3]
   Table[Max,                ]       create a "max" table with it
                                     > e.g.:
                                       1 2 2 3 3 3
                                       2 2 2 3 3 3
                                       2 2 2 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                              -1     subtract 1 from each
                                     > e.g.:
                                       0 1 1 2 2 2
                                       1 1 1 2 2 2
                                       1 1 1 2 2 2
                                       2 2 2 2 2 2
                                       2 2 2 2 2 2
                                       2 2 2 2 2 2
 _[                             ]    index the original array with this matrix
                                     > e.g.:
                                       2 0 0 3 3 3
                                       0 0 0 3 3 3
                                       0 0 0 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3



1

QBasic 1.1 , 127 байт

INPUT S$
FOR X=1TO LEN(S$)
K=K+X
R$=R$+STRING$(X,MID$(S$,X,1))
NEXT
FOR C=1TO K
?STRING$(C-1,MID$(R$,C,1))RIGHT$(R$,K-C+1)
NEXT

-4 завдяки DLosc .

Використовується змінена версія алгоритму Python 2 xnor .

Введення - це рядок без котирування. Вихід - \nрозділений без зайвих пробілів або \ns.


1

QBasic , 111 байт

Анонімна функція, яка запитує на введення та виведення на консоль.

INPUT s$
n=LEN(s$)
FOR y=1TO n
FOR l=1TO y
?
FOR x=1TO n
z=x
IF y>x THEN z=y
?STRING$(x,MID$(s$,z));
NEXT x,l,y

Виглядає добре - але ви не маєте на увазі "повну програму"? Я не думаю, що QBasic має "анонімні функції".
DLosc

0

Php 7.1 , 163 байт

Через CLI, вказуючи номер як аргумент:

<?foreach(str_split($argv[1])as$k=>$d)$a[]=array_fill(0,$s+=$k+1,array_fill(0,$s,$d));foreach(array_replace_recursive(...array_reverse($a))as$v)echo join($v)."\n";

Не так гольф:

$n = 123;

foreach(str_split($n) as $k => $d) {
    $s += $k + 1;
    $a[] = array_fill(0, $s, array_fill(0, $s, $d));
}

foreach(array_replace_recursive(...array_reverse($a)) as $v)
    echo implode('', $v) . "\n";

Вихід:

122333
222333
222333
333333
333333
333333

Спосіб:

В основному будуйте багатовимірні квадрати масивів, що складаються з цифри, а потім накладають їх усі (array_replace_recursive).

(Так, я знаю, що це бентежно довго.)


Якщо вхід - це заздалегідь визначений масив цифр, а ехо-імплодея / приєднання видаляється / замінюється присвоєнням списку переліку цифр, це може бути скорочено до приблизно 119 байт, так як ще довго.
Progrock


0

Japt, 12 байт

Приймає введення як рядок, виводить масив рядків.

Ë+pE
¬£h°YçX

Спробуй це


Пояснення

            :Implicit input of string U
Ë           :Map each character D at 0-based index E
  pE        :  Repeat D E times
 +          :  Append to D
\n          :Reassign to U
¬           :Split to character array
 £          :Map each element X at 0-based index Y
   °Y       :  Increment Y
     çX     :  Repeat X Y times
  h         :  Replace the first Y characters in U with that



0

Луа, 149 140 байт

Функція, яка приймає список цифрових рядків і друкує результат у stdout. Це моя перша спроба кодового гольфу (і вибір мови не допомагає), тож потерпіть зі мною :)

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

function(a)F,s=0,""for b=1,#a do s=s..a[b]:rep(b)end;for b=1,#a do io.write((s.."\n"):rep(b))F,z=F+b,a[b+1]or""s=z:rep(F)..s:sub(F+1)end end

Безголівки:

G = function(p)
    F,s = 0,""
    for i=1,#p do
        s=s..p[i]:rep(i)
    end
    for i=1, #p do
        io.write((s.."\n"):rep(i))
        F,z = F+i, p[i+1]or""
        s = z:rep(F)..s:sub(F+1)
    end
end
-- allows to pass the argument list from stdin
-- example: {"1", "2", "3", "4", "5"}
G(load("return " .. io.read())())


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.