Перемежування реверсу


20

Давши рядок, переверніть її перемежовуючи. Ось як це зробити для abcdefghiта abcdefghij0-індексованого:

  1. Відокремте знаки на парні індекси від символів за непарними показниками:
    ацегі
     bdfh
    ацегі bdfhj
  2. Зворотній знак символів на непарні показники:
    ацегі
     hfdb
    ацегі jhfdb
  3. Переплутайтеся в один рядок:
    ahcfedgbi 
    ajchefgdib

Правила

  • Ви повинні підтримувати як парні, так і непарні довжини.
  • 0-індекс, ви повинні повернути символи за непарними індексами, навіть не парними.
  • Звичайно, 1-індексний, звичайно, ви повинні змінювати символи на парні індекси, а не непарні.
  • Вхід буде складатися з друкованого ASCII (кодові точки 32-126), без нових рядків.
  • Ви можете приймати введення або як рядок, або як список знаків (НЕ 1-рядових рядків). Наприклад, String/ char[]або char*дозволено, але String[]/ char[][]або char**ні.

Тестові кейси

Input
Output

Hello, World!
HdlroW ,olle!

Hello World!
H!llooW rlde

ABCDEFGHIJKLMNOPQRSTUVWXYZ
AZCXEVGTIRKPMNOLQJSHUFWDYB

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
 }"{$y&w(u*s,q.o0m2k4i6g8e:c<a>_@]B[DYFWHUJSLQNOPMRKTIVGXEZC\A^?`=b;d9f7h5j3l1n/p-r+t)v'x%z#|!~

P
P

AB
AB

xyz
xyz

Для порожнього рядка поверніть сам порожній рядок.



Я пам’ятаю, що це був тип «секретного коду» (на кшталт свинячого латину), якого ми дізналися, як діти у 80-х чи 90-х, щось спільне зі словом «паркан» чи щось таке, але моя пам’ять трохи нечітка. Ми з друзями використовували це для кодування таємних повідомлень, і я не думаю, що дорослі, які знайшли наші листи, ніколи їх не з'ясовували ...
phyrfox

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

Ага, я пам’ятаю, що робив це.
12Me21

Відповіді:


7

Желе , 7 байт

s2ZU2¦Z

Це повна програма.

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

Як це працює

s2ZU2¦Z  Main link. Argument: s (string)

s2       Split s into pairs.
  Z      Zip/tranpose, grouping characters by the parity of their indices.
     ¦   Sparse application:
   U         Upend; reverse both strings in the pair.
    2        Replace the second string with the reversed string.
      Z  Zip/transpose, interleaving the two strings.

Ось саме моє рішення байт-байтом ...
Ерік Вихідний

3
Подібні уми чудово думають. ;)
Денніс

12

MATL , 8 байт

t2L)P5M(

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

t     % Implicit input. Duplicate
      % STACK: 'abcdefghi', 'abcdefghi'
2L    % Push [2, 2, 1j]. This represents 2:2:end when used as an index
      % STACK: 'abcdefghi', 'abcdefghi', [2, 2, 1j]
)     % Get entries at those indices
      % STACK: 'abcdefghi', 'bdfh'
P     % Flip
      % STACK: 'abcdefghi', 'hfdb'
5M    % Push [2, 2, 1j] again
      % STACK: 'abcdefghi', 'hfdb', [2, 2, 1j]
(     % Write entries at those indices. Implicit display
      % STACK: 'ahcfedgbi'

5
Так 2Lсамо "Push [2,2,1j]", і 5M"Push [2,2,1j] знову" ... А деякі кажуть, що мови для гри в гольф не читаються!
Лев

3
@Leo :-D 2Lстворює заздалегідь заданий літерал. 5M- це автоматичний буфер обміну, в якому зберігаються входи до останніх функціональних дзвінків. Фактично його можна було замінити 2Lна той самий підрахунок байтів
Луїс Мендо,

7

Аліса , 10 байт

/ZY
\IOR@/

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

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

Пояснення

Як я вже сказав, дзеркала ( /\), новий рядок і @вони є лише для того, щоб ip рухався в правильному напрямку і припиняв програму наприкінці. Фактичний код, лінеалізований, такий:

IYRZO
I      Input a line
 Y     Unzip it into its even positions and its odd ones
  R    Reverse the odd positions
   Z   Zip it back again
    O  Output

Я б сказала, що прямо, просто.


Якби тільки я міг зрозуміти, як працюють дзеркала в кутах ...
Луїс Мендо

@LuisMendo спочатку ви проходите крізь дзеркало, завдяки чому ви переходите від кардинального (горизонтального / вертикального) до порядкового (діагонального) режиму чи навпаки. Потім, якщо ви перебуваєте в кардинальному режимі, ви переходите на іншу сторону рядка / стовпця, тоді як, якщо ви перебуваєте в порядковому режимі, ви відскакуєте назад на кут. У цьому випадку дзеркало на південному сході зустрічається в порядковому режимі, змушує вас перейти на кардинальний і перегорнути на початок другого рядка, де інше дзеркало змушує вас повернутися до порядкового порядку і почати рух у напрямку північного сходу
Лев

А, значить, підстрибування відбувається лише по діагоналі, в тому ж напрямку, звідки ви прийшли. Тоді це простіше, ніж я думав. Спасибі!
Луїс Мендо

6

Java (OpenJDK 8) , 108 96 94 93 байт

Збережено 1 байт за допомогою @ акуратний трюк Нейла використанняs[s.length+~i|1]

String f(char[]s){int a=s.length,b=0;String c="";for(;b<a;b++)c+=s[b%2<1?b:a+~b|1];return c;}

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


1
Java під 100 байт ... здається законним.
Ерік Аутгольфер

" Java (OpenJDK 8 ) " Тоді чому ви використовуєте метод Java 7 без рекурсії? Використання лямбда Java 8, замінивши String f(char[]s)з s->.. І ви можете зберегти байти, а, поставивши intініціалізації усередині для циклу: for(int a=s.length,b=0;b<a;b++). Спробуйте в Інтернеті.
Kevin Cruijssen




3

Желе , 9 байт

Ḋm2U
m2żÇ

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

Ḋm2U Helper Link -> Dequeue (return last len-1 elements), take every second element, reverse
m2żÇ Main Link -> Take every second element, then interleave with the result of the helper link

-1 байт завдяки Деннісу


Якщо ви заміните ¢на Ç, вам не потрібне ³посилання для помічника.
Денніс

@ Денніс О, що я думав, що зробив це вперше Спасибі!
HyperNeutrino

3

Сітківка ,17 13 байт

O^$`(?<=\G.).

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

Виправлена ​​помилка завдяки Нілу.

Збережено 4 байти завдяки Кобі.

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


Остання тестова скринька неправильна. Вам потрібно буде використовувати $замість #.
Ніл

@Neil Уотс, ви абсолютно праві. Виправлено!
FryAmTheEggman

Ви можете \Gзамість цього використати вигляд позаду, а ви можете видалити$ : O^`(?<=\G.).(12 байт)
Кобі

1
@Kobi Дякую за поради! Але, на жаль, лише здавалося, що я можу видалити, $оскільки всі матеріали були відсортовані в лексикографічному порядку. Я додав новий тестовий випадок, на якому ваш код не вдасться.
FryAmTheEggman

@FryAmTheEggman - Зрозумів, хороший момент. Здогадайтесь, це була лише удача.
Кобі


2

APL (Dyalog) , 9 байт

Потрібно ⎕IO←0(для багатьох систем за замовчуванням) для правильного визначення непарних і парних.

⌽@{2|⍳≢⍵}

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

 реверс

@ на елементи, відфільтровані за допомогою маски, є результатом нанесення

{ анонімна функція

2| мод-2

 показники

 відрізок (довжина)

 аргумент

} на аргумент


У v16 навіть не було, коли це питання було розміщено?
Zacharý

@ Zacharý Це було в бета-версії, але це вже навіть не має значення .
Adám

О, так я думаю, зараз ти будеш використовувати v17?
Zacharý

1

Рода , 34 байти

f a{a/=""a[::2]<>reverse(a[1::2])}

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

Пояснення

a/=""                    Convert the argument a into an array of length-1 strings
      <>                 Interleave
a[::2]                   Every even element of a with
        reverse(a[1::2]) Every odd element of a reversed

Ось альтернативне рішення за тим же рахунковим рахунком

36 34 байт

{[_/""]|_[::2]<>reverse(_1[1::2])}

Це анонімна функція, яка приймає введення як рядок із вхідного потоку.




1

Haskell , 63 байти

(_:r)!(a:s)=a:s!r
_!_=[]
f s=([' '|even$length s]++reverse s)!s

Спробуйте в Інтернеті!Використання: f "some string".

Для непарних рядків, таких як abcdefghi, функція fпередає рядок та його повернення до функції !, яка чергує взяття символів з обох рядків. Для рівних рядків це не спрацьовує, і нам потрібно спочатку додати фіктивний символ, щоб отримати правильне зміщення.


1

C, 69 байт

c,l;f(char*s){l=strlen(s);for(c=0;c<l;++c)putchar(s[c&1?l-l%2-c:c]);}

Досить просто. Проходить рядок, друкуючи або поточний символ, або протилежний.

Необережений і пояснив:

f(char *str) {
    int len = strlen(str);      // Get the total length
    for(int c = 0; c<len; ++c)  // Loop over the string
        putchar(s[              // Print the char that is,
            c & 1               // if c is odd,
                ? l - l % 2 - c // c chars from the end (adjusting odd lengths),
                : c             // and at index c otherwise
        ]);
}


1

Japt , 14 13 байт

12 байт коду, +1 для -P прапора.

Збережено 1 байт завдяки @Shaggy

¬ë íU¬Åë w)c

Пояснення:

¬ë íU¬Åë w)c
¬                   Split the input into an array of chars
 ë                  Get every other char, starting at index 0
   í                Pair with:
    U¬                Input, split into a char array
      Å               .slice(1)
       ë              Get every other char
         w            Reverse
           c       Flatten
-P                 Join into a string

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


Хм, ë2,1досить некрасиво. Я думаю, що ви можете зробити це ó oзамість цього, можливо ...
ETHproductions

@ETHproductions Так, я думаю, що Åëтеж працює.
Олівер

О, приємний :-)
ETHproductions


1

K (oK) , 18 байт

Рішення:

{x[w:&2!!#x]:x@|w}

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

Приклади:

> {x[w:&2!!#x]:x@|w}"Hello, World!"
"HdlroW ,olle!"
> {x[w:&2!!#x]:x@|w}"Hello World!"
"H!llooW rlde"

Пояснення:

Інтерпретується здебільшого справа наліво, знайдіть символи непарних індексів, переверніть їх і поверніть їх у рядок

{x[w:&2!!#x]:x@|w} / solution
{                } / lambda function with implicit parameter x
         #x        / count x,    #"Hello, World!" -> 13
        !          / til,        !13 -> 0 1 2 3 4 5 6 7 8 9 10 11 12
      2!           / 2 modulo,   2!0 1 2 3 4 5 6 7 8 9 10 11 12 -> 0 1 0 1 0 1 0 1 0 1 0 1 0
     &             / where true, @0 1 0 1 0 1 0 1 0 1 0 1 0 -> 1 3 5 7 9 11
   w:              / store in variable w
               |w  / reverse w,  |1 3 5 7 9 11 -> 11 9 7 5 3 1
             x@    / index into x at these indices
 x[        ]:      / assign right to x at these indices

1

J, 26 байт

[:,@,./(0 1$~#)]`(|.@])/.]

неозорий

[: ,@,./ (0 1 $~ #) ]`(|.@])/. ]

пояснення

  • (0 1$~#)]`(|.@])/.]Використовуйте клавішу, /.щоб розділити вхід на парні / непарні групи: (0 1$~#)створює визначення групи, циклічно повторюючи 0 і 1 на довжину введення. Ми використовуємо герундиальну форму Key для свого основного дієслова ]`(|.@]), яке застосовує тотожність до першої групи та обертає другу групу:(|.@]) .
  • Тепер, коли у нас є дві групи, непарна перевернута, ми просто з’єднуємо їх і сплющуємо: ,@,./

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


21 байт з (\:2|#\)({~/:)#\<.#\.та 19 байт з [:,@,./]]| ./. ~ 2 | # `
миль

спасибі миль. чи є друкарська помилка у другій? Я отримую помилку
Jonah

@miles також перший: я розумію, як він аналізує і технічно те, що відбувається, але я не бачу загальної стратегії. Ви можете уточнити?
Йона

о так, це повинно бути [:,@,./]]`|./.~2|#\, кліщі розібралися
милі

17 байт з0,@|:]]`|./.~2|#\
миль

0

Python 3, 93 87 байт

lambda s:"".join("".join(t)for t in zip(s[::2],reversed(s[1::2])))+("",s[-1])[len(s)%2]

Замінити reversed(s[1::2])з , s[1::2][::-1]щоб зберегти 4 байта
г -

Він зводиться до 83 байтів і збиваються зрештою:f=lambda s,j="".join:j(j(t)for t in zip(s[::2],s[1::2][::-1]))+("",s[-1])[len(s)%2]
Містер Xcoder

0

Perl 6 ,  63 58  55 байт

{[~] .comb[{flat roundrobin (0,2...^*>=$_),[R,] 1,3...^*>=$_}]}

Перевірте це

{[~] flat roundrobin .comb[{0,2...*},{$_-1-$_%2,*-2...*}]}

Перевірте це

{[~] flat roundrobin .comb[{0,2...*},{[R,] 1,3...^$_}]}

Перевірте це

{  # bare block lambda with implicit parameter 「$_」

  [~]                 # reduce using string concatenation operator

    flat              # make the following a flat list

    roundrobin        # grab one from each of the following 2 lists,
                      # repeat until both are empty

    .comb\            # split the input into graphemes (implicit method call)

    [                 # index into that sequence



      { 0, 2 ... * }, # code block producing every non-negative even number


      {               # code block producing reversed odd numbers
                      # (「$_」 here contains the number of available elements)

        [R,]          # reduce with reversed comma operator
                      # (shorter than 「reverse」)

        1, 3 ...^ $_  # odd numbers stopping before it gets
                      # to the number of input elements
      }


    ]
}

Мені довелося скористатися, roundrobinа не zipтому, що zipзупиняється, як тільки вичерпується один із вхідних списків.




0

GNU APL 1.2, 24 байти

R[X]←⌽R[X←2×⍳⌊.5×⍴R←⍞]◊R

APL працює справа наліво. ⍴R←⍞призначає користувальницьке введення Rта потім оцінює його довжину. Половину цього перемножимо на множення на .5і застосуємо функцію підлоги.повертає всі числа від 1 до аргументу.

APL працює на масивах, тому масив, який ми щойно отримали з подвоєння кожного елемента, дає нам просто рівні показники (1-індексований, тож покладається на⎕IO 1).

При доступі до декількох індексів вектора APL надає елементи цих індексів у векторі. R[X←2×⍳⌊.5×⍴R←⍞]дає просто парні елементи. обертає елементи. Потім присвойте повернені значення назад рівним індексам (привласнення цих індексів Xзберігає 6 байт).

є роздільником заяви. Після завершення реверсування оцініть Rдля друку результату.


0

Perl 5, 46 + 3 для прапора -F = 49 байт

while(++$x<@F){print$F[$x%2?$x-1:@F-$x-$#F%2]}

Використовує -Fпрапор для автоматичного розділення введення на масив символів,@F . Проводиться через масив і виводить цей елемент для парного індексу або індексу (плюс один для рядка непарної довжини) з кінця для непарного введення.

Здійснює введення за допомогою наступного рядка. Без останнього нового рядка можна просто змінити попередній приріст на$x приріст.

Ще трохи читабельніше:

while(++$x<@F) { #While the index is less than the number of elements in the array. $x is 1-indexing the array despite the fact that perl is 0-indexed because it keeps us from having to use a proper for loop or a do-while loop
    if($x%2) { #If $x is odd
        print $F[$x-1] #Print the element
    } else {
        print $F[@F-$x-$#F%2] #Print from the end. $#F%2 fixes it for odd length strings    
    }
}

0

05AB1E , 21 байт

DgÉi¶«}2ô.BøRćR‚˜øJ¶K

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

Я здогадуюсь, причина цього не було зроблено в 05AB1E, але це тому, що це валовий ...

Але в інший раз zipфункція автоматичного падіння останнього елемента завдає шкоди замість допомоги.

PS Якщо у вас є пропозиції щодо вдосконалення моєї відповіді, опублікуйте свою власну; це, ймовірно, достатньо покращення, щоб гарантувати отримання балів. Мені дуже соромно за цю відповідь.


0

q / kdb +, 70 56 47 38 35 29 27 байт

Рішення:

{x[w]:x(|)w:(&)#:[x]#0 1;x}

Приклад:

q){x[w]:x(|)w:(&)#:[x]#0 1;x}"Hello, World!"
"HdlroW ,olle!"
q){x[w]:x(|)w:(&)#:[x]#0 1;x}"Hello World!"
"H!llooW rlde"

Пояснення:

Знайдіть непарні індекси рядка, скасуйте цей список, витягніть елементи в цих точках, а потім переставте їх на місце початковому рядку.

{x[w]:x reverse w:where count[x]#0 1;x} / ungolfed
{                                   ; } / lambda function with two lines
                                 0 1    / the list (0;1)
                                #       / take
                        count[x]        / length of input
                  where                 / indices where this is > 0
                w:                      / save in variable w
        reverse                         / reverse this list
      x                                 / index into x at these points
     :                                  / assignment             
 x[w]                                   / assign x at indices with new values
                                     x  / return x

Зміни:

  • -9 байт; вимикання countдля (#:), tilдля (!), whereдля (&:)і reverseдля (|:).

  • -3 байти; вимикання (#:)для (#), (&:)для (&)і (|:)для(|)

  • -6 байт; завершити перезапис

  • -2 байти; використовуючи завдання, а не застосовувати


0

05AB1E , 12 байт

RDgÈúøvyNÉè?

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

RDgÈúøvyNÉè?   Implicit input: "abcdefghij"
R              Reverse the string: "jihgfedcba"
 DgÈú          Put (length is even?1:0) spaces in front of it " jihgfedcba"
     ø         Zip (reinjects the input implicitly): ["a ", "bj", "ci", ...]
      vy       For each element of the list
        NÉè    Extract&push element[iteration is odd?1:0] 
           ?   Print without newline
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.