String Zip ve Sırala


14

Dizelerin bir listesi verildiğinde, her bir dizeden her karakterden bir karakter alarak, bunları ASCII sırasına göre sıralayarak ve çıktı dizesine ekleyerek oluşturulan tek bir dize çıktılayın. Başka bir deyişle, ngiriş dizgileri için, nçıktının ilk karakterleri sıralı olarak sıralanmış girişlerin her birinin ilk karakterleri olur n, çıktının ikinci karakterleri sıralı olarak sıralanmış girişlerin her birinin ikinci karakterleri olur. üzerinde. Dizelerin hepsinin eşit uzunlukta olduğunu ve en az bir dize olacağını varsayabilirsiniz. Tüm dizeler yalnızca ASCII yazdırılabilir karakterlerden oluşacaktır (sıra 32-127).

Python'da referans uygulaması ( çevrimiçi deneyin ):

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

Örnekler:

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

kurallar

  • Standart boşluklar yasaktır
  • Bu , baytlarda en kısa cevap kazanır

Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, a) her dil için en kısa çözüm listesi ve b) genel bir lider tablosu olarak cevaplardan lider tablosunu oluşturur.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

## Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra snippet'te görünecek bir bağlantı da yapabilirsiniz:

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

Yanıtlar:


11

GS2 , 4 bayt

*Ü■/

Bu satır satırları ile ayrılmış, STDIN dizeleri okur.

Kaynak kod CP437 kodlamasını kullanır . Çevrimiçi deneyin!

Test sürüşü

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

Nasıl çalışır

*       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 bayt

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

Kullanım örneği: ((>>=sort).transpose) ["HELLO","world","!!!!!"]-> "!Hw!Eo!Lr!Ll!Od".

Dize listesini aktarın, sortüzerinde eşleyin ve sonuçta elde edilen dize listesini birleştirin ( >>=liste bağlamında concatMap).


Ben tam olarak bu geldi!
gururlu haskeller

Yapmadım; Listeler gibi şeyler için Monad örneğinden yararlanmayı unutmaya devam ediyorum. (+1)
ballesta25


5

TeaScript , 9 bayt

_t¡ßlp¡)µ

TeaScript tüm doğru yerleşikleri yanlış şekillerde uygular.

Çevrimiçi deneyin

Ungolfed

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

açıklama

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

@intrepidcoder benim için iyi çalışıyor. Belki de tarayıcınız bazı dosyaları önbelleğe aldı? Belki de önbelleğinizi temizlemek işe yarayabilir. Safari kullanıyorum. Dosyaları yenilemeyi deneyeceğim
Downgoat


4

Python, 50 48 bayt

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

-2 byte için @xnor'a teşekkürler!


4
"".joinBir değişkene kaydedebilirsiniz .
xnor

Hiçbir fikrim yoktu. Teşekkürler!
Dennis

4

JavaScript (ES6), 57 bayt

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

3

Oktav, 15 bayt

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

Misal:

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 bayt

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

Bu, bir dize dizisini kabul eden ve bir dize döndüren adsız bir işlev oluşturur. Bunu aramak için bir ad verin, örn f=x->....

Ungolfed:

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 bayt

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

Burada deneyin. Gibi girdi bekliyor "HELLO""world""!!!!!"(bu yüzden virgül yok).

açıklama

$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 bayt

~zip{$}%

Web GolfScript'te çevrimiçi deneyin .

Nasıl çalışır

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

1

K, 10 bayt

,/{x@<x}'+

Dizeler listesinin transpose ( ) öğesinin her ( ) ,/türüne ( ) katılın .{x@<x}'+

Eylemde:

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

Basit, ancak K, tek karakterli bir sıralama işlevine sahip olmadan ve bunun yerine işlemi bir dağılım-toplama dizin operatörüne @ve bir listeyi sıralayacak permütasyon vektörünü veren bir ilkeye bölerek biraz incinir <.


1

C ++ 14, 152 bayt

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

Harita + zip'in herhangi bir avantajını kullanmama (tahmin edin neden)

Ungolfed + kullanımı

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

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

Mathematica'da dize manipülasyonu pahalıdır ...


1

Japt , 12 bayt 20

Ny m_q n q)q

Çevrimiçi deneyin!

açıklama

Ny       // Transpose inputs
  m_     // Maps through each new string
    q    // Split string
    n    // Sort string
    q    // Join
)q       // Join again

1

PHP ,92 91 bayt

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

Çevrimiçi deneyin!

Bu PHP'nin yerleşik dizi işlevlerini kullanmaya çalışarak daha kısa yapılabilir eminim, ama denemek zorunda kaldı!

Veya 85 bayt

@ Night2'nin salınımı, PHP'nin yerleşik dizi işlevlerini kullanmaya çalışarak daha kısa yapılır:

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

Çevrimiçi deneyin!


@ Night2 güzel yapılır! Bunu kendiniz olarak yayınlamalısınız. array_columnBir dizi dizide çalışmayacak çok kötü, aksi takdirde CG için biraz daha yararlı olacaktır. Ve elbette atlamak zorunda $argv[0]her zaman bir acı ...
640KB

0

Clojure / ClojureScript, 43 bayt

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

Anonim bir işlev oluşturur. ClojueScript REPL'de yazılmış, geçerli Clojure da olmalıdır.

Buraya girin , sonra ile arayın (*1 ["HELLO" "world" "!!!!!"]). Veya yapın (def f *1)ve kullanın (f ["abc" "cba"]).


0

Seylan, 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)};

Seylan'ın bir zipişlevi olmasına rağmen , yinelenebilir yerine iki yinelenebilir. unzipÖte yandan, bir dizi tuple alır ve dizelerimi tuple'ye dönüştürmek istemiyorum. Bu yüzden Google'ın benim için bir yerde bulduğu bir Haskell uygulamasından esinlenerek kendi devrik işlevimi uyguladım .

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

Türleri nve tçok daha genel olarak tanımlanabilir, ancak bu Codegolf ;-) ( iki hafta önce önerdiğimn şeyin özel bir durumudur ).assertNarrow


0

Perl 6 , 33 bayt

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

Örnek kullanım:

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)



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.