Роздрукуйте хвилясті рядки по черзі


23

Виклик

Напишіть програму або функцію, яка приймає в якості параметрів рядок sі ціле число n. Програма повинна надрукувати (або повернути) рядок при перетворенні таким чином:

Починаючи вгорі ліворуч і рухаючись вниз і праворуч, запишіть sяк хвиля висоти n. Потім, зверху вниз, комбінуйте кожен рядок у вигляді рядка (без пробілів).

Приклад

Враховуючи рядок "WATERMELON" і висоту 3:

Хвиля має виглядати так:

W   R   O
 A E M L N
  T   E

Потім з'єднайте рядки зверху вниз:

WRO
AEMLN
TE

Отже, ваша програма повинна повернути рядок "WROAEMLNTE"

Так само "WATERMELON" висотою 4 повинен видавати наступну хвилю:

W     E
 A   M L
  T R   O
   E     N

Потім ваша програма повинна повернути рядок "WEAMLTROEN"

Правила

Вхідні дані

Введення даних може бути здійснено у будь-якому розумному форматі. Рядок може бути в будь-якому випадку, який ви віддаєте перевагу. Ви можете припустити, що0 < n <= s.length

Вихід

Вихід повинен складатися лише з перетвореного рядка (повернутого чи надрукованого в STDOUT), а також будь-яких останніх рядків.

Оцінка балів

Це , тому найкоротша відповідь у байтах виграє! Стандартні лазівки заборонені.

Випробування

Input                        Output

programmingpuzzles, 5 ->     piermnlsomgzgapzru
codegolf, 3           ->     cgoeofdl
elephant, 4           ->     enlatehp
1234567, 3            ->     1524637
qwertyuiop, 1         ->     qwertyuiop

Чи можна припустити n> 1? Прошу уточнити, а якщо не додати тестовий випадок
Луїс Мендо

1
Ви можете припустити n > 0, але n=1це дійсний випадок. Я зараз оновлю питання.
Cowabunghole

2
@Cowabunghole Я знаю. :) Пов'язане означає лише, що дещо схожі, і відповіді, які існують, можуть бути корисними для цього завдання. Я згадую лише про те, щоб вони з'явилися на пов'язаних питаннях праворуч. Пов'язані! = Дублюються. ;)
Кевін Круїссен

5
Я ніколи не бачив шифру залізничної огорожі, кодованого лише однією рейкою. Just sayin '
wooshinyobject

1
@Veskah Ах так, старий твій подвійний трюк13.
wooshinyobject

Відповіді:


5

Лушпиння , 6 байт

δÖK…¢ḣ

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

Працює n = 1також.

Пояснення

δÖK…¢ḣ  Implicit inputs, say n=4 and s="WATERMELON"
     ḣ  Range: [1,2,3,4]
    ¢   Cycle: [1,2,3,4,1,2,3,4,1,2,3,4..
   …    Rangify: [1,2,3,4,3,2,1,2,3,4,3,2..
δÖK     Sort s by this list: "WEAMLTROEN"
        Print implicitly.

Функція вищого порядку δпрацює таким чином під кришкою. Припустимо, у вас функція вищого порядку, яка приймає функцію уніар та список та повертає новий список. Наприклад, Öбере функцію і сортує список, використовуючи її як ключ. Потім δÖбере двійкову функцію і два списки, скріплює списки разом, застосовує Öдля сортування пар, використовуючи бінарну функцію як ключову, і, нарешті, проектує пари на другу координату. Ми використовуємо Kяк ключову функцію, яка просто повертає перший аргумент, а другий ігнорує.


6

MATL , 16 байт

Zv3L)t?yn:)2$S}i

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

Пояснення

Розглянемо входи 5, 'programmingpuzzles'.

Zv     % Input, implicit: number n. Symmetric range
       % STACK: [1 2 3 4 5 4 3 2 1]
3L     % Push [1 -1+1j]. When used as an index, this means 1:end-1
       % STACK: [1 2 3 4 5 4 3 2 1], [1 -1+1j]
)      % Index. Removes last element
       % STACK: [1 2 3 4 5 4 3 2]
t      % Duplicate
       % STACK: [1 2 3 4 5 4 3 2], [1 2 3 4 5 4 3 2]
?      %   If non-empty and non-zero
       %   STACK: [1 2 3 4 5 4 3 2]
  y    %   Implict input: string s. Duplicate from below
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2], 'programmingpuzzles'
  n    %   Number of elements
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2], 18
  :    %   Range
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2], [1 2 3 ··· 17 18]
  )    %   Index modularly
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2 1 2 3 4 5 4 3 2 1 2]
  2$S  %   Two-input sort: stably sorts first input as given by the second
       %   STACK: 'piermnlsomgzgapzru'
}      % Else. This branch is entered when n=1. The stack contains an empty array
       %   STACK: []
  i    %   Take input
       %   STACK: [], [], 'programmingpuzzles'
       % End, implicit
       % Display stack, implicit. Empty arrays are not displayed


5

J , 54, 29, 27 26 байт

-1 байт завдяки hoosierEE

([\:#@[$[:}:|@i:@<:@]) ::[

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


@LuisMendo Хм, ще раз пропустив щось важливе. Спасибі! Виправлено.
Гален Іванов

1
Я спочатку це теж пропустив, потім зрозумів і попросив ОП. Мав би бути тестовий випадок з n=1самого початку
Луїс Мендо

1
|@i:замість того, щоб [:|i:економити байт
hoosierEE

@hoosierEE Так, дякую!
Гален Іванов

5

R , 68 байт

function(s,n)intToUtf8(unlist(split(utf8ToInt(s),-(n:(2.9-n)-1)^2)))

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

  • -10 байт завдяки @Giuseppe
  • -17 байт, тому що я був дурний
  • -9 байтів і n=1виправлено регістр завдяки @ J.Doe
  • -3 байти завдяки @JayCe


3

05AB1E (спадщина) , 11 8 байт

Σ²Lû¨¾è¼

Натхненний відповіддю MATL @LuisMendo .
-3 байти завдяки @Adnan за те, що я ідіот ..>.>

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

Пояснення:

Σ           # Sort the (implicit) input-string by:
 ²L         #  Create a list in the range [1, second input-integer]
            #   i.e. 5 → [1,2,3,4,5]
   û        #  Palindromize it
            #   i.e. [1,2,3,4,5] → [1,2,3,4,5,4,3,2,1]
    ¨       #  Remove the last item
            #   i.e. [1,2,3,4,5,4,3,2,1] → [1,2,3,4,5,4,3,2]
     ¾è     #  Index into it (with wraparound) using the counter_variable (default 0)
            #   i.e. counter_variable = 0 → 1
            #   i.e. counter_variable = 13 → 4
       ¼    #  And after every iteration, increase the counter_variable by 1

ПРИМІТКА: counter_variableВикористовується, оскільки у версії Python Legacy 05AB1E Σу вбудованого індексу не було вбудованого індексу N, який він має у новій версії для перезапису Elixir 05AB1E. То чому я все-таки використовую Legacy версію? Оскільки в перезаписі Elixir це неявно перетворює рядок до списку символів, вимагаючи додаткового }Jперетворення його назад у рядок для виведення (а також він містить помилку прямо зараз, де èвзагалі не працює, щоб індексувати у подовжений список ..: S)


Вам не потрібна ¹g∍частина, оскільки 05AB1E використовує циклічну індексацію для è.
Аднан

@Adnan Ах, я ідіот ..>.> Спасибі!
Кевін Крейссен

2

Japt , 16 байт

¬üÏu´VÑ aV°ÃÔc q

Перевірте це в Інтернеті!

Пояснення

 ¬ üÏ   u´ VÑ  aV° Ã Ô c q
Uq üXY{Yu--V*2 aV++} w c q    Ungolfed
                               Implicit: U = input string, V = size of wave
Uq                             Split U into chars.
   üXY{            }           Group the items in U by the following key function:
       Y                         Take the index of the item.
        u--V*2                   Find its value modulo (V-1) * 2.
               aV++              Take the absolute difference between this and (V-1).
                                 This maps e.g. indices [0,1,2,3,4,5,6,7,...] with V=3 to
                                                        [2,1,0,1,2,1,0,1,...]
                                 The items are then grouped by these values, leading to
                                 [[2,6,...],[1,3,5,7,...],[0,4,...]].
                     w         Reverse the result, giving [[0,4,...],[1,3,5,7,...],[2,6,...]].
                       c       Flatten.
                         q     Join back into a single string.

oO Цей üметод новий?
Luis felipe De jesus Munoz

Так, додано в суботу :-)
ETHproductions

Ви можете взяти дані як масив символів, щоб зберегти байт і вивести один або використовувати -Pпрапор для збереження іншого 2.
Shaggy

2

Желе , 8 байт

6 байт не відповідає висоті 1; два байти, які використовуються для його вирішення ... можливо, 7 можна знайти?

ŒḄṖȯ1ṁỤị

Дьядичне посилання, що приймає додатне ціле число та список символів, який дає список символів.

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

Як?

ŒḄṖȯ1ṁỤị - Link: positive integer N; list of characters, T
ŒḄ       - bounce (implicit range of) N -> [1,2,3,...,N-1,N,N-1,...,3,2,1]
  Ṗ      - pop off the final entry         [1,2,3,...,N-1,N,N-1,...,3,2]
   ȯ1    - OR one                          if this is [] get 1 instead
     ṁ   - mould like T (trim or repeat to make this list the same length as T)
      Ụ  - grade-up (get indices ordered by value - e.g. [1,2,3,2,1,2] -> [1,5,2,4,6,3])
       ị - index into T

2

JavaScript (ES6), 75 байт

Коротша формула, запропонована @MattH (-3 байти)

Вводиться як " (string)(n).

s=>n=>--n?[...s].map((c,x)=>o[x=x/n&1?n-x%n:x%n]=[o[x]]+c,o=[])&&o.join``:s

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


JavaScript (ES7), 78 байт

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

Вводиться як " (string)(n).

s=>n=>--n?[...s].map((c,x)=>o[x=n*n-(x%(n*2)-n)**2]=[o[x]]+c,o=[])&&o.join``:s

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


Моє рішення виявилося досить схожим на ваше. Ви можете зберегти -3 байти, обчислюючи індекс вставки oз, x/n&1?n-x%n:x%nа не n*n-(x%(n*2)-n)**2.
Метт

@MattH Чудово зроблено. Спасибі!
Арнольд


1

MBASIC , 146 159 155 байт

1 INPUT S$,N:DIM C$(N):P=1:D=1:FOR I=1 TO LEN(S$):C$(P)=C$(P)+MID$(S$,I,1)
2 IF N>1 THEN P=P+D
3 IF P=N OR P=1 THEN D=-D
4 NEXT:FOR I=1 TO N:PRINT C$(I);:NEXT

Оновлено для обробки n = 1

Вихід:

? programmingpuzzles, 5
piermnlsomgzgapzru

? codegolf, 3
cgoeofdl

? elephant, 4
enlatehp

? 1234567, 3
1524637

? WATERMELON, 4
WEAMLTROEN

? qwertyuiop, 1
qwertyuiop

Наразі не підтримує випадок n = 1.
wooshinyobject

Оновлено для обробки справи n = 1
wooshinyobject

Збережено 4 байти, очистивши порівняння.
wooshinyobject

1

Perl 6 , 49 байт

->\n{*.comb.sort({-abs n-1-$++%(2*n-2||1)}).join}

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

Вводить введення як функцію curried.

Пояснення:

->\n{*.comb.sort({-abs n-1-$++%(2*n-2||1)}).join}
->\n{                                           }  # Take an number
     *.comb        # Turn the string into a list of chars
           .sort({                       })   # And sort them by
                           $++    # The index of the char
                              %(2*n-2||1)  # Moduloed by 2*(n-1) or 1 if n is 0
                       n-1-       # Subtract that from n-1
                   abs            # get the absolute value
                  -               # And negate to reverse the list
                                          .join  # and join the characters

Послідовність, за якою вона сортується, виглядає так (для n=5):

(-4 -3 -2 -1 0 -1 -2 -3 -4 -3 -2 -1 0 -1 -2 -3 -4 -3 -2 -1)

1

J , 24 байти

4 :'x\:(#x)$}:|i:<:y'::[

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

Явне діадичне дієслово. Запускайте так, як 'codegolf' f 3.

Як це працює

4 :'x\:(#x)$}:|i:<:y'::[    x: string, y: height
4 :                         Define a dyadic verb:
               i:<:y        Generate a range of -(y-1) .. y-1
            }:|             Take absolute value and remove last
       (#x)$             1) Repeat to match the string's length
    x\:                     Sort x by the decreasing order of above
                     ::[    If 1) causes `Length Error`, return the input string instead

Зазвичай явна функція займає додаткові 5 байт у вигляді n :'...'. Але якщо додати поводження з помилками, різниця знизиться до 2-х байт за рахунок паронів та простору в (tacit)<space>::.


Чому я завжди схильний використовувати sort up?! Ваше явне дієслова все ще на 3 байти коротше. Гарне рішення!
Гален Іванов


1

Powershell, 99 95 байт

param($s,$n)$r=,''*$n
$s|% t*y|%{$r[((1..$n+$n..1)*$s.Length|gu)[$i++*($n-gt1)]-1]+=$_}
-join$r

Тестовий сценарій:

$f = {

param($s,$n)$r=,''*$n
$s|% t*y|%{$r[((1..$n+$n..1)*$s.Length|gu)[$i++*($n-gt1)]-1]+=$_}
-join$r

}

@(
    ,("1234567", 3            ,     "1524637")
    ,("qwertyuiop", 1         ,     "qwertyuiop")
    ,("codegolf", 3           ,     "cgoeofdl")
    ,("elephant", 4           ,     "enlatehp")
    ,("programmingpuzzles", 5 ,     "piermnlsomgzgapzru")
) | % {
    $s,$n,$e = $_
    $r = &$f $s $n
    "$($r-eq$e): $r"
}

Вихід:

True: 1524637
True: qwertyuiop
True: cgoeofdl
True: enlatehp
True: piermnlsomgzgapzru

Пояснення

Сценарій:

  • створює масив рядків,
  • заповнює рядки відповідними значеннями,
  • і повертає об'єднані рядки.

Вираз ((1..$n+$n..1)*$s.Length|gu генерує подібну послідовність 1,2,3,3,2,1,1,2,3,3,2,1... та видаляє сусідні дублікати. guПсевдонім для Get-Unique .

  • Для $n=3дедупільованої послідовності є:1,2,3,2,1,2,3,2,1...
  • Для $n=1дедупільованої послідовності є:1

Вираз $i++*($n-gt1) повертає індекс у дедупльованій послідовності. =$i++якщо $n>1, інакше=0


1

Рубін , 75 65 байт

->s,h{a=['']*h;x=-k=1;s.map{|c|a[x+=k=h-x<2?-1:x<1?1:k]+=c};a*''}

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

Приймає введення як масив символів, повертає рядок

Як це:

  • Створення hрядків
  • Для кожного символу вхідного рядка вирішіть, у який рядок його ввести, виходячи з його індексу (індекс рядка, який буде змінено, збільшується до, hа потім вниз, поки0 і т.д.)
  • Поверніть всі рядки, з'єднані разом


@GB це не працює для останнього випадку
Асона Тухід

1

C, 142 134 байт

8 байт збережено завдяки Джонатану Фреху

Код:

t;i;j;d;f(s,n)char*s;{for(t=strlen(s),i=0;i<n;i++)for(j=0;j+i<t;j=d+i+(n<2))d=j-i+2*~-n,putchar(s[i+j]),i>0&i<n-1&d<t&&putchar(s[d]);}

Пояснення:

// C variable and function declaration magic
t;i;j;d;f(s,n)char*s;{
    // Iterate through each "row" of the string
    for(t=strlen(s),i=0;i<n;i++)
        // Iterate through each element on the row
        // Original index iterator here was j+=2*(n-1), which is a full "zig-zag" forward
        // The (n<2) is for the edge case of n==1, which will break the existing logic.
        for(j=0; j+i<t; j=d+i+(n<2))
            // If j+i is the "zig", d is the "zag": Original index was d=j+i+2*(n-i-1)
            // Two's complement swag here courtesy of Jonathan Frech
            d=j-i+2*~-n,
            putchar(s[i+j]),
            // Short circuit logic to write the "zag" character for the middle rows
            i>0 & i<n-1 & d<t && putchar(s[d]);
}

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


1
Привіт і ласкаво просимо до PPCG; хороший перший гольф. 134 байти (якщо вважати GCC).
Джонатан Фрех

0

Вугілля деревне , 21 байт

⭆NΦη¬⌊E²﹪⁺μ⎇νι±ι∨⊗⊖θ¹

мiм±i=0(мод2н-2)

 N                      First input as a number
⭆                       Map over implicit range and join
   η                    Second input
  Φ                     Filter over characters
       ²                Literal 2
      E                 Map over implicit range
          μ             Character index
             ι ι        Outer index
              ±         Negate
            ν           Inner index
           ⎇            Ternary
         ⁺              Plus
                   θ    First input
                  ⊖     Decremented
                 ⊗      Doubled
                    ¹   Literal 1
                ∨       Logical Or
        ﹪               Modulo
     ⌊                  Minimum
    ¬                   Logical Not
                        Implicitly print

0

SNOBOL4 (CSNOBOL4) , 191 байт

	S =INPUT
	N =INPUT
	A =ARRAY(N)
	A<1> =EQ(N,1) S	:S(O)
I	I =I + -1 ^ D
	S LEN(1) . X REM . S	:F(O)
	A<I> =A<I> X
	D =EQ(I,N) 1
	D =EQ(I * D,1)	:(I)
O	Y =Y + 1
	O =O A<Y>	:S(O)
	OUTPUT =O
END

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

Бере Sпотім Nна окремих лініях.

Пояснення:

	S =INPUT			;* read S
	N =INPUT			;* read N
	A =ARRAY(N)			;* create array of size N
	A<1> =EQ(N,1) S	:S(O)		;* if N = 1, set A<1> to S and jump to O
I	I =I + -1 ^ D			;* index into I by I + (-1)^D (D starts as '' == 0)
	S LEN(1) . X REM . S	:F(O)	;* extract the first character as X and set S to the
					;* remaining characters, jumping to O when S is empty
	A<I> =A<I> X			;* set A<I> to A<I> concatenated with X
	D =EQ(I,N) 1			;* if I == N, D=1
	D =EQ(I * D,1)	:(I)		;* if I == D == 1, D = 0. Goto I
O	Y =Y + 1			;* increment the counter
	O =O A<Y>	:S(O)		;* concatenate the array contents until last cell
	OUTPUT =O			;* and print
END



0

Pyth , 22 21 байт

|seMhD,V*lz+PUQP_UQzz

Здійснює введення так, як nслід за sокремими рядками. Спробуйте в Інтернеті тут або одразу підтвердіть усі тестові випадки тут .

|seMhD,V*lz+PUQP_UQzz   Implicit: Q=eval(input()), z=remaining input

             UQ         Range [0-Q)
            P           All but last from the above
                         e.g. for Q=3, yields [0,1]
               P_UQ     All but last of reversed range
                         e.g. for Q=3, yields [2,1]
           +            Concatenate the previous two results
                          e.g. for Q=3, yields [0,1,2,1]
        *lz              Repeat len(z) times
      ,V           z    Vectorised pair the above with z, truncating longer to length of shorter
                          e.g. for Q=3, z=WATERMELON, yields:
                          [[0,'W'],[1,'A'],[2,'T'],[1,'E'],[0,'R'],[1,'M'],[2,'E'],[1,'L'],[0,'O'],[1,'N']]
    hD                  Sort the above by the first element
                          Note this is a stable sort, so relative ordering between equal keys is preserved
  eM                    Take the last element of each
 s                      Concatenate into string
                          Note that if n=1, the result of the above will be 0 (sum of empty array)
|                   z   If result of above is falsey, yield z instead

Редагувати: збережений байт перемістив порожній чек до кінця обробки. Попередня версія: seMhD,V*lz|+PUQP_UQ]0z


0

Червоний , 153 байти

func[s n][i: v: m: 1 b: collect[foreach c s[keep/only reduce[v i c]v: v + m
if all[n > 1(i: i + 1)%(n - 1)= 1][m: -1 * m]]]foreach k sort b[prin last k]]

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

Пояснення:

f: func [ s n ] [                      ; s is the string, n is the height
    i: 1                               ; index of the current character in the string
    v: 1                               ; value of the "ladder"
    m: 1                               ; step (1 or -1)
    b: collect [                       ; collect the values in a block b
        foreach c s [                  ; foreach character in the string 
            keep/only reduce [ v i c ] ; keep a block of the evaluated [value index char] 
            i: i + 1                   ; increase the index
            v: v + m                   ; calculate the value 
            if all [ n > 1             ; if height is greater than 1 and
                    i % (n - 1) = 1    ; we are at a pick/bottom of the ladder
                   ]
                [ m: -1 * m ]          ; reverse the step
        ]
    ]
    foreach k sort b [ prin last k ]   ; print the characters in the sorted block of blocks
]

0

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


Рішення 1

PHP , 152 144 116 байт

<?php
for($i=0;$i<$n=$argv[2];$i++)
    for($j=$i;$s=$argv[1][$j];$j+=$n<2|(($f=!$f|!$i)?$i<$n-1?$n+~$i:$i:$i)*2)
        echo $s;
  • 8 байт завдяки @JoKing
  • 28 байт завдяки @Shaggy

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


Рішення 2

PHP , 162 байти

<?php
$s=$argv[0];
$n=$argv[1];
$l=strlen($s);
for($i=0;$i<$l;){
    for($j=0;$j<$n&&$i<$l;)
        $a[$j++].=$s[$i++];
    for($j=$n-2;$j>0&&$i<$l;)
        $a[$j--].=$s[$i++];
}
echo join($a);

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


Вам не потрібно ініціалізувати, $fа $n-1-$iможе бути $n-~$i. 144 байти
Джо Кінг

-28 байт на вдосконаленнях @ JoKing.
Shaggy

Уп; що ламається коли n=1. Цей працює для того ж числа байтів.
Кудлатий

Ви також можете використовувати короткі теги та видалити пробіл, echoщоб зберегти ще 5 байт
Shaggy

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