Membalikkan interleaving


20

Diberikan string, balikkan secara interleaving. Berikut cara melakukannya untuk abcdefghidan abcdefghij, diindeks 0:

  1. Pisahkan karakter pada indeks genap dari karakter pada indeks ganjil:
    acegi
     bdfh
    acegi bdfhj
  2. Membalikkan karakter pada indeks ganjil:
    acegi
     hfdb
    acegi jhfdb
  3. Interleave menjadi satu string lagi:
    ahcfedgbi 
    ajchefgdib

Aturan

  • Anda harus mendukung string panjang genap dan ganjil.
  • Dari indeks-bijaksana, Anda harus membalik karakter pada indeks aneh, bahkan tidak
  • 1-indeks-bijaksana, tentu saja, Anda harus membalik karakter di indeks genap, tidak aneh.
  • Input akan terdiri dari ASCII yang dapat dicetak (titik kode 32-126), tanpa baris baru.
  • Anda dapat mengambil input baik sebagai string atau sebagai daftar karakter (BUKAN string 1-char). Misal String/ char[]atau char*diizinkan, tetapi String[]/ char[][]atau char**tidak.

Uji kasus

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

Untuk string kosong, kembalikan string kosong itu sendiri.



Saya ingat ini adalah sejenis "kode rahasia" (semacam Pig Latin) yang kami pelajari sejak kecil di tahun 80-an atau 90-an, ada hubungannya dengan kata "pagar" atau semacamnya, tetapi ingatan saya agak kabur. Teman-teman saya dan saya akan menggunakan ini untuk menyandikan pesan rahasia, dan saya tidak berpikir orang dewasa yang menemukan surat-surat kami pernah mengetahuinya ...
phyrfox

@ phyrfox Anda mungkin memikirkan cipher rail rail , yang mirip dengan ini.
Carmeister

Ah saya ingat melakukan itu.
12Me21

Jawaban:


7

Jelly , 7 byte

s2ZU2¦Z

Ini adalah program lengkap.

Cobalah online!

Bagaimana itu bekerja

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.

Itulah solusi saya byte-by-byte ...
Erik the Outgolfer

3
Pikiran yang sama berpikir hebat. ;)
Dennis

12

MATL , 8 byte

t2L)P5M(

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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
Begitu 2Ljuga dengan "Dorong [2,2,1j]", dan 5M"Dorong [2,2,1j] lagi" "... Dan beberapa orang mengatakan bahwa bahasa golf tidak dapat dibaca!
Leo

3
@ Leo :-D 2Lmenghasilkan literal yang sudah ditentukan sebelumnya. 5Madalah clipboard otomatis yang menyimpan input ke panggilan fungsi terbaru. Ini sebenarnya bisa digantikan oleh 2Luntuk jumlah byte yang sama
Luis Mendo

7

Alice , 10 byte

/ZY
\IOR@/

Cobalah online!

Setengah dari byte program ini dihabiskan untuk memformat sumber dengan benar, perintah yang sebenarnya adalah adil IYRZO, karena Alice hanya memiliki builtin yang tepat untuk tugas ini.

Penjelasan

Seperti yang saya katakan, mirror ( /\), baris baru dan @ada di sana hanya untuk membuat ip bergerak ke arah yang benar dan mengakhiri program di akhir. Kode aktual, linear, adalah sebagai berikut:

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

Cukup mudah, menurut saya.


Andai saja saya bisa memahami bagaimana cermin bekerja di sudut-sudut ...
Luis Mendo

@LuisMendo pertama Anda melewati cermin, yang membuat Anda berubah dari mode kardinal (horizontal / vertikal) ke mode ordinal (diagonal) atau sebaliknya. Kemudian jika Anda berada dalam mode kardinal Anda membungkus ke sisi lain dari garis / kolom, sedangkan jika Anda berada dalam mode ordinal Anda bangkit kembali ke sudut. Dalam kasus ini cermin tenggara ditemukan dalam mode ordinal, membuat Anda beralih ke kardinal dan membungkus dengan awal baris kedua, di mana cermin lain membuat Anda kembali ke ordinal dan mulai bergerak ke arah timur laut
Leo

Ah, jadi pantulannya hanya diagonal, ke arah yang sama dengan tempat asalmu. Maka itu lebih sederhana dari yang saya kira. Terima kasih!
Luis Mendo

6

Java (OpenJDK 8) , 108 96 94 93 byte

Disimpan 1 byte dengan menggunakan trik penggunaan Neil yang rapis[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;}

Cobalah online!


1
Java di bawah 100 byte ... tampaknya sah.
Erik the Outgolfer

" Java (OpenJDK 8 ) " Lalu mengapa Anda menggunakan metode Java 7 tanpa rekursi? Gunakan Java 8 lambda dengan mengganti String f(char[]s)dengan s->.. Dan Anda dapat menyimpan byte juga dengan menempatkan intinisialisasi dalam untuk loop: for(int a=s.length,b=0;b<a;b++). Cobalah online.
Kevin Cruijssen



3

JavaScript (ES6), 48 byte

f=
s=>s.replace(/./g,(c,i)=>i%2?s[s.length+~i|1]:c)
<input oninput=o.textContent=f(this.value)><pre id=o>


3

Jelly , 9 byte

Ḋm2U
m2żÇ

Cobalah online!

Ḋ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 byte terima kasih kepada Dennis


Jika Anda mengganti ¢dengan Ç, Anda tidak memerlukan ³tautan pembantu.
Dennis

@ Dennis Oh apa yang saya pikir saya lakukan itu pertama kali> _> Nevermind, saya pasti mengacaukan sesuatu. Terima kasih!
HyperNeutrino

3

Retina ,17 13 byte

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

Cobalah online!

Memperbaiki kesalahan berkat Neil.

Disimpan 4 byte berkat Kobi.

Memilih setiap huruf yang diawali dengan jumlah karakter ganjil dan membalikkannya. Lakukan ini dengan menggunakan \Gyang cocok dengan akhir pertandingan terakhir.


Testcase terakhir salah. Anda harus menggunakan $sebagai gantinya #.
Neil

@Neil Whoops, Anda benar sekali. Tetap!
FryAmTheEggman

Anda dapat menggunakan \Gsebaliknya pada tampilan di belakang, dan Anda dapat menghapus$ : O^`(?<=\G.).(12 byte)
Kobi

1
@Kobi Terima kasih untuk tipsnya! Tapi sayangnya itu hanya sepertinya saya bisa menghapus $karena semua input berada dalam urutan leksikografis. Saya telah menambahkan test case baru dimana kode Anda akan gagal.
FryAmTheEggman

@FryAmTheEggman - Sudah, bagus. Kira itu hanya keberuntungan.
Kobi

2

PHP> = 7.1, 58 Bytes

for(;$i<$l=strlen($a=$argn);$i++)echo$a[$i&1?-$i-$l%2:$i];

Versi Online


1
sempurna. OS mengatakan saya harus mengetik lebih banyak, tetapi 7 karakter itu mengatakan semuanya.
Titus

2

APL (Dyalog) , 9 byte

Membutuhkan ⎕IO←0(default pada banyak sistem) untuk definisi yang tepat dari ganjil dan genap.

⌽@{2|⍳≢⍵}

Cobalah online!

 membalikkan

@ pada elemen yang difilter oleh hasil topeng dari menerapkan

{ fungsi anoniomous

2| mod-2 dari

 indeks dari

 perhitungan (panjang) dari

 argumen

} pada argumen


Apakah v16 bahkan keluar ketika pertanyaan ini diposting?
Zacharý

@ Zacharý Itu dalam versi beta, tapi itu tidak penting lagi .
Adám

Oh, jadi saya kira Anda akan menggunakan v17 sekarang?
Zacharý

1

Röda , 34 byte

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

Cobalah online!

Penjelasan

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

Berikut adalah solusi alternatif pada bytecount yang sama

36 34 byte

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

Ini adalah fungsi anonim yang mengambil input sebagai string dari aliran input.




1

Haskell , 63 byte

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

Cobalah online! Penggunaan: f "some string".

Untuk string aneh seperti abcdefghi, fungsi fmelewati string dan pembalikannya ke fungsi !, yang bergantian mengambil karakter dari kedua string. Untuk string genap ini tidak berfungsi, dan kita perlu menambahkan karakter dummy terlebih dahulu untuk mendapatkan offset yang tepat.


1

C, 69 byte

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

Cukup mudah. Berjalan di tali, mencetak karakter saat ini atau sebaliknya.

Tidak digabungkan dan dijelaskan:

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

Mathematica, 82 byte

""<>(f=Flatten)[{#&@@#,Reverse@Last@#}&@f[Characters@#~Partition~UpTo@2,{2}],{2}]&

1

Japt , 14 13 byte

12 byte kode, +1 untuk -Pbendera.

Disimpan 1 byte berkat @Shaggy

¬ë íU¬Åë w)c

Penjelasan:

¬ë í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

Cobalah online!


Hmm, ë2,1agak jelek. Saya pikir Anda dapat melakukannya ó osebagai gantinya, mungkin ...
ETHproduksi

@ ETHproductions Ya, saya pikir Åëberfungsi juga.
Oliver

Oh, bagus :-)
ETHproduksi


1

K (oK) , 18 byte

Larutan:

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

Cobalah online!

Contoh:

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

Penjelasan:

Sebagian besar diinterpretasikan dari kanan ke kiri, cari karakter indeks ganjil, balikkan dan masukkan kembali ke dalam string

{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 byte

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

ungolfed

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

penjelasan

  • (0 1$~#)]`(|.@])/.]Gunakan Kunci /.untuk membagi input menjadi kelompok genap / ganjil: (0 1$~#)membuat definisi grup, dengan mengulangi 0 dan 1 secara siklik hingga panjang input. Kami menggunakan bentuk gerundial Key untuk kata kerja utamanya ]`(|.@]), yang berlaku identitas untuk kelompok pertama dan membalikkan kelompok kedua: (|.@]).
  • Sekarang kami memiliki dua kelompok, yang aneh dibalik, kami hanya menyatukannya dan meratakannya: ,@,./

Cobalah online!


21 byte dengan (\:2|#\)({~/:)#\<.#\.dan 19 byte dengan [:,@,./]]| ./. ~ 2 | # `
mil

terima kasih mil. apakah ada kesalahan ketik pada yang kedua? Saya mendapat pesan kesalahan
Jonah

@miles juga yang pertama: saya mengerti bagaimana mem-parsing dan secara teknis apa yang terjadi, tapi saya tidak melihat strategi keseluruhan. bisakah kamu mengklarifikasi?
Jonah

oh ya, itu seharusnya [:,@,./]]`|./.~2|#\, kutu diurai
mil

17 byte dengan0,@|:]]`|./.~2|#\
mil

0

Python 3, 93 87 byte

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

Ganti reversed(s[1::2])dengan s[1::2][::-1]untuk menyimpan 4 byte
Mr. Xcoder

Turun ke 83 byte dan golf, pada akhirnya:f=lambda s,j="".join:j(j(t)for t in zip(s[::2],s[1::2][::-1]))+("",s[-1])[len(s)%2]
Tn. Xcoder

0

Perl 6 ,  63 58  55 byte

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

Menguji

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

Menguji

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

Menguji

{  # 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
      }


    ]
}

Saya harus menggunakan roundrobindaripada zip, karena zipberhenti segera setelah salah satu daftar input habis.




0

GNU APL 1.2, 24 byte

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

APL bekerja dari kanan ke kiri. ⍴R←⍞menetapkan input pengguna ke Rdan kemudian mengevaluasi panjangnya. Membagi dua ini dengan mengalikan dengan .5dan menerapkan fungsi lantai. mengembalikan semua angka dari 1 ke argumen.

APL beroperasi pada array, jadi array yang baru saja kita dapatkan dari menggandakan masing-masing elemen, memberi kita hanya indeks genap (1-diindeks, jadi andalkan ⎕IO1).

Saat mengakses beberapa indeks vektor, APL memberikan elemen pada indeks tersebut dalam vektor. R[X←2×⍳⌊.5×⍴R←⍞]hanya memberikan elemen genap. membalikkan elemen. Kemudian, tetapkan nilai yang dikembalikan kembali ke indeks genap (menugaskan indeks ini untuk Xmenyimpan 6 byte).

adalah pemisah pernyataan. Setelah pembalikan dilakukan, evaluasi Runtuk mencetak hasilnya.


0

Perl 5, 46 + 3 untuk -F flag = 49 byte

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

Menggunakan -Fbendera untuk membagi input menjadi array karakter secara otomatis @F,. Loop melalui array dan output elemen untuk indeks genap atau indeks (ditambah satu untuk string panjang ganjil) dari ujung untuk input ganjil.

Mengambil input dengan baris baru yang tertinggal. Tanpa trailing newline, cukup ubah pra-kenaikan $xmenjadi pasca kenaikan.

Sedikit lebih mudah dibaca:

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 byte

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

Cobalah online!

Saya menduga alasan ini belum dilakukan di 05AB1E belum karena itu kotor ...

Namun lain kali, zipfungsi auto-drop-last-element lebih menyakitkan daripada membantu.

PS Jika Anda memiliki saran peningkatan pada jawaban saya, posisikan sendiri; sepertinya cukup perbaikan untuk menjamin Anda mendapatkan poin. Saya cukup malu dengan jawaban ini.


0

q / kdb +, 70 56 47 38 35 29 27 byte

Larutan:

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

Contoh:

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"

Penjelasan:

Temukan indeks ganjil dari string, balikkan daftar ini, tarik keluar elemen pada titik-titik ini dan kemudian tetapkan kembali di tempat ke string asli.

{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

Suntingan:

  • -9 byte; beralih countke (#:), tiluntuk (!), whereuntuk (&:)dan reverseuntuk (|:).

  • -3 byte; beralih (#:)ke (#), (&:)untuk (&)dan (|:)untuk(|)

  • -6 byte; lengkap tulis ulang

  • -2 byte; menggunakan penugasan alih-alih melamar


0

05AB1E , 12 byte

RDgÈúøvyNÉè?

Cobalah online!

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