Cetak Tali Bergelombang Baris-demi-Baris


23

Tantangan

Tulis program atau fungsi yang menggunakan string sdan integer nsebagai parameter. Program Anda harus mencetak (atau mengembalikan) string ketika diubah sebagai berikut:

Mulai di kiri atas dan bergerak ke bawah dan ke kanan, tulis ssebagai gelombang tinggi n. Kemudian, dari atas ke bawah, gabungkan setiap baris sebagai string (tanpa spasi).

Contoh

Diberi string "WATERMELON" dan tinggi 3:

Gelombangnya akan terlihat seperti ini:

W   R   O
 A E M L N
  T   E

Lalu, gabungkan baris dari atas ke bawah:

WRO
AEMLN
TE

Jadi, program Anda harus mengembalikan string "WROAEMLNTE"

Demikian juga, "WATERMELON" dengan ketinggian 4 harus menghasilkan gelombang berikut:

W     E
 A   M L
  T R   O
   E     N

Program Anda kemudian harus mengembalikan string "WEAMLTROEN"

Aturan

Memasukkan

Masukan dapat diambil dalam format apa pun yang masuk akal. String dapat dalam hal apa pun yang Anda inginkan. Anda mungkin menganggap itu0 < n <= s.length

Keluaran

Keluaran harus hanya terdiri dari string yang ditransformasikan (apakah dikembalikan atau dicetak ke STDOUT), ditambah baris baru yang tertinggal.

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang! Tidak ada celah standar.

Uji Kasus

Input                        Output

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

Bisakah kita mengasumsikan n> 1? Mohon klarifikasi dan jika tidak menambahkan test case
Luis Mendo

1
Anda boleh berasumsi n > 0, tetapi n=1ini adalah kasus yang valid. Saya akan memperbarui pertanyaan sekarang.
Cowabunghole

2
@Cowabunghole, saya tahu. :) Terkait hanya berarti jawaban yang agak mirip dan ada mungkin ada membantu untuk tantangan ini. Saya hanya menyebutkan agar mereka muncul di pertanyaan terkait di sebelah kanan. Terkait! = Digandakan. ;)
Kevin Cruijssen

5
Saya belum pernah melihat sandi pagar rel yang disandikan hanya dengan satu rel. Katakan saja '
wooshinyobject

1
@ Vesah Ah ya, trik rot13 ganda tua.
wooshinyobject

Jawaban:


5

Sekam , 6 byte

δÖK…¢ḣ

Cobalah online!

Berfungsi untuk n = 1juga.

Penjelasan

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

Fungsi urutan yang lebih tinggi berfungsi δseperti ini di bawah tenda. Misalkan Anda memiliki fungsi urutan lebih tinggi yang mengambil fungsi unary dan daftar, dan mengembalikan daftar baru. Misalnya, Ömengambil fungsi dan mengurutkan daftar menggunakannya sebagai kunci. Kemudian δÖmengambil fungsi biner dan dua daftar, ritsleting daftar bersama, berlaku Öuntuk mengurutkan pasangan menggunakan fungsi biner sebagai kunci, dan akhirnya memproyeksikan pasangan ke koordinat kedua. Kami menggunakan Ksebagai fungsi kunci, yang hanya mengembalikan argumen pertama dan mengabaikan yang kedua.


6

MATL , 16 byte

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

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Pertimbangkan input 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 byte

-1 byte berkat hoosierEE

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

Cobalah online!


@LuisMendo Hmm, sekali lagi saya melewatkan sesuatu yang penting. Terima kasih! Tetap.
Galen Ivanov

1
Saya awalnya merindukannya juga, kemudian menyadari dan bertanya kepada OP. Seharusnya ada ujian bersama n=1sejak awal
Luis Mendo

1
|@i:alih-alih [:|i:menyimpan byte
hoosierEE

@hoosierEE Ya, terima kasih!
Galen Ivanov

5

R , 68 byte

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

Cobalah online!

  • -10 byte terima kasih kepada @Giuseppe
  • -17 byte karena saya konyol
  • -9 byte dan n=1case tetap terima kasih kepada @ Joe
  • -3 byte terima kasih kepada @JayCe


3

05AB1E (warisan) , 11 8 byte

Σ²Lû¨¾è¼

Terinspirasi oleh @LuisMendo 's MATL jawabannya .
-3 byte terima kasih kepada @Adnan karena aku idiot ..>.>

Cobalah online .

Penjelasan:

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

CATATAN: Ini counter_variabledigunakan, karena dalam versi Python Legacy 05AB1E, yang Σtidak memiliki indeks builtin- N, yang memang ada dalam versi penulisan Elixir baru dari 05AB1E. Jadi mengapa saya masih menggunakan versi Legacy? Karena dalam penulisan ulang Elixir secara implisit mengubah string ke daftar karakter, memerlukan tambahan }Juntuk mengubahnya kembali menjadi string untuk output (dan juga mengandung bug sekarang di mana ètidak berfungsi sama sekali untuk mengindeks ke dalam daftar yang diperpanjang) ..: S)


Anda tidak memerlukan ¹g∍bagian itu karena 05AB1E menggunakan pengindeksan siklik untuk è.
Adnan

@ Adnan Ah, aku idiot ..>.> Terima kasih!
Kevin Cruijssen

2

Japt , 16 byte

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

Uji secara online!

Penjelasan

 ¬ üÏ   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 üMetode itu baru?
Luis felipe De jesus Munoz

Yap, ditambahkan pada hari Sabtu :-)
ETHproduk

Anda dapat mengambil input sebagai array karakter untuk menyimpan byte dan output satu atau menggunakan -Pbendera untuk menyimpan yang lain 2.
Shaggy

2

Jelly , 8 byte

6 byter gagal untuk ketinggian 1; dua byte digunakan untuk mengatasinya ... mungkin 7 dapat ditemukan?

ŒḄṖȯ1ṁỤị

Tautan diad yang menerima bilangan bulat positif dan daftar karakter yang menghasilkan daftar karakter.

Cobalah online!

Bagaimana?

ŒḄṖȯ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 byte

Formula yang lebih pendek disarankan oleh @MattH (-3 bytes)

Mengambil input sebagai (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

Cobalah online!


JavaScript (ES7), 78 byte

Disimpan 4 byte berkat produk @ETH

Mengambil input sebagai (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

Cobalah online!


Solusi saya akhirnya sangat mirip dengan Anda. Anda dapat menyimpan -3 byte menghitung indeks masukkan odengan x/n&1?n-x%n:x%nbukan n*n-(x%(n*2)-n)**2.
MattH

@MattH Dilakukan dengan baik. Terima kasih!
Arnauld


1

MBASIC , 146 159 155 byte

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

Diperbarui untuk menangani n = 1

Keluaran:

? programmingpuzzles, 5
piermnlsomgzgapzru

? codegolf, 3
cgoeofdl

? elephant, 4
enlatehp

? 1234567, 3
1524637

? WATERMELON, 4
WEAMLTROEN

? qwertyuiop, 1
qwertyuiop

Saat ini tidak mendukung kasus n = 1.
wooshinyobject

Diperbarui untuk menangani case n = 1
wooshinyobject

Disimpan 4 byte dengan membersihkan pembandingan.
wooshinyobject

1

Perl 6 , 49 byte

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

Cobalah online!

Mengambil input sebagai fungsi kari.

Penjelasan:

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

Urutan yang disortir berdasarkan terlihat seperti ini (untuk 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 byte

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

Cobalah online!

Kata kerja diad eksplisit. Jalankan seperti 'codegolf' f 3.

Bagaimana itu bekerja

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

Biasanya, fungsi eksplisit membutuhkan tambahan 5 byte dalam bentuk n :'...'. Tetapi jika penanganan kesalahan ditambahkan, perbedaan turun menjadi 2 byte karena parens dan ruang dalam (tacit)<space>::.


Kenapa saya selalu cenderung menggunakan sort up?! Kata kerja eksplisit Anda masih lebih pendek 3 byte. Keputusan bagus!
Galen Ivanov


1

Powershell, 99 95 byte

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

Skrip uji:

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

Keluaran:

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

Penjelasan

Naskah:

  • membuat array baris,
  • mengisi baris dengan nilai yang sesuai,
  • dan mengembalikan baris yang digabungkan.

Ekspresi ((1..$n+$n..1)*$s.Length|gu menghasilkan urutan seperti 1,2,3,3,2,1,1,2,3,3,2,1... dan menghapus duplikat yang berdekatan. guadalah alias untuk Get-Unique .

  • Untuk $n=3urutan deduplikasi adalah:1,2,3,2,1,2,3,2,1...
  • Untuk $n=1urutan deduplikasi adalah:1

Ekspresi $i++*($n-gt1) mengembalikan indeks dalam urutan terduplikasi. =$i++jika $n>1sebaliknya=0


1

Ruby , 75 65 byte

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

Cobalah online!

Mengambil input sebagai array karakter, mengembalikan string

Bagaimana wokrs:

  • Buat hstring
  • Untuk setiap karakter dalam string input, tentukan string mana yang akan dimasukkan berdasarkan indeksnya (indeks string yang akan dimodifikasi naik hingga hturun kemudian 0dan seterusnya)
  • Kembalikan semua string yang digabungkan menjadi satu


@ GB tidak berfungsi untuk kasus terakhir
Asone Tuhid

1

C, 142 134 byte

8 byte disimpan berkat Jonathan Frech

Kode:

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

Penjelasan:

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

Cobalah online!


1
Halo dan selamat datang di PPCG; golf pertama yang bagus. 134 byte (dengan asumsi GCC).
Jonathan Frech

0

Arang , 21 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Bekerja dengan mencatat indeks itum dari karakter on line saya memuaskan hubungannya m±saya=0(mod2n-2). Penjelasan:

 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 byte

	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

Cobalah online!

Dibawa Skemudian Npada jalur yang terpisah.

Penjelasan:

	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 byte

|seMhD,V*lz+PUQP_UQzz

Mengambil input seperti yang ndiikuti oleh spada baris terpisah. Coba online di sini , atau verifikasi semua uji sekaligus di sini .

|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

Sunting: menyimpan satu byte dengan menggerakkan cek kosong ke akhir pemrosesan. Versi sebelumnya: seMhD,V*lz|+PUQP_UQ]0z


0

Merah , 153 byte

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

Cobalah online!

Penjelasan:

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

Saya punya dua solusi untuk masalah ini. Solusi pertama yang saya lakukan pertama kemudian saya memikirkan cara lain untuk melakukannya yang saya pikir akan menghemat byte tetapi tidak jadi saya tetap memasukkannya.


Solusi 1

PHP , 152 144 116 byte

<?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 byte berkat @ JoKing
  • 28 byte berkat @Shaggy

Cobalah online!


Solusi 2

PHP , 162 byte

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

Cobalah online!


Anda tidak perlu menginisialisasi $f dan $n-1-$ibisa $n-~$i. 144 bytes
Jo King

-28 byte pada peningkatan @ JoKing
Shaggy

Ups; itu rusak ketika n=1. Yang ini berfungsi untuk jumlah byte yang sama.
Shaggy

Anda juga dapat menggunakan tag pendek dan menghapus spasi setelahnya echountuk menyimpan 5 byte lagi
Shaggy

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.