Перестройте прямоугольный массив из угла


30

У меня когда-то был красивый прямоугольный массив. Это было очень симметрично, но, к сожалению, оно развалилось, и теперь у меня есть только верхний левый угол. Ваша задача будет восстановить исходный массив.

Ваша программа получит двумерный массив целых чисел. Для простоты синтаксического анализа вы можете предположить, что все они находятся между 1 и 9. Ваша задача состоит в том, чтобы перевернуть столбцы массива, его строки и оба, сшить вместе результирующие углы и вернуть полученный массив.

Вы можете предположить, что размеры массива будут как минимум 1x1.

Тестовые случаи:

Input:
1 2 3
4 5 6

Output:
1 2 3 3 2 1
4 5 6 6 5 4
4 5 6 6 5 4
1 2 3 3 2 1

Input:
1

Output:
1 1
1 1

Input:
9
9
9

Output:
9 9
9 9
9 9
9 9
9 9
9 9

Это , побеждает меньше байтов!


1
Бьюсь об заклад, уголь может сделать это в возрасте до 10
FantaC

1
@tbfninja chat.stackexchange.com/transcript/message/43184083#43184083 но может быть короче с другим форматом ввода.
Павел

@MagicOctopusUrn да
Павел

2
@tfbninja WS⟦ι⟧‖M→↓возможно? 5 байтов для чтения ввода и 4 для его отражения.
Нил

4
Я на 99% уверен, что есть язык, который делает это с (или с каким-то похожим персонажем), просто не могу вспомнить, какой: c
Rod

Ответы:


1

Протон , 29 байт

a=>[b+b[by-1]for b:a+a[by-1]]

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

Есть несколько других интересных подходов:

Протон , 29 байт

a=>map(g,(g=x=>x+x[by-1])(a))

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

Вы можете определить зеркальную подфункцию gin-line, потому что Proton. Это не короче, хотя.

Протон , 36 байт

(a=>[x[0]for x:zip(*(a+a[by-1]))])*2

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

Это должно быть (a=>zip(*(a+a[by-1])))*224 байта, но функция zip полностью нарушена. По сути, вы зеркально отражаете это и архивируете, а затем делаете это дважды (вы можете умножить функцию на положительное целое число, чтобы применить функцию несколько раз).


19

Холст , 1 байт

Попробуй это здесь!

Выводится как многострочная строка


2
Хорошо, @Rod назвал это один ха! Это тоже твой язык Дзайма?
Волшебный осьминог Урна

Черт ... Я должен был вспомнить ...
полностью человек

@MagicOctopusUrn Да, IIRC это в основном SOGL II: электрический бугалу?
Только для ASCII


5

Python 3, 38 байт

lambda a:[b+b[::-1]for b in a+a[::-1]]

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

Принимает список списков и возвращает список списков.

Объяснение:

lambda a:                              # anonymous lambda function
                   for b in a+a[::-1]  # for each row in the array and the upside-down array
          b+b[::-1]                    # the row with its reverse appended
         [                           ] # return in a list


5

Сетчатка , 13 байт

\%`$
$^$`
Vs`

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

объяснение

\%`$
$^$`

В каждой строке ( %) сопоставьте конец строки ( $), вставьте в начало ( $^) обратную ( ) всей строки $`и напечатайте результат с помощью завершающего перевода строки ( \). Это делает отражение вдоль вертикальной оси и печатает первую половину вывода.

Vs`

Это просто переворачивает всю строку, что эквивалентно повороту на 180 ° или, в нашем случае (из-за горизонтальной симметрии), отражению вдоль горизонтальной оси. Таким образом, это работает в том, что V(обратное) регулярное выражение по умолчанию (?m:^.*$), которое обычно соответствует каждой строке строки. Тем не менее, мы активируем однострочную опцию s, которая также .сопоставляет перевод строки, и поэтому это регулярное выражение по умолчанию фактически соответствует всей строке.

Результат этого печатается автоматически в конце программы, давая нам вторую половину результата.


Это не похоже ни на какой вкус регулярного выражения, о котором я знаю: P
Pavel

@Pavel Потому что Retina - это не просто регулярное выражение. :)
Эрик Outgolfer

@Pavel единственная часть этого кода, которая является настоящим регулярным выражением, находится $в первой строке. ;) Я добавлю объяснение позже.
Мартин Эндер

5

05AB1E , 2 байта

∞∊

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


   # Input:Array of String | ['12','34']
---#-----------------------+------------------------------------------
∞  # Mirror horizontally.  | [12,34]       -> [1221,3443]
 ∊ # Mirror vertically.    | [1221,3443]   -> [1221\n3443\n3443\n1221]

Кредит для г Xcoder указывая на то , что массивы строки могут считаться 2D массивов и Павла для его подтверждения.



Для простоты разбора вы можете предположить, что они все между 1 и 9 - так что я думаю, что это действительно. В ожидании подтверждения Павла, я думаю
г-н Xcoder

@ Mr.Xcoder, это было то, что у меня было изначально, затем двумерные массивы TIO в качестве входных данных были странными ... поэтому пришлось придумать этот заголовок.
Волшебная Осьминог Урна

Строка - это массив символов, поэтому список строк по-прежнему является двумерным массивом. @ Mr.Xcoder решение действительно.
Павел

Кулио, у меня работает.
Волшебная Осьминог Урна






3

awk, 88 байт

{s="";for(i=NF;i>0;i--)s=" "$i s" "$i;a[FNR]=s;print s}END{for(i=NR;i>0;i--)print a[i]}

3
Добро пожаловать в PPCG! Хороший первый ответ :)
HyperNeutrino

2

Треугольность , 31 байт

...)...
..IEM..
.DRs+}.
DRs+...

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

объяснение

Удаление символов, которые составляют отступы, вот что делает программа:

)IEMDRs+}DRs+ – Full program. Takes a matrix as a 2D list from STDIN.
)             – Push a 0 onto the stack.
 I            – Take the input at that index.
  E           – Evaluate it.
   M    }     – For each row...
    DR        – Duplicate and replace the second copy by its reverse.
      s+      – Swap and append.
         DR   – Duplicate the result and replace the second copy by its reverse.
           s+ – Swap and append.


2

APL + WIN, 11 байт

Запрашивает двумерный массив целых чисел.

m⍪⊖m←m,⌽m←⎕






2

Рубин , 35 байт

->a{r=->b{b+b.reverse}
r[a].map &r}

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

Лямбда, принимающая 2D-массив и возвращающая 2D-массив. Это просто, но в любом случае вот версия без загадок:

->a{
  r=->b{ b+b.reverse } # r is a lambda that returns the argument and its reverse
  r[a].map &r          # Add the array's reverse, then add each row's reverse
}

2

Java 8, 140 131 байт

m->{String r="";for(int a=m.length,b=m[0].length,i=a+a,j;i-->0;r+="\n")for(j=b+b;j-->0;)r+=m[i<a?i:a+a+~i][j<b?j:b+b+~j];return r;}

Объяснение:

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

m->{                      // Method with integer-matrix parameter and String return-type
  String r="";            //  Result-String, starting empty
  for(int a=m.length,     //  Amount of rows of the input-matrix
          b=m[0].length,  //  Amount of columns of the input-matrix
          i=a+a,j;        //  Index integers
      i-->0;              //  Loop over double the rows
      r+="\n")            //    After every iteration: append a new-line to the result
     for(j=b+b;j-->0;)    //   Inner loop over double the columns
       r+=                //    Append the result with:
          m[i<a?          //     If `i` is smaller than the amount of rows
             i            //      Use `i` as index in the input-matrix
            :             //     Else:
             a+a+~i]      //      Use `a+a+i-1` as index instead
           [j<b?          //     If `j` is smaller than the amount of columns
             j            //      Use `j` as index in the input-matrix
            :             //     Else:
             b+b+~j];     //      Use `b+b+j-1` as index instead
  return r;}              //  Return the result-String

2

J 11 байт

Функция анонимного молчаливого префикса.

|:@(,|.)^:2

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

|: транспонирования

@(…) результат:

, аргумент, сопровождаемый

|. его обратный

^:2 и все это сделано дважды


2

СНОБОЛ4 (CSNOBOL4) , 119 113 байтов

	T =TABLE()
I	X =X + 1
	I =INPUT	:F(D)
	OUTPUT =T<X> =I REVERSE(I)	:(I)
D	X =X - 1
	OUTPUT =GT(X) T<X>	:S(D)
END	

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

Принимает ввод в виде строк на STDIN, без пробелов. Это работает только потому, что цифры бывают 1-9и не получится в противном случае.


Я понимаю, почему люди больше не используют этот язык. Это так странно.
Павел

1
@Pavel SNOBOL - действительно ужасный язык для работы. это более современная C-реализация, которая имеет дополнительные встроенные функции, такие как REVERSE; насколько я могу судить, оригинал поддерживал только целочисленную арифметику.
Джузеппе

2

C (gcc) , 114 111 байтов

j,i;f(A,w,h)int*A;{for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)printf("%d,",A[(i<h?i:h+h+~i)*w+(j<w?j:w+w+~j)]);}

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

C (gcc) , 109 байт (злоупотребляя простотой разбора)

  • Спасибо Кевину Круйссену за предложение разрешить ввод однозначных целых чисел; сохранил два байта.
j,i;f(A,w,h)int*A;{for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)putchar(A[(i<h?i:h+h+~i)*w+(j<w?j:w+w+~j)]+48);}

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


Вы можете сохранить 3 байта, инвертируя циклы. for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)
Кевин Круйссен

Не выполняет спецификацию; печатает массив, а не возвращает его.

« Для простоты синтаксического анализа вы можете предположить, что все они находятся в диапазоне от 1 до 9. », поэтому вы можете удалить запятую в printf("%d"дополнительном байте -1.
Кевин Круйссен

@ Rogem Я бы сказал, что печать массива подпадает под принятый ввод / вывод.
Джонатан Фрех

1
@KevinCruijssen Большое спасибо; используя простоту разбора, мне удалось сбрить еще один байт.
Джонатан Фрех

2

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

θ‖C→↓

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

Спасибо только ASCII за лучший формат ввода.


Интересно, допустим ли этот формат ввода, так как боюсь, что уголь не сможет обработать ввод иначе. Если это не так, я с удовольствием удалю этот ответ.
Эрик Outgolfer

Это действительный ввод / вывод.
Павел

@Pavel Мне просто интересно, потому что вы сказали, что «ваша программа получит двумерный массив целых чисел», в то время как строка является одномерной (и нет, внешняя []не делает ее двухмерной).
Эрик Outgolfer

@ ASCII-only Charcoal действительно нуждается в лучшем методе ввода / вывода ...
Нил

@Neil Его не пинговали здесь, но я пинговал его по TNB. :)
Эрик Outgolfer



1

V , 12 байт

yGæGPÎy$æ_|P

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

Объяснение:

yG              " Yank every line
  æG            " Reverse the order of the lines
    P           " Paste what we yanked
     Î          " On every line:
      y$        "   Yank the whole line
        æ_      "   Reverse the whole line
          |     "   Move to the beginning of the line
           P    "   Paste what we yanked
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.