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

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.

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).


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

@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

Python, 50 48 Bytes

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

Danke an @xnor für -2 Bytes!


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``)

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

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

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

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.

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 <.


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

1

Mathematica, 51 Bytes

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

String-Manipulation in Mathematica ist teuer ...



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!


@ 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"]).


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 ).


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)



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.