Drukuj falisty sznurek linia po linii

23

Wyzwanie

Napisz program lub funkcję, która przyjmuje parametry si liczbę całkowitą njako parametry. Twój program powinien wydrukować (lub zwrócić) ciąg po przekształceniu w następujący sposób:

Zaczynając w lewym górnym rogu i przechodząc w dół i w prawo, pisz sjako fala wysokości n. Następnie, od góry do dołu, połącz każdy wiersz jako ciąg (bez spacji).

Przykład

Biorąc pod uwagę ciąg „WATERMELON” i wysokość 3:

Fala powinna wyglądać następująco:

W   R   O
 A E M L N
  T   E

Następnie połącz rzędy od góry do dołu:

WRO
AEMLN
TE

Twój program powinien więc zwrócić ciąg „WROAEMLNTE”

Podobnie „WATERMELON” o wysokości 4 powinien wytworzyć następującą falę:

W     E
 A   M L
  T R   O
   E     N

Twój program powinien następnie zwrócić ciąg „WEAMLTROEN”

Zasady

Wkład

Dane wejściowe można przyjmować w dowolnym rozsądnym formacie. Ciąg może być w każdym przypadku, który wolisz. Możesz to założyć0 < n <= s.length

Wydajność

Dane wyjściowe powinny składać się tylko z transformowanego ciągu (zwracanego lub drukowanego do STDOUT) oraz wszelkich końcowych znaków nowej linii.

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w bajtach! Standardowe luki są niedozwolone.

Przypadki testowe

Input                        Output

programmingpuzzles, 5 ->     piermnlsomgzgapzru
codegolf, 3           ->     cgoeofdl
elephant, 4           ->     enlatehp
1234567, 3            ->     1524637
qwertyuiop, 1         ->     qwertyuiop
Cowabunghole
źródło
Czy możemy założyć n> 1? Wyjaśnij, a jeśli nie, dodaj skrzynkę testową
Luis Mendo
1
Możesz założyć n > 0, ale n=1jest to uzasadniony przypadek. Zaktualizuję teraz pytanie.
Cowabunghole
2
@Cowabunghole Wiem. :) Powiązane tylko oznacza, że ​​jest nieco podobne i istniejące odpowiedzi mogą być pomocne w tym wyzwaniu. Wspominam tylko o tym, aby pojawiały się w połączonych pytaniach po prawej stronie. Powiązane! = Powielone. ;)
Kevin Cruijssen
5
Nigdy nie widziałem szyfru ogrodzeniowego zakodowanego za pomocą tylko jednej szyny. Tylko
mówię
1
@Veskah Ach tak, stara sztuczka z podwójną zgnilizną13.
wooshinyobject

Odpowiedzi:

5

Łuska , 6 bajtów

δÖK…¢ḣ

Wypróbuj online!

Działa n = 1również dla.

Wyjaśnienie

δÖ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.

Funkcja wyższego rzędu δdziała w ten sposób pod maską. Załóżmy, że masz funkcję wyższego rzędu, która przyjmuje jednoargumentową funkcję i listę i zwraca nową listę. Na przykład Öbierze funkcję i sortuje listę, używając jej jako klucza. Następnie δÖbierze funkcję binarną i dwie listy, zamyka listy razem, stosuje się Ödo sortowania par za pomocą funkcji binarnej jako klucza, a na koniec rzutuje pary na drugą współrzędną. Używamy Kjako funkcji klucza, która po prostu zwraca swój pierwszy argument, a ignoruje drugi.

Zgarb
źródło
6

MATL , 16 bajtów

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

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Rozważmy wejść 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
Luis Mendo
źródło
5

J , 54, 29, 27 26 bajtów

-1 bajt dzięki hoosierEE

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

Wypróbuj online!

Galen Iwanow
źródło
@LuisMendo Hmm, po raz kolejny przegapiłem coś ważnego. Dzięki! Naprawiony.
Galen Iwanow
1
Początkowo też mi tego brakowało, a potem zdałem sobie sprawę i zapytałem PO. Powinien istnieć przypadek testowy n=1od samego początku
Luis Mendo
1
|@i:zamiast [:|i:oszczędza bajt
hoosierEE
@hoosierEE Tak, dziękuję!
Galen Iwanow
5

R , 68 bajtów

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

Wypróbuj online!

  • -10 bajtów dzięki @Giuseppe
  • -17 bajtów, bo byłem głupi
  • -9 bajtów i n=1poprawiono wielkość liter dzięki @ J.Doe
  • -3 bajty dzięki @JayCe
digEmAll
źródło
3

Python 2 , 119 108 98 92 91 97 93 91 90 bajtów

lambda s,n:''.join(c*(j%(2*n-2or 1)in(i,2*n-i-2))for i in range(n)for j,c in enumerate(s))

Wypróbuj online!

-1 bajt, dzięki Jonathan Frech

TFeld
źródło
Możliwe 90 bajtów .
Jonathan Frech
3

05AB1E (starsza wersja) , 11 8 bajtów

Σ²Lû¨¾è¼

Zainspirowany odpowiedzią MATL @LuisMendo .
-3 bajty dzięki @Adnan, bo jestem idiotą ..>.>

Wypróbuj online .

Wyjaśnienie:

Σ           # 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

UWAGA: counter_variableJest używany, ponieważ w starszej wersji 05AB1E w Pythonie Σnie miał wbudowanego indeksu N, co ma w nowej wersji 05AB1E przepisującej Elixir. Dlaczego więc nadal używam wersji Legacy? Ponieważ w przepisywaniu Elixir niejawnie przekształca ciąg w listę znaków, co wymaga dodatkowego }Jprzekształcenia go z powrotem w ciąg wyjściowy (i zawiera również błąd, w którym èobecnie nie działa wcale, aby indeksować do wydłużonej listy ..: S)

Kevin Cruijssen
źródło
Nie potrzebujesz tej ¹g∍części, ponieważ 05AB1E używa cyklicznego indeksowania dla è.
Adnan
@Adnan Ah, jestem idiotą ..>.> Dzięki!
Kevin Cruijssen
2

Japt , 16 bajtów

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

Przetestuj online!

Wyjaśnienie

 ¬ üÏ   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.
ETHprodukcje
źródło
oO Ta ümetoda jest nowa?
Luis felipe De jesus Munoz
Tak, dodane w sobotę :-)
ETHprodukcje
Możesz wziąć dane wejściowe jako tablicę znaków, aby zapisać bajt i wyprowadzić jeden, lub użyć -Pflagi, aby zapisać kolejny 2.
Shaggy,
2

Galaretka , 8 bajtów

6 bajtów kończy się niepowodzeniem dla wysokości 1; dwa bajty użyte do rozwiązania tego problemu ... może 7 można znaleźć?

ŒḄṖȯ1ṁỤị

Dyadyczny link akceptujący dodatnią liczbę całkowitą i listę znaków, która daje listę znaków.

Wypróbuj online!

W jaki sposób?

ŒḄṖȯ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
Jonathan Allan
źródło
2

JavaScript (ES6), 75 bajtów

Krótsza formuła sugerowana przez @MattH (-3 bajty)

Pobiera dane wejściowe jako (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

Wypróbuj online!


JavaScript (ES7), 78 bajtów

Zaoszczędź 4 bajty dzięki @ETHproductions

Pobiera dane wejściowe jako (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

Wypróbuj online!

Arnauld
źródło
Moje rozwiązanie okazało się dość podobne do twojego. Możesz zapisać -3 bajty obliczając indeks wstawiania oz x/n&1?n-x%n:x%nzamiast zamiast n*n-(x%(n*2)-n)**2.
MattH
@MattH Ładnie zrobione. Dzięki!
Arnauld
1

MBASIC , 146 159 155 bajtów

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

Zaktualizowano do obsługi n = 1

Wydajność:

? programmingpuzzles, 5
piermnlsomgzgapzru

? codegolf, 3
cgoeofdl

? elephant, 4
enlatehp

? 1234567, 3
1524637

? WATERMELON, 4
WEAMLTROEN

? qwertyuiop, 1
qwertyuiop
wooshinyobject
źródło
Obecnie nie obsługuje przypadku n = 1.
wooshinyobject
Zaktualizowano, aby obsługiwał przypadek n = 1
wooshinyobject
Zaoszczędzono 4 bajty, czyszcząc porównania.
wooshinyobject
1

Perl 6 , 49 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako funkcję curry.

Wyjaśnienie:

->\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

Sekwencja, według której jest sortowana, wygląda następująco (dla n=5):

(-4 -3 -2 -1 0 -1 -2 -3 -4 -3 -2 -1 0 -1 -2 -3 -4 -3 -2 -1)
Jo King
źródło
1

J , 24 bajty

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

Wypróbuj online!

Czasownik wyraźny. Uruchom to jak 'codegolf' f 3.

Jak to działa

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

Zwykle funkcja jawna zajmuje dodatkowe 5 bajtów w postaci n :'...'. Ale jeśli dodana zostanie obsługa błędów, różnica spadnie do 2 bajtów ze względu na pareny i miejsce w (tacit)<space>::.

Bubbler
źródło
Dlaczego zawsze używam sort up? Twój jawny czasownik jest nadal o 3 bajty krótszy. Dobra decyzja!
Galen Iwanow
1

PowerShell, 99 95 bajtów

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

Skrypt testowy:

$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"
}

Wydajność:

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

Wyjaśnienie

Scenariusz:

  • tworzy tablicę wierszy,
  • wypełnia wiersze odpowiednimi wartościami,
  • i zwraca połączone wiersze.

Wyrażenie ((1..$n+$n..1)*$s.Length|gu generuje sekwencję podobną 1,2,3,3,2,1,1,2,3,3,2,1... i usuwa sąsiadujące duplikaty. gujest pseudonimem Get-Unique .

  • Dla $n=3deduplikowanej sekwencji jest:1,2,3,2,1,2,3,2,1...
  • Dla $n=1deduplikowanej sekwencji jest:1

Wyrażenie $i++*($n-gt1) zwraca indeks w sekwencji deduplikowanej. =$i++jeśli $n>1inaczej=0

mazzy
źródło
1

Rubinowy , 75 65 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako tablicę znaków, zwraca ciąg znaków

Jak to pisze:

  • Utwórz hciągi
  • Dla każdego znaku w ciągu wejściowym zdecyduj, który ciąg należy wstawić na podstawie jego indeksu (indeks ciągu, który ma być modyfikowany, rośnie w górę, ha następnie w dół aż do 0itd.)
  • Zwróć wszystkie połączone łańcuchy
Asone Tuhid
źródło
64 bajty
GB,
@GB to nie działa w przypadku ostatniej sprawy
Asone Tuhid
1

C, 142 134 bajtów

8 bajtów zaoszczędzonych dzięki Jonathanowi Frechowi

Kod:

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]);}

Wyjaśnienie:

// 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]);
}

Wypróbuj online!

J. Knoblauch
źródło
1
Witam i witam w PPCG; fajny pierwszy golf. 134 bajty (przy założeniu GCC).
Jonathan Frech
0

Węgiel drzewny , 21 bajtów

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

mim±i=0(mod2n2)

 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
Neil
źródło
0

SNOBOL4 (CSNOBOL4) , 191 bajtów

	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

Wypróbuj online!

Zajmuje Sto następnie Nosobne linie.

Wyjaśnienie:

	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
Giuseppe
źródło
0

Pyth , 22 21 bajtów

|seMhD,V*lz+PUQP_UQzz

Pobiera dane wejściowe, jak nnastępuje sw osobnych wierszach. Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .

|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

Edycja: zapisano bajt, przenosząc pusty czek na koniec przetwarzania. Poprzednia wersja: seMhD,V*lz|+PUQP_UQ]0z

Sok
źródło
0

Czerwony , 153 bajty

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]]

Wypróbuj online!

Wyjaśnienie:

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
]
Galen Iwanow
źródło
0

Mam dwa rozwiązania tego problemu. Pierwsze rozwiązanie, które zrobiłem najpierw, to pomyślałem o innym sposobie zrobienia tego, o którym myślałem, że pozwoli to zaoszczędzić bajty, ale tak się nie stało, więc i tak go uwzględniłem.


Rozwiązanie 1

PHP , 152 144 116 bajtów

<?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 bajtów dzięki @JoKing
  • 28 bajtów dzięki @Shaggy

Wypróbuj online!


Rozwiązanie 2

PHP , 162 bajty

<?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);

Wypróbuj online!

Mic1780
źródło
Nie musisz inicjować $fi $n-1-$imożesz być $n-~$i. 144 bajty
Jo King
-28 bajtów na usprawnienia @ JoKing.
Kudłaty
Oop; to się psuje, kiedy n=1. Ten działa dla tej samej liczby bajtów.
Kudłaty
Możesz także użyć krótkich tagów i usunąć miejsce po, echoaby zaoszczędzić 5 dodatkowych bajtów
Kudłaty