Chuỗi Zip và Sắp xếp


14

Đưa ra một danh sách các chuỗi, xuất một chuỗi đơn được hình thành bằng cách lấy một ký tự từ mỗi chuỗi tại mỗi vị trí, sắp xếp chúng theo thứ tự ASCII và nối chúng theo chuỗi cho chuỗi đầu ra. Nói cách khác, đối với các nchuỗi đầu vào, các nký tự đầu tiên của đầu ra sẽ là các ký tự đầu tiên của mỗi đầu vào được sắp xếp theo thứ tự, các nký tự thứ hai của đầu ra sẽ là các ký tự thứ hai của mỗi đầu vào được sắp xếp theo thứ tự, và vì vậy trên. Bạn có thể giả sử rằng các chuỗi có độ dài bằng nhau và sẽ có ít nhất một chuỗi. Tất cả các chuỗi sẽ chỉ bao gồm các ký tự có thể in ASCII (thứ tự 32-127).

Tham chiếu thực hiện trong Python ( thử trực tuyến ):

def stringshuffle(strings):
  res = ''
  for i in range(len(strings[0])):
    res += ''.join(sorted([s[i] for s in strings],key=ord))
  return res

Ví dụ:

"abc","cba" -> "acbbac"
"HELLO","world","!!!!!" -> "!Hw!Eo!Lr!Ll!Od"

Quy tắc

  • Sơ hở tiêu chuẩn bị cấm
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng

Bảng xếp hạng

Đoạn trích Stack ở cuối bài này tạo ra bảng xếp hạng từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

## Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

Câu trả lời:


11

GS2 , 4 byte

*Ü■/

Điều này đọc các chuỗi từ STDIN, được phân tách bằng các nguồn cấp.

Mã nguồn sử dụng mã hóa CP437 . Hãy thử trực tuyến!

Chạy thử nghiệm

$ xxd -r -ps <<< '2a 9a fe 2f' > zip-sort.gs2
$ echo -e 'HELLO\nworld\n!!!!!' | gs2 zip-sort.gs2 
!Hw!Eo!Lr!Ll!Od

Làm thế nào nó hoạt động

*       Split the input into the array of its lines.
 Ü      Zip the resulting array.
  ■     Map the rest of the program over the resulting array.
   /        Sort.

6

Haskell, 39 36 byte

import Data.List
(>>=sort).transpose

Ví dụ sử dụng: ((>>=sort).transpose) ["HELLO","world","!!!!!"]-> "!Hw!Eo!Lr!Ll!Od".

Chuyển danh sách các chuỗi, ánh xạ sortqua nó và nối danh sách các chuỗi kết quả ( >>=trong ngữ cảnh danh sách là concatMap).


tôi đã đưa ra chính xác điều này!
tự hào 23/11/2015

Tôi không; Tôi tiếp tục quên khai thác ví dụ Monad cho những thứ như danh sách. (+1)
ballesta25


5

TeaScript , 9 byte

_t¡ßlp¡)µ

TeaScript có tất cả các phần dựng sẵn được triển khai theo tất cả các cách sai.

Dùng thử trực tuyến

Ung dung

_t()m(#lp())j``

Giải trình

_t()        // Transposes input array
    m(#     // Loops through inputs
       lp() // Sorts characters by char code
     )
j``         // Joins back into string

@intrepidcoder hoạt động tốt với tôi. Có lẽ trình duyệt của bạn đã lưu trữ một số tệp? Có lẽ xóa bộ nhớ cache của bạn có thể làm việc. Tôi đang sử dụng Safari. Tôi sẽ thử làm mới các tập tin
Downgoat


4

Con trăn, 50 48 byte

lambda x,y=''.join:y(map(y,map(sorted,zip(*x))))

Cảm ơn @xnor cho -2 byte!


4
Bạn có thể lưu "".joinvào một biến.
xnor

Ồ, tôi không có ý tưởng. Cảm ơn!
Dennis

4

JavaScript (ES6), 57 byte

a=>a[0].replace(/./g,(c,i)=>a.map(w=>w[i]).sort().join``)

3

Octave, 15 byte

@(a)sort(a)(:)'

Thí dụ:

octave:1> (@(a)sort(a)(:)')(["abc";"cba"])
ans = acbbac
octave:2> (@(a)sort(a)(:)')(["HELLO";"world";"!!!!!"])
ans = !Hw!Eo!Lr!Ll!Od

2

Julia, 46 byte

x->(j=join)(map(i->j(sort([i...])),zip(x...)))

Điều này tạo ra một hàm không tên, chấp nhận một chuỗi các chuỗi và trả về một chuỗi. Để gọi nó, đặt tên cho nó, vd f=x->....

Ung dung:

function zipsort{T<:AbstractString}(x::Array{T,1})
    # Splat the input array and zip into an iterable
    z = zip(x...)

    # For each tuple consisting of corresponding characters
    # in the input array's elements, splat into an array,
    # sort the array, and join it into a string
    m = map(i -> join(sort([i...])), z)

    # Take the resulting string array and join it
    return join(m)
end

1

Chồn 0,13 , 46 byte

$od0Z2:$zIz:$xd0G2-[i1+z[di0c*+c$r]xz$(sr$Ok].

Hãy thử nó ở đây. Yêu cầu đầu vào như thế "HELLO""world""!!!!!"(vì vậy không có dấu phẩy).

Giải trình

$o     Read in whole input as characters
d      Duplicate top of stack (the ")
0Z     Count how often this appears in the stack
2:     Divide by two
$z     Store this in the register (z)
Iz:    Length of stack divided by z (k)
$x     Dump one element from the front/bottom of stack
d      Duplicate top of stack (which is k)
0G     Insert it at the front/bottom of stack
2-     k-2

  [                              Open for loop that repeats k-2 times
   i1+                           Loop counter + 1 (i)
      z[                         Open for loop that repeats z times
        d                        Duplicate top of stack (which is i)
         i                       Loop counter (j)
          0c                     Copy k from front of stack
            *                    Multiply (j*k)
             +                   Add (j*k + i)
              c                  Copy character at position j*k+i to the top
               $r                Swap top two elements of stack (so i is on top)
                 ]               Close for loop
                  x              Dump the top of stack (dump i)
                   z$(           Start a new loop with the top z elements
                      s          Sort
                       r$O       Reverse and output the whole (loop) stack as characters
                          k      Break - exits while loop
                           ].    Close for loop and stop

1

GolfScript, 8 byte

~zip{$}%

Dùng thử trực tuyến trên Web GolfScript .

Làm thế nào nó hoạt động

~         # Evaluate the input.
 zip      # Zip it.
    {$}%  # Map sort ($) over the resulting array.

1

K, 10 byte

,/{x@<x}'+

Tham gia ( ,/) loại ( {x@<x}) mỗi ( ') của transpose ( +) của danh sách các chuỗi.

Trong hành động:

  ,/{x@<x}'+("HELLO";"world";"!!!!!")
"!Hw!Eo!Lr!Ll!Od"

Đơn giản, nhưng K bị tổn thương một chút ở đây khi không có hàm sắp xếp một ký tự và thay vào đó chia hoạt động thành toán tử chỉ số phân tán @và một nguyên hàm tạo ra vectơ hoán vị sẽ sắp xếp danh sách <.


1

C ++ 14, 152 byte

#include<iostream>
#include<regex>
[](auto s){for(int i=0;i<s[0].size();++i){auto r=""s;for(auto k:s)r+=k[i];std::sort(begin(r),end(r));std::cout<<r;}};

Không sử dụng bất kỳ lợi thế nào của bản đồ + zip (đoán tại sao)

Ungolfed + cách sử dụng

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

int main()
{
    auto lambda = [](auto s)
    {
        for (int i = 0; i < s[0].size(); ++i)
        {
            auto r = ""s;
            for (auto k : s)
                r += k[i];
            std::sort(begin(r), end(r));
            std::cout << r;
        }
    };

    std::vector<std::string> data = { "HELLO", "world", "!!!!!" };
    lambda(data);
}

1

Toán học, 51 byte

""<>SortBy@ToCharacterCode/@Transpose@Characters@#&

Thao tác chuỗi trong Mathicala rất tốn kém ...



1

PHP ,92 91 byte

for($argv[0]='';$a=array_column(array_map(str_split,$argv),$i++|0);print join($a))sort($a);

Hãy thử trực tuyến!

Tôi tự tin rằng điều này có thể được thực hiện ngắn hơn bằng cách không cố gắng sử dụng các hàm mảng dựng sẵn của PHP, nhưng phải thử!

Hoặc 85 byte

Sự thay đổi của @ Night2, được thực hiện ngắn hơn bằng cách không cố gắng sử dụng các hàm mảng dựng sẵn của PHP:

for(;''<$argv[1][$i++];print join($a))for($a=[];''<$a[]=$argv[++$$i][$i-1];sort($a));

Hãy thử trực tuyến!


@ Night2 được thực hiện độc đáo! Bạn nên đăng cái đó như của riêng bạn. Thật tệ khi array_columnnó không hoạt động trên một chuỗi các chuỗi nếu không nó sẽ hữu ích hơn một chút cho CG. Và tất nhiên phải bỏ qua $argv[0]luôn là một nỗi đau quá ...
640KB

0

Clojure / ClojureScript, 43 byte

#(apply str(mapcat sort(apply map list %)))

Tạo một chức năng ẩn danh. Được viết bằng REPL ClojueScript, cũng phải là Clojure hợp lệ.

Nhập vào đây , sau đó gọi qua (*1 ["HELLO" "world" "!!!!!"]). Hoặc làm (def f *1)và sau đó sử dụng (f ["abc" "cba"]).


0

Ceylon, 166

String z(String+l)=>String(expand(t(l).map(sort)));[T+]n<T>(T?+i)=>[for(e in i)e else nothing];{[X+]*}t<X>([{X*}+]l)=>l[0].empty then{}else{n(*l*.first),*t(l*.rest)};

Trong khi Ceylon có một zipchức năng , nó chỉ mất hai lần lặp thay vì một lần lặp của chúng. unzipmặt khác, có một bộ lặp của bộ dữ liệu và tôi không muốn chuyển đổi chuỗi của mình thành bộ dữ liệu. Vì vậy, tôi đã triển khai chức năng chuyển vị của riêng mình, lấy cảm hứng từ việc triển khai Haskell mà Google tìm thấy cho tôi ở đâu đó .

// zip-sort
//
// Question:  http://codegolf.stackexchange.com/q/64526/2338
// My answer: ...

// Takes a list of strings (same length), and produces
// a string made by concatenating the results of sorting
// the characters at each position.
String z(String+ l) =>
        String(expand(t(l).map(sort)));

// Narrow an iterable of potential optionals to their non-optional values,
// throwing an AssertionError if a null is in there.
[T+] n<T>(T?+ i) =>
        [for (e in i) e else nothing];

// Transpose a nonempty sequence of iterables, producing an iterable of
// sequences.
// If the iterables don't have the same size, either too long ones are
// cut off or too short ones cause an AssertionError while iterating.
{[X+]*} t<X>([{X*}+] l) =>
        l[0].empty
        then {}
        else { n(*l*.first), *t(l*.rest) };

Các loại ntcó thể được định nghĩa tổng quát hơn nhiều, nhưng đây là Codegolf ;-) ( nlà trường hợp đặc biệt của những gì tôi đã đề xuất như assertNarrowhai tuần trước ).


0

Perl 6 , 33 byte

{[~] flat ([Z] @_».comb)».sort}

Ví dụ sử dụng:

say {[~] flat ([Z] @_».comb)».sort}(< abc cba >) # acbbca

my &code = my $code = {[~] flat ([Z] @_».comb)».sort}

say code "HELLO","world","!!!!!"; # !Hw!Eo!Lr!Ll!Od

say ((<cba abc>),(<testing gnitset gttseni>)).map($code);
# (acbbac ggtentiststteisenngit)



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.