Обернути стовпчик


28

Враховуючи ціле число k або блок тексту, або 2d масив, що внутрішні масиви можуть мати неоднакову довжину (що нагадує блок тексту), поверніть кожен символ або елемент у 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 дасть текст вводу без змін.

Правила

  • Ви можете використовувати необроблений текст, масив рядків, 2d масив символів або будь-який розумний формат для представлення даних. Ви також можете використовувати типи даних, крім символів.
  • Кількість можливих значень типу даних елементів має бути не менше 20, якщо від вас залежить довжина вашого коду, в іншому випадку - принаймні 2. Це може бути підмножина символів або інші значення, що підтримуються в рідному типі.
  • Пробіли та будь-який тип нульових значень - це лише звичайні значення, якщо ви дозволите їх у введенні. Ви також можете просто виключити їх у типі елементів.
  • Зміна правила: Вам дозволяється прокладати коротші масиви із загальним значенням за замовчуванням (наприклад, пробілами), якщо ви віддаєте перевагу використовувати масиви з однаковою довжиною для зберігання даних.
  • k може бути 0 або 1. Гарантоване перебування всередині найдовшого рядка на вході (мається на увазі, що вхід має принаймні один не порожній рядок).
  • Ви можете вибрати, обертається він вгору чи вниз.
  • Або просто оберніть одну позицію, або оберніть n позицій, де n - натуральне число, задане на вході.
  • Найкоротший код виграє.

Відповіді:


8

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

Повна програма. Запрошує stdin для 2D тексту тексту, потім k (на основі 0 або 1, залежно від поточного налаштування APL), потім n . Позитивне n обертання вгору, негативне n обертання вниз.

Домен складається з одного з наступних:

  1. всі символи Unicode, крім пробілів , залишаючи дозволені значення 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←⊂⊂⍬. Можливо, ви можете додати мод у своєму розширенні, щоб допомогти в подальшому гольфу (але я не зовсім впевнений, наскільки вони корисні).
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 bytes

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]- якщо цього немає, чи не буде це винятком? Гарна робота BTW. Ви побиття моєї C # спробу з великим відривом :)
Dana

@dana Ах, лайно, ти маєш рацію .. Я, мабуть, б'ю тебе за велику надбавку, тому що я випадково зробив це припущення .. Спробую це виправити.
Kevin Cruijssen

1
@dana Виправлено, дякую, що помітили.
Kevin Cruijssen

2
@dana І знову до 107. ;)
Кевін Круїссен

1
@EmbodimentofIgnorance Ах, забув , щоб змінити це , nщоб k. Зазвичай я використовую nдля цілих входів, але оскільки питання використовує я згодом змінив його (але, мабуть, не скрізь). Щодо того, мені знадобиться амплуа до char при призначенні до комірки ( ). І хоча я міг би сприймати дані як цілочисельну матрицю, я особисто думаю, що int-matrix = / = string / string-list / char-matrix ..kint p=0,t;pm[i%s][k]=(char)(p<1?t:p)
Кевін Круїйсен

7

Зш , 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<-в першому рядку.

Введення / виведення як список не прокладених ліній; обертається вгору.


Оскільки консенсус дозволяє змінювати входи, ми можемо зробити цю божевільну справу
Кирилл Л.

Крім того , ОП пом'якшені правила, так що тепер можна працювати з космічними прокладеними матрицями, що - щось на зразок цього
Кирило Львович

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

Ах, бачу, ти маєш рацію. Я придумав цю ідею, дивлячись на мою відповідь Рубі (яка економить цілий 1 байт таким чином :)), але мови справді поводяться по-різному в цій ситуації.
Кирило Л.

5

C # (Visual C # Interactive Compiler) , 82 байти

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

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

Заслуга @ASCIIОдин лише за те, foreachщо він призвів до економії в 12 байт!

-8 байт завдяки @someone!
-1 байт завдяки @EmbodimentofIgnorance!



Можливо, 183, якщо замість знаків використовуються ints
Термін дії даних минув,

@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

К4 , 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 передають їх одночасно одним викликом, тому я ' я йду з цим.
користувач0721090601

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

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 або близько того, читаючи з stdin, а не з файлу
-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

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