Промежуточное отражение массива строк

16

Давайте начнем с переопределения отражения символа в двумерном массиве символов:

Для заданного квадратного массива символов с четкими строчными буквами алфавита определите отражение буквы в матрице, поменяв ее местами с символом прямо напротив него через центр квадрата.

Таким образом, отражение буквы cв

abcde
fghij
klmno
pqrst
uvwxy

приведет к конфигурации

abwde
fghij
klmno
pqrst
uvcxy

потому что cи wбыли переключены.

Еще несколько примеров (с той же первоначальной конфигурацией, что и выше):

Отражение персонажа eсформирует

 abcdu
 fghij
 klmno
 pqrst
 evwxy

Отражение персонажа mсделало бы

 abcde
 fghij
 klmno
 pqrst
 uvwxy

Отражение персонажа bсформирует

 axcde
 fghij
 klmno
 pqrst
 uvwby

Соревнование

Для заданного двумерного массива символов с разными строчными буквами просмотрите каждый символ в данной строке и «отразите» его в матрице.

Пояснения: буквы в строке взяты из a-z, буквы уникальны, а массив не менее 1x1 и не более 5x5 (очевидно, поскольку в английском алфавите всего 26 символов). Символы в строке гарантированно будут во 2-м массиве. Строка длиной не более 100 символов.

вход

Строка s, целое число N, а затемNxN массив символов.

пример

Входные данные:

ac
2
ab
cd

Выход:

dc
ba

* Причина: во-первых, отражать aс d. Затем, отражают cс , bпотому чтоc это вторая буква во входной строке.


счет

  • Вывод может быть дан любым удобным способом .
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Текущий Победитель

NL628
источник
9
Полчаса не совсем достаточно времени, чтобы извлечь какую-либо значимую пользу из песочницы.
Пост Рок Гарф Хантер
3
Нет проблем, выглядит хорошо.
user202729
1
(также у нас есть таблица лидеров фрагмента стека )
user202729
6
50 часов - это слишком мало для того, чтобы принять победителя; как правило, вы хотели бы подождать неделю или около того. Однако в PPCG обычной практикой является не принимать никаких ответов, потому что это препятствует будущим ответам, и мы хотим, чтобы проблемы оставались открытыми навсегда.
HyperNeutrino
2
Все ваши примеры имеют символы в алфавитном порядке. Я предполагаю, что это не предположение, которое мы можем сделать? Кроме того, мы должны принять Nв качестве входных данных, если нам это не нужно?
Стьюи Гриффин

Ответы:

3

Октава , 85 68 66 байт

Использование evalс циклом внутри сэкономило много байтов! Я получил вдохновение от этого ответа по Луису Mendo !

@(c,N,A)eval"for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A"

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

Объяснение:

f=@(c,N,A)          % Anonymous function that takes the three input variables
eval"...          % Evaluate the string and run it:
 for C=c,          % Loop over the character list 'c'
  .. x=find(A==C)   % Find the index where the character C is in A, and store it as 'x'
  .. k=[x,N^2+1-x]  % Create a vector with the index of C, and the index of its reflection
   A(flip(k))=A(k)  % Swap the elements in these positions
  end               % End loop
  A"                % Display the new 'A'
Стьюи Гриффин
источник
2

Python 2 , 76 байт

lambda s,a:[a[[i,~i][(s.count(c)+s.count(a[~i]))%2]]for i,c in enumerate(a)]

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

Принимает участие:

  • s: строка
  • N: игнорируется
  • a: объединенная цепочка символов

Возвращает плоский список символов


Если у меня есть взять массив в виде списка:

Python 2 , 111 108 107 104 байта

lambda s,n,a:[[x[sum(map(s.count,x))%2]for i in range(n)for x in[[a[j][i],a[~j][~i]]]]for j in range(n)]

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

Принимает участие:

  • s: строка
  • n: int
  • a: 2D списки персонажей

Возвращает 2D список символов

TFeld
источник
1

Java 10, 126 123 116 байт

(s,n,m)->{for(var c:s)for(int N=n*n,i,j;N-->0;)if(m[i=N/n][j=N%n]==c){m[i][j]=m[n+~i][n+~j];m[n+~i][n+~j]=c;break;}}

Изменяет входную символьную матрицу вместо возврата новой для сохранения байтов.

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

Объяснение:

(s,n,m)->{        // Method with the three parameters and no return-type
  for(var c:s)    //  Loop over the characters given
    for(int N=n*n,i,j;N-->0;)
                  //   Inner loop over the matrix
      if(m[i=N/n][j=N%n]==c){
                  //    If the current character and matrix-value are equals:
        m[i][j]=m[n+~i][n+~j];m[n+~i][n+~j]=c;
                  //     Swap the values in the matrix at indices [i, j] and [n-i-1, n-j-1]
        break;}}  //     Stop the inner loop (go to next iteration of the outer loop)
Кевин Круйссен
источник
Черт, кодирование в Java! ??!?! +1 Def
NL628
1

Python 3 , 122 111 байт

lambda l,n,A:[[[A[a][b],A[~b][~a]][sum(map(l.count,[A[a][b],A[~b][~a]]))%2]for b in range(n)]for a in range(n)]

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

Возвращает двумерный массив символов.

Джо Кинг
источник
Вы должны быть в состоянии продвинуться в этом дальше. Ни один способ изменить матрицу ввода в Java не короче, чем в Python.; P Для начала (и сделать ее на 1 байт короче, чем на 1 байт длиннее, чем мой ответ Java): Удаление aи bи использовать n+~xи n+~yнепосредственно сохраняет 2 байта: a,b=n+~x,n+~y;A[x][y],A[a][b]=A[a][b],A[x][y]кA[x][y],A[n+~x][n+~y]=A[n+~x][n+~y],A[x][y]
Kevin Cruijssen
1

р , 74 61 байт

-13 байтов благодаря Джузеппе.

function(s,n,m){for(x in s)m[v]=rev(m[v<-(i=x==m)|rev(i)]);m}

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

Вводит вектор символов для поиска как s, размер матрицы как nи сама матрица как m. Если абсолютно необходимо принять первый аргумент как строку , это сильно испортит удовольствие.

Кирилл Л.
источник
Используя логические, а не числовые индексы, я сократил до 61 байта
Джузеппе
Вау, это значительное улучшение, спасибо большое.
Кирилл Л.
0

Желе , 15 14 байт

FW;Ṛi,C$¥¦/ṁḷY

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

Полная программа.

Объяснение:

FW; Ṛi, C $ ¥ ¦ / ṁḷY Основная ссылка. Ввод: ['ab', 'cd'] (слева), 'ac' (справа).
FW                    F latten и W рэп в списке. Текущее значение = ['abcd'].
  ; Объедините это с правильным аргументом. [ 'ABCD', 'а', 'с']
          / Уменьшить слева:
   ¦ ¦ Применить verse обратный в ...
    я ¥ индекс (правого аргумента в левом аргументе) ...
     , C $ и его индекс дополнения.

Последняя операция требует большего объяснения. Обозначим f = Ṛi,C$¥¦, затем для значения ['abcd','a','c']вычисляем ('abcd' f 'a') f 'c', что расширяется до:

Ṛi, C $ ¥ ¦ Функция f . Предположим, левый аргумент = 'abcd' и правый аргумент = 'a'
Ṛ Сначала вычислите обратное. Получи 'dcba'.
 i ¥ Чтобы вычислить индексы, к которым нужно применить, сначала индекс «a» в «abcd»
             is ('abcd' i 'a') = 1. (первый индекс)
  , C $ Тогда пара с (1 C) = 0. (последний индекс)
      ¦ Применить 'dcba' к 'abcd' в индексах 0 и 1:
Ьс д
               д CB
              ^ 1 ^ 0
              ====
              DBCA
user202729
источник
0

Сетчатка 0.8.2 , 96 байт

+`^(.)(.*¶(.|¶)*)((.)((.|¶)*))?\1(?(4)|(((.|¶)*)(.))?)((?<-3>.|¶)*$(?(3).))
$2$11$9$1$6$5$12
1A`

Попробуйте онлайн! Принимает строку sи массив символов в виде строки с разделителями новой строки без целого числа N. Объяснение: Каждый символ cиз sперерабатывается в свою очередь. Регулярное выражение соответствует двум равноудаленным позициям от концов массива, одно из которых является, cа другое - его зеркалом m. Эти символы поменялись местами и cудалены из s.

+`

Процессы каждого персонажа по sочереди.

^(.)

$1захватывает c.

(.*¶(.|¶)*)

$3захватывает стек символов в массиве с префиксом одного из cили m. $2захватывает остаток sплюс всех этих персонажей.

((.)((.|¶)*))?

Если mпредшествует c, $4имеет значение, $5захватывает mи $6захватывает символы между mи c. $7захватывает $6как стек, но его значение не используется.

\1

c теперь сопоставляется в самом массиве.

(?(4)|(((.|¶)*)(.))?)

Если mэто еще не было найдено, то при $8желании захватывает значение, в этом случае $9захватывает символы из cв m, $10захватывает $9как стек, который не используется, и $11захватывает m. Значение является необязательным в случае cи mявляется тем же символом.

((?<-3>.|¶)*$(?(3).))

$12захватывает символы, суффикс другого cиm . Балансировочная группа используется для обеспечения того, чтобы $12она $3была глубокой, то есть префикс и суффикс имеют одинаковую длину.

$2$11$9$1$6$5$12

Затем кусочки соединяются вместе - сначала остаток sи префикс массива, затем, если cпредшествует, mзатем mсередина, затем c, затем, если mпредшествуетc затем середина m, затем суффикс.

1A`

Теперь, когда sпусто, оно удалено.

Нил
источник
0

JavaScript, 85 байт

Принимает строку Sи массив Aкак объединенную строку.

([...S],[...A])=>S.map(c=>[A[j],A[i]]=[A[i=A.indexOf(c)],A[j=A.length+~i]])&&A.join``

darrylyeo
источник