文字列のジップと並べ替え


14

文字列のリストを指定して、各位置の各文字列から文字を取得し、ASCII順序で並べ替えて、出力文字列に順番に追加することにより、単一の文字列を出力します。つまり、n入力文字列の場合、n出力の最初の文字は序数でソートされた各入力の最初の文字になり、出力の2番目のn文字は序数でソートされた各入力の2番目の文字になります。オン。文字列はすべて同じ長さであり、少なくとも1つの文字列があると想定できます。すべての文字列は、ASCII印刷可能文字(序数32-127)のみで構成されます。

Pythonでのリファレンス実装(オンラインで試してみてください):

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

例:

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

ルール

  • 標準的な抜け穴は禁止されています
  • これはなので、バイト単位の最短回答が勝ちます

リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からリーダーボードを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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

回答:


11

GS2、4バイト

*Ü■/

これは、改行で区切られたSTDINから文字列を読み取ります。

ソースコードはCP437エンコーディングを使用します。オンラインでお試しください!

テスト走行

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

使い方

*       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バイト

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

使用例:((>>=sort).transpose) ["HELLO","world","!!!!!"]-> "!Hw!Eo!Lr!Ll!Od"

文字列のリストを転置し、sortそれをマッピングし、結果の文字列のリストを連結します(>>=リストコンテキストではですconcatMap)。


まさにこれを思いついた!
誇りに思ってhaskeller

私はしませんでした; リストのようなもののためにMonadインスタンスを活用するのを忘れ続けています。(+1)
ballesta25


5

TeaScript、9 バイト

_t¡ßlp¡)µ

TeaScriptには、すべての正しい方法が間違った方法で実装されています。

オンラインで試す

非ゴルフ

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

説明

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

@intrepidcoderは私にとっては問題なく動作します。おそらくあなたのブラウザはいくつかのファイルをキャッシュしていますか?おそらく、キャッシュのクリアが機能する可能性があります。ただし、Safariを使用しています。ファイルを
更新して


4

Python、50 48バイト

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

-2バイトの@xnorに感謝します!


4
"".join変数に保存できます。
xnor

ああ、わからなかった。ありがとう!
デニス


3

オクターブ、15バイト

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

例:

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

2

ジュリア、46バイト

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

これにより、文字列の配列を受け入れて文字列を返す名前のない関数が作成されます。それを呼び出すには、名前を付けます、例えばf=x->...ます。

ゴルフをしていない:

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

Minkolang 0.13、46バイト

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

ここで試してみてください。のような入力を期待します"HELLO""world""!!!!!"(したがって、コンマはありません)。

説明

$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バイト

~zip{$}%

Web GolfScriptでオンラインで試してください。

使い方

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

1

K、10バイト

,/{x@<x}'+

文字列のリストの転置()の各(,/)の種類()を結合します。{x@<x}'+

動作中:

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

単純ですが、ここではKは1文字のソート関数を持たず、代わりに操作をスキャッターギャザーインデックス演算子@と、リストをソートする置換ベクトルを生成するプリミティブに分割することにより、少し傷つきます<


1

C ++ 14、152バイト

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

map + zipの利点を使用しない(理由を推測)

未ゴルフ+使用

#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

Mathematica、51バイト

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

Mathematicaでの文字列操作は高価です...



1

PHP92 91バイト

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

オンラインでお試しください!

PHPの組み込み配列関数を使用しないことで、これをもっと短くできると確信していますが、試してみなければなりませんでした!

または85バイト

@ Night2のスイングは、PHPの組み込み配列関数を使用しようとしないことで短くなります。

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

オンラインでお試しください!


@ Night2うまくやった!あなたはそれをあなた自身のものとして投稿すべきです。array_column文字列の配列で動作しないのはあまりにも悪いことです。そうしないと、CGにとってかなり便利になります。もちろん、スキップしなければならないこと$argv[0]も常に苦痛です...
640KB

0

Clojure / ClojureScript、43バイト

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

無名関数を作成します。ClojueScript REPLで書かれ、有効なClojureである必要があります。

ここに入力しから電話してください(*1 ["HELLO" "world" "!!!!!"])。または、実行(def f *1)してから使用します(f ["abc" "cba"])


0

セイロン、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)};

セイロンには機能がありzipますが、イテラブルの代わりに2つのイテラブルのみが必要です。unzip、一方で、反復可能なタプルを受け取り、文字列をタプルに変換したくありません。そこで、Google がどこかで見つけたHaskellの実装に触発されて、独自の転置関数を実装しました。

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

種類ntはるかに一般的に定義することができ、これはCodegolfですが;-)(n何の特殊なケースで、私はとして提案assertNarrow2週間前 )()。


0

Perl 6バイト

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

使用例:

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)



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.