Повернуть столбец


28

Если задано целое число k и либо блок текста, либо двумерный массив, в котором внутренние массивы могут иметь неодинаковую длину (что напоминает блок текста), поверните каждый символ или элемент в k-м столбце вверх или вниз до следующей позиции это существует.

пример

Поверните 20-й столбец следующего текста (на основе 1):

A line with more than k characters.
A longer line with more than k character.
A short line.
Rotate here: ------v--
This is long enough.

This is not enough.
Wrapping around to the first line.

Выход:

A line with more thtn k characters.
A longer line with aore than k character.
A short line.
Rotate here: ------m--
This is long enoughv

This is not enough.
Wrapping around to .he first line.

Вращение k-го столбца того же ввода, где 35 < k <42, приведет к неизменности введенного текста.

правила

  • Вы можете использовать необработанный текст, массив строк, двумерный массив символов или любой разумный формат для представления данных. Вы также можете использовать типы данных, отличные от символов.
  • Число возможных значений типа данных элементов должно быть не менее 20, если от этого зависит длина вашего кода, в противном случае - не менее 2. Это может быть подмножество символов или других значений, поддерживаемых в собственном типе.
  • Пробелы и любые нулевые значения являются обычными значениями, если вы разрешите их вводить. Вы также можете просто исключить их в типе элемента.
  • Изменение правила: вам разрешается заполнять более короткие массивы общим значением по умолчанию (например, пробелами), если вы предпочитаете использовать массивы одинаковой длины для хранения данных.
  • k может быть 0 или 1. Гарантируется, что он находится внутри самой длинной строки на входе (подразумевается, что на входе есть хотя бы одна непустая строка).
  • Вы можете выбрать, будет ли он вращаться вверх или вниз.
  • Либо просто поверните одну позицию, либо поверните n позиций, где n - положительное целое число, указанное во входных данных.
  • Самый короткий код выигрывает.

Ответы:


8

APL (Dyalog Extended) , 9 байтов SBCS

Полная программа. Запрашивает stdin для 2D блока текста, затем k (на основе 0 или 1, в зависимости от текущей настройки APL), затем n . Положительные n вращаются вверх, отрицательные n вращаются вниз.

Домен состоит из одного из следующих:

  1. все символы Юникода, кроме пробелов , оставляя 1114111 допустимых значений, что больше требуемых 20.

  2. все числа, кроме 0 , оставляют приблизительно 2 129 допустимых значений, что больше требуемых 20.

Поскольку APL требует, чтобы 2D-блоки были прямоугольными, входные данные должны быть дополнены пробелами / нулями. Это можно сделать автоматически, введя слева от списка строк / числовых списков.

⎕⌽@≠@⎕⍢⍉⎕

Попробуйте онлайн! (видимые пробелы на самом деле неразрывные пробелы)

 подсказка для текстового блока

⍢⍉ в то время как транспонировано:

@⎕ примените следующее к строке ввода:

  @≠ у элементов, отличных от их прототипа (пробел для символов, ноль для чисел):

   ⎕⌽ поверните «входные» шаги влево

APL (Dyalog Unicode) , 22+ байта SBCS

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

0~¨⍨↓⍉⎕⌽@(0≠⊢)@⎕⍉↑0,¨⎕

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

Это, конечно, означает, что нули не допускаются в числовых аргументах. Соответствующая программа для всех чисел будет 0заменена на три вхождения ' 'и, следовательно, будет использовать пробел в качестве заполнения:

' '~¨⍨↓⍉⎕⌽@(' '≠⊢)@⎕⍉↑' ',¨⎕

Если мы действительно хотим получить полные диапазоны (даже смесь) как символов, так и чисел, мы можем использовать null в качестве заполнения:

n~¨⍨↓⍉⎕⌽@(n≠⊢)@⎕⍉↑⎕,¨⍨n←⎕NULL

И, наконец, если бы мы хотели включить нулевые значения и объекты во входной домен, мы могли бы определить класс заливки и использовать его экземпляры в качестве заливок:

~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEWFIX':Class C' ':EndClass'

Теперь официально объявите это (и новые ответы как это) как действительный ответ. Извините, если вас это слишком беспокоило.
jimmy23013

Короче, чем ваша нулевая версия n~¨⍨↓⍉⎕⌽@(≢¨)@⎕⍉↑⎕,¨⍨n←⊂⊂⍬. Может быть, вы могли бы добавить modded в свое расширение, чтобы помочь дальнейшему игре в гольф (но я не совсем уверен, насколько они полезны).
jimmy23013

@ jimmy23013 Да, я думал об этом, но тогда он не может принимать списки произвольно вложенных вещей. Последний из них является окончательным решением, особенно если Cи Iлокализованы , поэтому они не загрязняют:{~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEW⎕FIX I←C←':Class C' ':EndClass'}
адам

11

Python 2 , 111 110 109 99 98 96 94 байта

lambda a,n:[l[:n]+(l[n:]and[L[n]for L in a[i:]+a if L[n:]][1]+l[n+1:])for i,l in enumerate(a)]

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

Принимает ввод в виде списка строк и столбца с 0 индексами и возвращает список строк.

Колонна вращается вверх 1.

-11 байт, спасибо Джо Кингу


7

Java 8, 107 106 135 107 байт

k->m->{int s=m.length,i=-1;for(char p=0,t;i<s;t=m[i%s][k],m[i%s][k]=p<1?t:p,p=t)for(;m[++i%s].length<=k;);}

+29 байт для исправления ошибки ..

0 индексированные; вращается вниз, как в примере.
Ввод как символьная матрица; изменяет char-матрицу вместо возврата новой для сохранения байтов.

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

Объяснение:

k->m->{                 // Method with integer and char-matrix parameters and no return-type
  int s=m.length,       //  Amount of lines in the matrix `s`
      i=-1;             //  Index-integer `i`, starting at -1
  for(char p=0,         //  Previous-character, starting at 0
           t;           //  Temp-char, uninitialized
      i<s               //  Loop as long as `i` is smaller than `s`:
      ;                 //    After every iteration:
       t=m[i%s][k],     //     Set the temp to the `k`th character of the `i`'th line
       m[i%s][k]=       //     Replace the `k`'th character of the `i`'th line with:
         p<1?           //      If `p` is still 0:
          t             //       Set it to the temp we just set
         :              //      Else:
          p,            //       Set it to the previous-character instead
       p=t)             //     And then replace `p` with the temp for the next iteration
    for(;m[++i          //   Increase `i` by 1 before every iteration with `++i`,
             %s].length //   And continue this loop until the length of the `i`'th line
           <=k;);}      //   is smaller than or equal to the input `k`

1
Одна вещь, которую я заметил, заключается в том, что вы предполагаете, что в первой строке достаточно символов char p=m[0][k]- если это не так, не вызовет ли это исключение? Хорошая работа, кстати. Вы бьете мою попытку C # с большим отрывом :)
Дана

@dana Ах, дерьмо, вы правы .. Я, вероятно, бью вас с такой разницей, потому что я случайно сделаю это предположение .. Постараюсь исправить это.
Кевин Круйссен

1
@dana Исправлено, спасибо, что заметили.
Кевин Круйссен

2
@dana И снова на 107. ;)
Кевин Круйссен

1
nknКint p=0,t;pm[i%s][k]=(char)(p<1?t:p)

7

Zsh , 94 87 78 74 69 байт

-7 байтов путем замены на арифметическую троицу, -9 байтов путем изменения символа на месте (TIL), -4 байта путем ввода индекса в stdin и строк в качестве аргументов, -5 байтов с использованием строки вместо массива хранить вращающиеся символы.

read i
for s;c+=$s[i]
c=$c[-1]$c
for s;s[i]=$c[$[$#s<i?0:++j]]&&<<<$s

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

Вот ключи, чтобы заставить этот ответ работать:

  • $array[0]или $string[0]всегда пусто
  • $array[n]или $string[n]пусто, если n больше длины массива / строки
  • array[i]=cили string[i]=cзаменит элемент / символ.
  • В $[$#s<i?0:++j], jэто не увеличивается , если $#s<i.

В исходном 94-байтном ответе я столкнулся с интересной проблемой, связанной с использованием <<<для печати. Я должен был использовать, echoчтобы обойти это:

for s;echo $s[0,i-1]$c[$[$#s<i?0:++j]]${s:$i}

Причину этого можно увидеть здесь:

echo $ZSH_SUBSHELL   # prints 0
<<< $ZSH_SUBSHELL    # prints 1

Здесь строки запускаются в подоболочках, потому что они передаются как stdin другой программе. Если программа не указана, она неявно передается cat. Вы можете увидеть это с <<< $_. <<< $ZSH_SUBSHELLпохоже на echo $ZSH_SUBSHELL | cat. Так как нам нужно увеличивать j, мы не можем быть в недолговечности.


6

R , 62 байта

function(L,n){L[A,n]<-rep(L[A<-L[,n]!=' ',n],2)[1+1:sum(A)];L}

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

Принимает ввод как заполненную пробелами матрицу символов. Вращается вверх Все благодаря Кириллу Л. !

R , 74 байта

function(L,n){substr(L[A],n,n)=rep(substr(L[A<-nchar(L)>=n],n,n),2)[-1]
L}

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

Это представление предшествует разрешению дополненных линий.

Псевдоним substrздесь не сработает, потому что мы звоним substrи substr<-на первой линии.

Ввод / вывод как список не дополненных строк; вращается вверх.


Поскольку консенсус позволяет изменять исходные данные, мы можем сделать эту безумную вещь
Кирилл Л.

Кроме того, OP ослабил правила, так что теперь можно работать с матрицами с пробелами, что-то вроде этого
Кирилл Л.

@KirillL. Я не думаю, что R передается по ссылке, поэтому нам, вероятно, не разрешено это делать; мне кажется, что это работает, только если аргумент назван Lв родительской среде. Я с удовольствием обновлюсь до отступов!
Джузеппе

Ах, я вижу, ты прав. Я пришел к этой идее, глядя на мой ответ Ruby (который таким образом сохраняет 1 байт :)), но языки действительно ведут себя по-разному в этой ситуации.
Кирилл Л.

5

C # (интерактивный компилятор Visual C #) , 82 байта

k=>a=>{var c='0';a.Where(b=>b.Count>k&&((b[k],c)=(c,b[k])).c>0).ToList()[0][k]=c;}

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

Благодарим @ASCIIOnly за предложение, foreachкоторое привело к экономии 12 байт!

-8 байт благодаря @someone!
-1 байт благодаря @EmbodimentofIgnorance!



Возможно 183, если использовать целые числа вместо символов
данные

@ExpiredData ew int вместо char
только для ASCII

Жаль, что вы не можете использовать foreach потому что это противоположный порядок :(
только ASCII

1
Используйте dynamicдля объединения объявлений и сохранения 2 байтов (я никогда раньше этого не видел!) Попробуйте онлайн!
мое местоимение monicareinstate


3

05AB1E , 21 байт

ʒg‹}U¹εXyk©diX®<èIèIǝ

Можно определенно играть в гольф еще немного ..

0 индексированные; ввод и вывод как список строк.
Он вращается вниз, как в примере, но <его можно заменить на> на вращение вверх.

Попробуйте онлайн (нижний колонтитул присоединяется к списку с помощью новых строк, удалите его, чтобы увидеть фактический вывод списка).

Объяснение:

ʒ  }             # Filter the (implicit) input-list by:
 g               #  Where length of the current string
                #  is larger than the (implicit) input-integer
    U            # Pop and store this filtered list in variable `X`
¹ε               # Map over the first input-list again:
  Xyk            #  Get the index of the current string in variable `X`
     ©           #  Store it in the register (without popping)
      di         #  If the index is not -1, so the current string is present in variable `X`
        X®<è     #   Get the (index-1)'th string in variable `X`
            Iè   #   Get the character at the index of the input-integer
              Iǝ #   And insert it at the index of the input-integer in the current string

3

K4 , 41 байт

Решение:

{.[x;i;:;.q.rotate[1;x . i:(&y<#:'x;y)]]}

Объяснение:

Не уверен , что если я что - то ... 0 индекс отсутствует, поворачивает вверх (изменить 1к -1разворотом вниз)

{.[x;i;:;.q.rotate[1;x . i:(&y<#:'x;y)]]} / the solution
{                                       } / lambda taking implicit x and y
 .[x; ;:;                              ]  / index apply assignment back into x
         .q.rotate[1;                 ]   / left rotate 1 character
                           (       ; )    / two item list
                                    y     / index to rotate
                               #:'x       / count (#:) each (') input
                             y<           / index less than ?
                            &             / indexes where true
                         i:               / assign to variable w
                     x .                  / index into x
     i                                    / indexes we saved as i earlier

3

Japt v2.0a0, 18 байт

На основе 0 с вводом и выводом в виде многострочной строки. Вращается на 1.

Должен быть более короткий метод!

yÈr\S_Y¦V?Z:°TgXrS

Попытайся

yÈr\S_Y¦V?Z:°TgXrS     :Implicit input of string U & integer V
y                      :Transpose
 È                     :Pass each line X at 0-based index Y through the following function & transpose back
  r                    :  Replace
   \S                  :  RegEx /\S/g
     _                 :  Pass each match Z through the following function
      Y¦V              :    Test Y for inequality with V
         ?Z:           :    If true, return Z, else
            °T         :    Increment T (initially 0)
              g        :    Index into
               XrS     :    X with spaces removed

Я не внимательно изучил комментарии и новые правила (так что, возможно, где-то упоминалось, что это разрешено сейчас, хотя это было не раньше), но разрешено ли пропускать пробелы при первоначальном вводе? Допустим, вы измените входной индекс на 6, ваш ответ будет пропускать пробел line withв первой строке и Rotate hereв четвертой строке, тогда как большинство других ответов будет также вращать этот пробел.
Кевин Круйссен

@KevinCruijssen, я немного перепутал всеми дополнительными правилами и пособий , но, если это является проблемой, это выглядит , как я могу обойти это, не позволяя пространства на входе. Я думаю.
Мохнатый

1
" Я думаю », эта часть действительно, как я бы тоже ответил, хаха. Я понятия не имею, что больше является обязательным и необязательным, но я думаю, что вы действительно можете пропустить пробелы во входных и выходных данных; Я думаю, что вы можете выбрать подсчет пробелов или нет; и я думаю, что вы можете использовать пробные пробелы в выводе или нет; и т. д. все на всех довольно запутанно. Ах, хорошо ..
Кевин Круйссен

3

Желе , 16 байт

z⁷⁹ịỴFṙ-ṁƲY⁸ṛ⁹¦"

Двоичная ссылка, принимающая список строк (списки символов, не содержащих символов новой строки) слева и целое число справа, которое возвращает список строк.

Попробуйте онлайн! (нижний колонтитул разделяется на новые строки, вызывает ссылку и снова присоединяется к новым строкам)

Как?

z⁷⁹ịỴFṙ-ṁƲY⁸ṛ⁹¦" - Link: lines L; index I        e.g. example in question; 20
z⁷               - transpose L with filler '\n'       ['AAART\nTW', '   oh\nhr', ...]
  ⁹ị             - Ith item                           'am\nv.\n\nt'
    Ỵ            - split at newlines                  ['am', 'v.', '', 't']
         Ʋ       - last four links as a monad - i.e. f(X):
     F           -   flatten                          'amv.t'
       -         -   -1
      ṙ          -   rotate left by                   'tamv.'
        ṁ        -   mould like X                     ['ta', 'mv', '', '.']
          Y      - join with newlines                 'ta\nmv\n\n.'
                 -   -- call this C
           ⁸     - chain's left argument, L
               " - zip with - i.e. [f(L1,C1), f(L2,C2), ...]:
              ¦  -   sparse application...
             ⁹   -   ...to indices: chain's right argument, I
            ṛ    -   ...of: right argument, Cn


2

Perl 6 , 38 33 байта

Изменяет массив на месте (правила не запрещают)

{@^a.grep(*>$^b+1)[*;$b].=rotate}

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


@joking Сначала я думал, что хранить его, а не выводить его, было бы немного обманом, но перечитывая правила, на самом деле нет никаких условий для вывода, так что ... ура. Выполнение (…) (…), чтобы получить 31, как у вас, определенно кажется обманом, так как он эффективно выводит вызов из блока, но это все равно можно сделать, когда 33 пропускают их одновременно с одним вызовом, поэтому я Я собираюсь пойти с этим.
user0721090601

ой, я вставил не ту ссылку. Вы получили то, что я хотел прокомментировать, хотя. Хотя ввод данных каррингом прекрасно (хотя в данном случае это не работает), а изменение аргумента, переданного по ссылке, является стандартным вариантом разрешенного ввода
Джо Кинг,

2

JavaScript (Node.js) , 52 байта

k=>a=>a.filter(b=>b[k]&&([b[k],a]=[a,b[k]]))[0][k]=a

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

-7 байт благодаря Шегги!

Еще не видел ответ JavaScript! Порт моего ответа C #.


63 байта . Может быть, можно играть в гольф дальше.
Мохнатый

@Shaggy - приятно :) большую часть времени я вижу ответы JS, делающие всякие сумасшедшие вещи. На этот раз я решил попробовать, так как у меня была стратегия.
Дана

1
О, приятно играть в гольф! :)
Лохматый

2

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

θJη⁰≔ΦKDLθ↓℅ιζUMζ§ζ⊖κ

Попробуйте онлайн! Ссылка на подробную версию кода. Принимает массив строк в качестве входных данных. 0 индексированные. Изменить: Теперь, когда PeekDirectionэто было исправлено, я могу управлять им напрямую. Объяснение:

θ

Распечатайте входные строки.

Jη⁰

Прыгайте на вершину колонны, которую нужно повернуть.

≔ΦKDLθ↓℅ιζ

Извлеките ячейки, которые были напечатаны в.

UMζ§ζ⊖κ

Замените каждую напечатанную ячейку значением предыдущей ячейки (циклически). Удобно значения ячеек считываются во время PeekDirectionвызова, поэтому тот факт, что MapCommandвызов записывает новые значения в ячейки, не имеет значения.


1

зернышко -rn , 32 байта

POgY#(g@_)>aFI,#gFiyAE@ySsg@i@ag

0 индексируется, вращается вниз. Попробуйте онлайн!

Фильтры для поиска индексов всех строк, достаточно длинных для участия в ротации. Затем зацикливается на этих строках, заменяя соответствующий символ в каждой строке временной переменной s. Повторное посещение первого ряда в конце снова меняет фиктивное значение.


1

Желе , 19 байт

ZnÄ×$ịḟ¹ṙ-;ɗɗʋ€⁹¦⁶Z

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

1-индексироваться. Вращается вниз Монадическая ссылка, которая принимает правый список строк Jelly (список списков символов) в качестве первого аргумента и k в качестве второго. Пробелы запрещены во входных данных, кроме правого отступа, но разрешены все другие символы.

Как реализовано в TIO, нижний колонтитул разбивает одиночный ввод строки на список строк и добавляет его справа, но это для удобства; насколько я понимаю, результатом этого шага является разрешенный ввод для основной ссылки согласно правилам.


1

GFortran , 199 байт

-20 или около того, читая из стандартного ввода, а не из файла
-14 , используя неявные целые числа для i, k, n
-4 путем удаления пробелов и::

Требуется ввод данных пользователем kи nв первой строке, где kнаходится столбец для поворота, и nколичество строк текста. Последующие входные данные - это строки текста, которые необходимо повернуть. Это было больно писать! Фортран такой педантичный!

character(99),allocatable::A(:);character(1)r,s
read(*,*)k,n;allocate(A(n))
do i=1,n;read(*,'(A)')A(i);r=A(i)(k:k)
if(r.ne.''.or.r.ne.' ')then;A(i)(k:k)=s;s=r;endif;enddo
A(1)(k:k)=s;print'(A)',A;end
  • Оригинальная, разыграная программа здесь, с комментариями и примечаниями к компиляции: rotcol.f
  • 203-байтовая версия: rextester.com
  • 199-байтовая версия (новая): попробуйте онлайн!

0

T-SQL, 195 байт

WITH C as(SELECT rank()over(order by i)r,sum(1)over()c,*FROM @t
WHERE len(x)>=@)SELECT
isnull(stuff(c.x,@,1,substring(e.x,@,1)),t.x)FROM @t t
LEFT JOIN c ON t.i=c.i
LEFT JOIN c e ON e.r%c.c+1=c.r

Попробуй онлайн версию без игры в гольф

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.