String Zip and Sort

14

Wenn Sie eine Liste von Zeichenfolgen erhalten, geben Sie eine einzelne Zeichenfolge aus, die aus der Aufnahme eines Zeichens an jeder Position, der Sortierung nach ASCII-Ordnungszahlen und dem Anhängen an die Ausgabezeichenfolge besteht. Mit anderen Worten, für nEingabezeichenfolgen sind die ersten nZeichen der Ausgabe die ersten Zeichen jeder der Eingaben, sortiert nach Ordnungszahl, die zweiten nZeichen der Ausgabe sind die zweiten Zeichen jeder der Eingaben, sortiert nach Ordnungszahl und so weiter auf. Sie können davon ausgehen, dass die Zeichenfolgen alle gleich lang sind und mindestens eine Zeichenfolge vorhanden ist. Alle Zeichenfolgen bestehen nur aus druckbaren ASCII-Zeichen (Ordnungszahlen 32-127).

Referenzimplementierung in Python ( online ausprobieren ):

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

Beispiele:

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

Regeln

  • Standardlücken sind verboten
  • Das ist , also gewinnt die kürzeste Antwort in Bytes

Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert die Rangliste aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamtrangliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

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

Mego
quelle

Antworten:

11

GS2 , 4 Bytes

*Ü■/

Dadurch werden die Zeichenfolgen von STDIN gelesen, die durch Zeilenvorschübe getrennt sind.

Der Quellcode verwendet die CP437- Codierung. Probieren Sie es online!

Testlauf

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

Wie es funktioniert

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

Haskell, 39 36 Bytes

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

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

Transponieren Sie die Liste der Zeichenfolgen, ordnen sortSie sie zu und verketten Sie die resultierende Liste der Zeichenfolgen ( >>=im Listenkontext ist concatMap).

nimi
quelle
Genau das habe ich mir ausgedacht!
stolzer Haskeller
Ich hab nicht; Ich vergesse immer wieder, die Monad-Instanz für Dinge wie Listen auszunutzen. (+1)
ballesta25
5

TeaScript , 9 Bytes

_t¡ßlp¡)µ

TeaScript hat alle richtigen eingebauten Funktionen auf die falsche Weise implementiert.

Probieren Sie es online aus

Ungolfed

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

Erläuterung

_t()        // Transposes input array
    m(#     // Loops through inputs
       lp() // Sorts characters by char code
     )
j``         // Joins back into string
Downgoat
quelle
@intrepidcoder funktioniert gut für mich. Vielleicht hat Ihr Browser einige Dateien zwischengespeichert? Möglicherweise funktioniert das Löschen des Caches. Ich benutze allerdings Safari. Ich werde versuchen, die Dateien zu
aktualisieren
4

CJam, 5 Bytes

q~z:$

Probieren Sie es hier aus .

Geokavel
quelle
1
Ich habe dich um 14 Sekunden geschlagen; P.
Maltysen
4

Python, 50 48 Bytes

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

Danke an @xnor für -2 Bytes!

Dennis
quelle
4
Sie können "".joinin einer Variablen speichern .
23.
Oh, ich hatte keine Ahnung. Vielen Dank!
Dennis
4

JavaScript (ES6), 57 Byte

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

Oktave, 15 Bytes

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

Beispiel:

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

Julia, 46 Bytes

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

Dadurch wird eine unbenannte Funktion erstellt, die ein Array von Zeichenfolgen akzeptiert und eine Zeichenfolge zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z 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
Alex A.
quelle
1

Minkolang 0,13 , 46 Bytes

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

Probieren Sie es hier aus. Erwartet Eingaben wie"HELLO""world""!!!!!" (also keine Kommas).

Erläuterung

$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
El'endia Starman
quelle
1

GolfScript, 8 Bytes

~zip{$}%

Probieren Sie es online im Web GolfScript aus .

Wie es funktioniert

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

K, 10 Bytes

,/{x@<x}'+

Join ( ,/) die Art ( {x@<x}) jeder ( ') der transponierten ( +) einer Liste von Zeichenfolgen.

In Aktion:

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

Einfach, aber K ist hier ein bisschen verletzt, weil es keine Sortierfunktion für einzelne Zeichen gibt und stattdessen die Operation in einen Scatter-Gather-Indexoperator @und ein Grundelement unterteilt wird, das den Permutationsvektor ergibt, der eine Liste sortieren würde <.

JohnE
quelle
1

C ++ 14, 152 Bytes

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

Keine Vorteile von map + zip nutzen (rate warum)

Ungolfed + Nutzung

#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);
}
Zereges
quelle
1

Mathematica, 51 Bytes

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

String-Manipulation in Mathematica ist teuer ...

LegionMammal978
quelle
1

Japt , 12 Bytes 20

Ny m_q n q)q

Probieren Sie es online!

Erläuterung

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

PHP ,92 91 Bytes

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

Probieren Sie es online!

Ich bin zuversichtlich, dass dies kürzer gemacht werden könnte, wenn man nicht versucht, die eingebauten Array-Funktionen von PHP zu verwenden, sondern es versuchen muss!

Oder 85 Bytes

@ Night2's Swing, kürzer gemacht, indem man nicht versucht, die eingebauten Array-Funktionen von PHP zu verwenden:

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

Probieren Sie es online!

640 KB
quelle
@ Night2 schön gemacht! Sie sollten dieses als Ihr eigenes posten. Es ist zu schade, dass array_columnes mit einer Reihe von Zeichenfolgen nicht funktioniert, sonst wäre es für CG viel nützlicher. Und natürlich ist das Überspringen $argv[0]immer auch ein Schmerz ...
640 KB
0

Clojure / ClojureScript, 43 Byte

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

Erzeugt eine anonyme Funktion. In einem ClojueScript REPL geschrieben, sollte auch Clojure gültig sein.

Geben Sie es hier ein und rufen Sie über an (*1 ["HELLO" "world" "!!!!!"]). Oder machen (def f *1)und dann benutzen (f ["abc" "cba"]).

MattPutnam
quelle
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)};

Während Ceylon eine zipFunktion hat , werden nur zwei Iterables anstelle eines Iterables benötigt. unzipAuf der anderen Seite wird eine Iteration von Tupeln verwendet, und ich möchte meine Zeichenfolgen nicht in Tupel konvertieren. Also habe ich meine eigene Transponierungsfunktion implementiert, inspiriert von einer Haskell-Implementierung, die Google irgendwo für mich gefunden hat .

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

Die Arten von nund tkönnten viel allgemeiner definiert werden, aber das ist Codegolf ;-) ( nist ein Sonderfall von dem, was ich vor assertNarrowzwei Wochen vorgeschlagen habe ).

Paŭlo Ebermann
quelle
0

Perl 6 , 33 Bytes

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

Anwendungsbeispiel:

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)
Brad Gilbert b2gills
quelle
0

𝔼𝕊𝕄𝕚𝕟 15 Zeichen / 30 Bytes

Ѩťªï)ć⇀ѨŌ$ø⬯)ø⬯

Try it here (Firefox only).

Ich habe gerade festgestellt, dass Lodashs sortBy-Funktion auch für Strings funktioniert.

Mama Fun Roll
quelle
0

Stax , 5 Bytes

LMFop

So nah an LMNOP :(

Führen Sie es aus und debuggen Sie es unter staxlang.xyz!

Fügen Sie alle Eingaben in eine Liste von Zeichenfolgen ein ( L) und transponieren Sie diese Liste ( M). Für jede resultierende Zeichenfolge ( F) sortieren ( o) und drucken ( p).

Khuldraeseth na'Barya
quelle