Konversikan n string dengan panjang m ke string n dengan panjang n


16

Tulis sebuah program yang, mengingat 'n' jumlah string dengan panjang 'm', mengembalikan jumlah 'm' dari string 'n'-length, dengan kondisi ini:

Setiap string baru harus berisi huruf pada indeks yang sama dari string lainnya

Sebagai contoh, string output pertama harus berisi huruf pertama dari semua string input, string output kedua harus berisi huruf kedua dari semua string input, dan seterusnya.

Contoh (angka di bawah huruf adalah indeks string):

input: "car", "dog", "man", "yay"
        012    012    012    012
output: "cdmy", "aoaa", "rgny"
         0000    1111    2222

input: "money", "taken", "trust"
        01234    01234    01234
output: "mtt", "oar", "nku", "ees", "ynt"
         000    111    222    333    444

Asumsikan inputnya benar setiap kali

Kode byte terpendek menang!

Edit:

Karena ada banyak bahasa pemrograman, dan mungkin ada banyak solusi yang memungkinkan untuk masing-masingnya, saya akan memposting solusi terpendek untuk setiap bahasa pemrograman dan pengguna yang menyediakannya. Terus koding!

Sunting Ulang:

Berkat pengguna, Dennis, saya memasukkan cuplikan untuk papan peringkat.


2
Kami memiliki cuplikan papan peringkat yang dapat Anda tambahkan ke badan pertanyaan Anda. Tidak perlu melakukannya dengan tangan.
Dennis


Maaf, saya tidak tahu itu disebut "transposing"
Input Name Here

6
Saya tidak percaya tantangan ini adalah duplikat, karena perbedaan yang melibatkan transposisi kasar dan beberapa penanganan ruang putih aneh dalam pertanyaan lain. Sementara dalam beberapa bahasa jawabannya mungkin sangat mirip, saya pikir di sebagian besar mereka akan cukup berbeda sehingga ini seharusnya tidak menjadi duplikat.
FryAmTheEggman

Jawaban:



9

Python, 36 29 byte

zip(*s) mengembalikan daftar tupel masing-masing karakter, ditransformasikan.

lambda s:map(''.join,zip(*s))

Cobalah online


Outputnya mengatakan "cdmy", "aoaa", "rgny", yang merupakan daftar ["cdmy", "aoaa", "rgny"]atau tuple("cdmy", "aoaa", "rgny")
mbomb007

map(''.join,zip(*s))juga berfungsi untuk konversi string (hanya Python 2), dan untuk Python 3, [*map(''.join,zip(*s))]afaik berfungsi
Value Ink

@ KevinLau-notKenny map(''.join,zip(*s))juga berlaku untuk Python 3 - kami mengizinkan iterators / generator menggantikan daftar secara default.
Mego



7

PowerShell v2 +, 66 54 byte

param($n)for($x=0;$n[0][$x];$x++){-join($n|%{$_[$x]})}

Yo ... tidak map, tidak zip, tidak transpose, dll, jadi kita harus menggulung sendiri. Alat peraga besar ke @DarthTwon untuk golf 12-byte.

Mengambil input $n, mengatur forlingkaran. Inisialisasi diatur $xke 0, tes adalah apakah kita masih memiliki huruf dalam kata kita $n[0][$x], dan kita menambah $x++setiap iterasi.

Di dalam loop, kami mengambil array string kami, pipa itu ke loop batin yang memuntahkan karakter yang sesuai dari setiap kata. Itu diringkas dalam -joinuntuk membentuk string, dan string itu dibiarkan pada pipa. Pada akhir eksekusi, string pada pipeline dicetak secara implisit.

PS C:\Tools\Scripts\golfing> .\convert-n-strings.ps1 "Darth","-Twon","Rocks"
D-R
aTo
rwc
tok
hns

1
Bagus, itulah jenis jawaban yang ingin saya lihat;) Menulisnya terlalu sederhana ,daripada memikirkan jawabannya
Input Name Here

Menggunakan loop sementara dapat lebih pare yang turun: param($n)$x=0;while($n[0][$x]){-join($n|%{$_[$x]});$x++}. Dan tidak ada kesalahan di sini: D
ThePoShWolf

@DarthTwon Luar Biasa. Atau, gunakan satu forlingkaran untuk dua lainnya. ;-)
AdmBorkBork

Hmm ... Saya mencobanya, tetapi tidak setelah benar-benar memotong whileloop saya . Kerja bagus pak!
ThePoShWolf

Bisakah Anda menggunakan Linq di Powershell?
aloisdg pindah ke codidact.com

7

Vim, 37 36 penekanan tombol

Semua jawaban lain membosankan, dan menggunakan built-byte byte tunggal yang membosankan. Berikut ini jawaban hack yang melakukan semuanya secara manual, dalam sesuatu yang bahkan bukan bahasa pemrograman:

Gmaqqgg:s/./&<cr>d<C-v>`aGo<esc>pvGgJ@qq@q`adgg

Penjelasan:

G                                   "move to the end of this line
     ma                             "And leave mark 'a' here
       qq                           "Start recording in register 'q'
         gg                         "Move to the beginning
           :s/./&<cr>               "Assert that there is atleast one character on this line
                      d             "Delete
                       <C-v>        "Blockwise
                            `a      "Until mark 'a'

    G                               "Move to the end of the buffer
     o<esc>                         "Open a newline below us
           p                        "And paste what we deleted
            vG                      "Visually select everything until the end
              gJ                    "And join these without spaces
                @q                  "Call macro 'q'. The first time, this will do nothing,
                                    "The second time, it will cause recursion.
                  q                 "Stop recording
                   @q               "Call macro 'q' to start it all

Sekarang, semuanya baik-baik saja, tetapi buffer memiliki beberapa teks tambahan yang tersisa. Jadi kita harus:

`a                              "Move to mark 'a'
  dgg                           "And delete everything until the first line

5

CJam, 6 5 byte

Disimpan 1 byte berkat Luis Mendo.

qS%zp

Cobalah online!

q      e# Get all input
 S%    e# Split it on spaces
   z   e# Take the transpose
    p  e# Print it as an array


4

Retina , 45 43 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

O$#`.(?<=(.+))|¶
$.1
!`(?<=(¶)+.*)(?<-1>.)+

Linefeed terkemuka sangat penting. Input dan output adalah daftar string ASCII yang dapat diakhiri linefeed (catat bahwa keduanya memiliki satu linefeeding trailing tunggal)

Cobalah online!

Saya tahu untuk sementara waktu bahwa memindahkan blok persegi panjang akan menyusahkan di Retina (padahal mentransposisikan kotak tidak terlalu buruk), tetapi tidak pernah benar-benar mencoba. Solusi pertama memang panjang 110 byte kekalahan, tetapi setelah beberapa perubahan substansial dalam pendekatan, yang dihasilkan 45 byte sejauh ini tidak seburuk yang saya duga (tapi masih ...). Penjelasan akan mengikuti besok.

Penjelasan

Tahap 1: Sortir

O$#`.(?<=(.+))|¶
$.1

Ini melakukan tugas utama menyusun ulang karakter dalam input, tetapi akhirnya mengacaukan pemisahan menjadi beberapa baris. Menariknya, jika kita menghapus , kita mendapatkan kode yang diperlukan untuk mengubah input persegi.

Tahap sortir (dilambangkan oleh O) bekerja seperti ini: mereka menemukan semua kecocokan dari regex yang diberikan (hal setelah `), dan kemudian mengurutkan kecocokan itu dan memasukkan kembali mereka ke tempat-tempat di mana kecocokan ditemukan. Seperti yang terjadi, regex ini cocok dengan setiap karakter tunggal: umpan tidak-line melalui .(?<=(.*))alternatif dan umpan baris melalui . Oleh karena itu, semua karakter di input. Bagian yang lebih menarik adalah apa yang mereka diurutkan oleh .

The $pilihan mengaktifkan "sort-by" mode, di mana setiap pertandingan diganti dengan pola substitusi pada baris kedua, yang kemudian digunakan untuk membandingkan pertandingan. Selanjutnya,# Retina memberitahu untuk mengubah hasil substitusi menjadi bilangan bulat, dan membandingkan bilangan bulat tersebut (alih-alih memperlakukannya sebagai string).

Jadi akhirnya, kita perlu melihat regex dan substitusi. Jika alternatif pertama cocok (yaitu, kami telah mencocokkan karakter apa pun dalam salah satu baris), maka (?<=(.*))menangkap semuanya hingga karakter itu pada baris itu ke dalam grup 1. The $.1dalam pola substitusi menggantikan ini dengan panjang kelompok 1. Oleh karena itu, karakter pertama dalam setiap string menjadi 1, yang kedua menjadi tidak digunakan dalam kasus ini, substitusi kosong, tetapi untuk keperluan opsi, ini dipertimbangkan . Itu berarti, semua umpan garis diurutkan ke depan.2 , yang ketiga menjadi 3dan seterusnya. Seharusnya jelas sekarang bagaimana ini mentransposisi input kuadrat: semua karakter pertama dari baris datang pertama dan semua berakhir di baris paling atas, kemudian semua karakter kedua berakhir di baris kedua dan seterusnya. Tetapi untuk input persegi panjang ini, kami juga mencocokkan umpan baris. Sejak kelompok1#0

Jadi sekarang kita memiliki karakter dalam urutan pertama (karakter pertama dari setiap string, karakter kedua dari setiap string, dll.) Dan semua umpan baris di awal.

Tahap 2: Cocokkan

!`(?<=(¶)+.*)(?<-1>.)+

Kita sekarang perlu membagi karakter menjadi garis dengan panjang yang benar. Panjang ini sesuai dengan jumlah baris dalam input asli, yang sesuai dengan jumlah baris yang kita miliki di awal string.

Pemisahan dilakukan di sini dengan bantuan tahap pertandingan, yang hanya menemukan semua pertandingan dari regex yang diberikan dan menggunakan !opsi untuk mencetak pertandingan tersebut (standarnya adalah menghitungnya). Jadi tujuan dari regex adalah untuk mencocokkan satu baris sekaligus.

Kita mulai dengan "menghitung" angka dengan tampilan di belakang (?<=(¶)*.*). Ini menghasilkan satu tangkapan dalam grup 1untuk setiap linefeed di depan.

Kemudian, untuk setiap tangkapan itu, kami mencocokkan satu karakter dengan (?<-1>.)+.


4

kode mesin x86, 19 byte

Dalam hex:

fc89d35651a401dee2fb91aa595e464a75f1c3

Input:: ECX# string (n) EDX,: panjang string individu (m) ESI,: array string input,: EDIoutput buffer, menerima array string. Array dianggap didefinisikan sebagai char src[n][m+1]input dan char dst[m][n+1]output, dan semua string diakhiri dengan NULL.

0:  fc                  cld
1:  89 d3               mov ebx,edx   ;EDX is the counter for the outer loop
_outer:
3:  56                  push esi
4:  51                  push ecx
_inner:
5:  a4                  movsb         ;[EDI++]=[ESI++]
6:  01 de               add esi,ebx   ;Same char, next string
8:  e2 fb               loop _inner   ;--ECX==0 => break
a:  91                  xchg eax,ecx  ;EAX=0
b:  aa                  stosb         ;NULL-terminate just completed string
c:  59                  pop ecx
d:  5e                  pop esi       ;First string,
e:  46                  inc esi       ;...next char
f:  4a                  dec edx
10: 75 f1               jnz _outer
12: c3                  ret

3

Brachylog , 5 byte

z:ca.

Mengharapkan daftar string sebagai input, mis run_from_atom('z:ca.',["money":"taken":"trust"],Output).

Penjelasan

z       Zip the strings in the Input list
 :ca.   output is the application of concatenation to each element of the zip

3

05AB1E, 3 byte

ø€J

Dijelaskan

     # implicit input, eg: ['car', 'dog', 'man', 'yay']
ø    # zip, producing [['c', 'd', 'm', 'y'], ['a', 'o', 'a', 'a'], ['r', 'g', 'n', 'y']]
 €J  # map join, resulting in ['cdmy', 'aoaa', 'rgny']

Cobalah online



2

JavaScript ES6, 48 46 byte

a=>[...a[0]].map((n,x)=>a.map(a=>a[x]).join``)

Saya merasa ditinggalkan, kami tidak memiliki fungsi zip bawaan. Terima kasih nicael untuk menunjukkan kesalahan tipe saya.

Pemakaian

(a=>[...a[0]].map((n,x)=>a.map(a=>a[x])))(["asd","dsa"]); //or whatever is above, might change due to edits

kembali

["ad","ss","da"]

Pengecualian: TypeError: a [0] .map bukan fungsi
edc65

1
Anda perlu [...a[0]].map, karena a[0]bukan array.
nicael

@nicael terima kasih. mengacaukan jenis. ini membuktikan mengapa saya tidak boleh main golf pagi ini.
charredgrass

@nicael Saya .joined mereka untuk memperbaiki masalah itu.
charredgrass

1
join`` alih-alih join('')menyimpan 2 byte. Downvote ditarik
edc65

2

Utilitas Bash + BSD, 27

sed s/./\&:/g|rs -c: -g0 -T

I / O via STDIN / STDOUT string yang dipisahkan baris baru.

Anda mungkin perlu menginstal rsdengan sudo apt install rsatau serupa. Berfungsi di luar kotak pada OS X.

The -Tpilihan untuk rsmelakukan angkat berat dari transposisi tersebut. Sisanya hanya memformat:

  • The sedperintah hanya menyisipkan :setelah setiap karakter
  • -c:menentukan kolom input :dipisahkan
  • -g0 menentukan kolom output memiliki pemisahan lebar nol

Jika pembacaan halaman rsmanual saya benar, maka yang berikut harus bekerja untuk skor 12, tapi sayangnya tidak berhasil - lihat catatan di bawah ini:

rs -E -g0 -T

Contoh output:

$ printf "%s\n" car dog man yay |sed s/./\&:/g|rs -c: -g0 -T
cdmy
aoaa
rgny
$

Jika input diharapkan semua ASCII yang dapat dicetak, maka karakter :tersebut dapat diganti dengan beberapa karakter yang tidak dapat dicetak , misalnya 0x7 BEL.


Catatan

Saya ingin mengerti mengapa saya tidak bisa mendapatkan -Eopsi untuk bekerja dan menyingkirkan sedpreprocessing. Saya menemukan rskode sumber di sini . Seperti yang Anda lihat, memberi opsi ini menetapkan ONEPERCHARbendera. Namun, tidak ada dalam kode yang benar-benar memeriksa keadaan bendera ini. Jadi saya pikir kita dapat mengatakan bahwa meskipun fakta bahwa opsi didokumentasikan, itu tidak dilaksanakan.

Faktanya, opsi ini didokumentasikan dalam rsmanual Linux :

-E Pertimbangkan setiap karakter input sebagai entri array.

tapi bukan versi OS X.


2

PHP, 82 byte

function f($a){foreach($a as$s)foreach(str_split($s)as$i=>$c)$y[$i].=$c;return$y;}

mengambil dan mengembalikan array string

kerusakan

function f($a)
{
    foreach($a as$s)                    // loop through array $a
        foreach(str_split($s)as$i=>$c)  // split string to array, loop through characters
            $y[$i].=$c;                 // append character to $i-th result string
    return$y;
}

contoh

$samples=[
    ["asd","dsa"], ["ad","ss","da"],
    ["car", "dog", "man", "yay"], ["cdmy", "aoaa", "rgny"],
    ["money", "taken", "trust"], ["mtt", "oar", "nku", "ees", "ynt"]
];
echo '<pre>';
while ($samples)
{
    echo '<b>in:</b> ';         print_r($x=array_shift($samples));
    echo '<b>out:</b> ';        print_r(f($x));
    echo '<b>expected:</b> ';   print_r(array_shift($samples));
    echo '<hr>';
}

2

APL, 3 byte

↓⍉↑

mengambil string input dan mengubahnya menjadi matriks char. transposes matriks. membagi kembali baris-baris matriks yang dihasilkan menjadi string.



1

Mathematica, 26 byte

""<>#&/@(Characters@#)&

Fungsi anonim. Mengambil daftar string sebagai input dan mengembalikan daftar string sebagai output. Karakter Unicode adalah U + F3C7, mewakili \[Transpose]. Bekerja dengan mengonversi ke matriks karakter, mentransposisi, dan mengonversi kembali ke daftar string. Jika format input / output diregangkan, maka transpose 5-byte sederhana akan berfungsi:

#&

+1 Anda mengalahkan saya sampai pukul! (Tapi aku tidak bisa menggunakan simbol Transpose.) Ngomong-ngomong, mengapa T tidak muncul di layar? (Itu ada ketika saya menyalin kode Anda ke Mathematica).
DavidC

@DavidC The Unicode character is in the Private Use Area, which is marked as a section for proprietary characters and is therefore neither officially assigned a glyph nor rendered at all in most fonts. Mathematica's font just happens to render this character as a supserscript T and interpret it as a \[Transpose].
LegionMammal978

@DavidC Why don't they use ?
Adám

@Adám IDK, you'd have to ask Wolfram Research about that, not me
LegionMammal978

@LegionMammal978 Nah, I'm happy as long as I have APL's obvious .
Adám

1

MATLAB / Octave, 4 bytes

@(x)x'

This defines an anonymous function. Input format is ['car'; 'dog'; 'man'; 'yay'].

Try it here.


What format is the input for this solution? I don't think it will work with the way Matlab handles strings if you try to input them in a Matlabby way, e.g. f = @(x)x', f([{'abcd'},{'abcd'},{'abcd'}]) outputs ans = 'abcd' 'abcd' 'abcd'
sintax

@sintax Input format should be a 2D char array, as in the example linked in the answer. You are using a cell array of strings (obtained by concatenating singleton cell arrays). It should be: f(['abcd';'abcd';'abcd']). I've edited the answer to specify the input format
Luis Mendo

1

Haskell, 41 bytes

f l=zipWith($)[map(!!n)|n<-[0..]]$l<$l!!0

Or with a bit more air:

f l = zipWith ($) [map (!! n) | n <- [0..]] $
                  l <$ (l !! 0)

The second list is the list of words repeated “the length of a word” time. On each list of words, we select the n-th letter of each word, giving the result.


1
There's no need for a full program, because "program" means "program or function", so a function is enough. You can pass and return a list of strings and therefore omit wordsand unwords. Further, map(\_->l)(l!!0) is l<*l!!0, so it boils down to \l->zipWith($)[map(!!n)|n<-[0..]]$l<$l!!0.
nimi

Oh, good thanks :) I'm updating.
villou24

Oops, typo: it's l<$l!!0 (first time wrong, second time right), but you got it right anyway.
nimi

1

Common Lisp, 62 bytes

(lambda(s)(apply'map'list(lambda(&rest x)(coerce x'string))s))

The map function takes a result type (here list), a function f to apply and one or more sequences s1, ..., sn. All sequences are iterated in parallel. For each tuple of elements (e1,...,en) taken from those sequences, we call (f e1 ... en) and the result is accumulated in a sequence of the desired type.

We take a list of strings, say ("car" "dog" "man" "yay"), and use apply to call map. We have to do this so that the input list is used as more arguments to map. More precisely, this:

(apply #'map 'list fn '("car" "dog" "man" "yay"))

... is equivalent to:

(map 'list f "car" "dog" "man" "yay")

And since strings are sequences, we iterate in parallel over all first characters, then all second characters, etc... For example, the first iteration calls f as follows:

(f #\c #\d #\m #\y)

The anonymous lambda takes the list of arguments given to it and coerces it back to a string.


1

Perl, 91 bytes

So lengthy one..

$l=<>;$p=index($l," ")+1;@i=split//,$l;for$a(0..$p-1){print$i[$a+$_*$p]for(0..$p);print" "}

Try it here!


0

Ruby, 46 bytes

Probably the first time that "Ruby strings aren't Enumerables" is actually biting me hard since I had to map the strings into arrays before processing. (Normally having to use String#chars isn't enough of a byte loss to matter, but since I need to map them, it stings a lot more)

->s{s.map!(&:chars).shift.zip(*s).map &:join}

0

Clojure, 68 bytes

#(map(fn[g](reduce(fn[a b](str a(nth b g)))""%))(range(count(% 0))))

Maps a function which is just reduce (goes on elements of the list one by one and joins nth character of the string) on the range from 0 to length of the first string.

See it online: https://ideone.com/pwhZ8e


0

C#, 53 bytes

t=>t[0].Select((_,i)=>t.Aggregate("",(a,b)=>a+b[i]));

C# lambda (Func) where the output is IList<string> and the output is IEnumerable<string>. I dont know how work zip in other language but I can't find a way to use the C#'s one here. Aggregate fit the need well. No transpose in C#, there is one in Excel but I wont use it.

Try it online!

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.