Zip Zip and Sort

14

Biorąc pod uwagę listę ciągów, wypisz pojedynczy ciąg utworzony przez pobranie znaku z każdego ciągu w każdej pozycji, posortowanie ich według porządkowej ASCII i dołączenie ich w kolejności do ciągu wyjściowego. Innymi słowy, w przypadku nciągów wejściowych pierwsze nznaki danych wyjściowych będą pierwszymi znakami każdego z danych wejściowych posortowanymi według porządkowej, a drugan znaki danych wyjściowych będą drugimi znakami każdego z danych wejściowych posortowanych według liczby porządkowej, i tak na. Możesz założyć, że wszystkie ciągi są równej długości i że będzie co najmniej jeden ciąg. Wszystkie ciągi znaków będą się składały tylko z drukowalnych znaków ASCII (porządek 32-127).

Odwołanie do implementacji w Pythonie ( spróbuj online ):

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

Przykłady:

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

Zasady

  • Standardowe luki są zabronione
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach

Tabela liderów

Fragment kodu na dole tego postu generuje tabelę wyników na podstawie odpowiedzi a) jako lista najkrótszych rozwiązań dla każdego języka oraz b) jako ogólna tabela wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

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

Mego
źródło

Odpowiedzi:

11

GS2 , 4 bajty

*Ü■/

Odczytuje ciągi ze STDIN, oddzielone liniami.

Kod źródłowy używa kodowania CP437 . Wypróbuj online!

Testowe uruchomienie

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

Jak to działa

*       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
źródło
6

Haskell, 39 36 bajtów

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

Przykład użycia: ((>>=sort).transpose) ["HELLO","world","!!!!!"]-> "!Hw!Eo!Lr!Ll!Od".

Transponuj listę ciągów, zamapuj sortnad nią i połącz wynikową listę ciągów ( >>=w kontekście listy jest concatMap).

nimi
źródło
wymyśliłem dokładnie to!
dumny haskeller,
Ja nie; Wciąż zapominam o wykorzystywaniu instancji Monad do takich rzeczy jak listy. (+1)
ballesta25
5

TeaScript , 9 bajtów

_t¡ßlp¡)µ

TeaScript ma wszystkie właściwe wbudowane zaimplementowane na wszystkie niewłaściwe sposoby.

Wypróbuj online

Nie golfił

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

Wyjaśnienie

_t()        // Transposes input array
    m(#     // Loops through inputs
       lp() // Sorts characters by char code
     )
j``         // Joins back into string
Downgoat
źródło
@intrepidcoder działa dobrze dla mnie. Być może Twoja przeglądarka zbuforowała niektóre pliki? Być może wyczyszczenie pamięci podręcznej może działać. Używam jednak Safari. Spróbuję odświeżyć pliki
Downgoat
4

CJam, 5 bajtów

q~z:$

Wypróbuj tutaj .

geokavel
źródło
1
Pokonałem cię o 14 sekund; P.
Maltysen
4

Python, 50 48 bajtów

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

Dzięki @xnor za -2 bajty!

Dennis
źródło
4
Możesz zapisać "".joindo zmiennej.
xnor
Nie miałem pojęcia. Dzięki!
Dennis
4

JavaScript (ES6), 57 bajtów

a=>a[0].replace(/./g,(c,i)=>a.map(w=>w[i]).sort().join``)
George Reith
źródło
3

Oktawa, 15 bajtów

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

Przykład:

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

Julia, 46 bajtów

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

Tworzy to nienazwaną funkcję, która akceptuje tablicę ciągów i zwraca ciąg. Aby to nazwać, nadaj mu nazwę, npf=x->... .

Nie golfowany:

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.
źródło
1

Minkolang 0,13 , 46 bajtów

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

Wypróbuj tutaj. Oczekuje danych wejściowych takich jak "HELLO""world""!!!!!"(więc bez przecinków).

Wyjaśnienie

$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
źródło
1

GolfScript, 8 bajtów

~zip{$}%

Wypróbuj online na Web GolfScript .

Jak to działa

~         # Evaluate the input.
 zip      # Zip it.
    {$}%  # Map sort ($) over the resulting array.
Dennis
źródło
1

K, 10 bajtów

,/{x@<x}'+

Join ( ,/) rodzaj ( {x@<x}) each ( ') transpozycji (+ ) listy ciągów.

W akcji:

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

To proste, ale K trochę tu cierpi, ponieważ nie ma funkcji sortowania jednoznakowego, a zamiast tego dzieli operację na operator indeksu scatter-gather @i operację podstawową, która daje wektor permutacji, który sortowałby listę <.

JohnE
źródło
1

C ++ 14, 152 bajty

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

Brak korzystania z zalet map + zip (zgadnij dlaczego)

Ungolfed + użycie

#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
źródło
1

Mathematica, 51 bajtów

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

Manipulacja łańcuchem w Mathematica jest droga ...

LegionMammal978
źródło
1

Japt , 12 bajtów 20

Ny m_q n q)q

Wypróbuj online!

Wyjaśnienie

Ny       // Transpose inputs
  m_     // Maps through each new string
    q    // Split string
    n    // Sort string
    q    // Join
)q       // Join again
Downgoat
źródło
1

PHP ,92 91 bajtów

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

Wypróbuj online!

Jestem pewien, że można tego dokonać krócej, nie próbując korzystać z wbudowanych funkcji PHP, ale musiałem spróbować!

Lub 85 bajtów

@ Huśtawka Night2, wykonywana krócej, nie próbując używać wbudowanych funkcji PHP:

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

Wypróbuj online!

640 KB
źródło
@ Night2 ładnie zrobione! Powinieneś opublikować ten jako własny. Szkoda, że array_columnnie będzie działać na szeregu ciągów, w przeciwnym razie byłby nieco bardziej przydatny dla CG. I oczywiście konieczność przeskakiwania $argv[0]to również zawsze ból ...
640 KB
0

Clojure / ClojureScript, 43 bajty

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

Tworzy anonimową funkcję. Napisany w ClojueScript REPL, powinien być również prawidłowym Clojure.

Wpisz go tutaj , a następnie zadzwoń przez (*1 ["HELLO" "world" "!!!!!"]). Lub zrób, (def f *1)a następnie użyj (f ["abc" "cba"]).

MattPutnam
źródło
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)};

Podczas gdy Cejlon ma zipfunkcję , zajmuje tylko dwie iterowalne zamiast iterowalnej z nich. unzipz drugiej strony wymaga iteracji krotek i nie chcę przekształcać ciągów w krotki. Wdrożyłem więc własną funkcję transpozycji, zainspirowaną implementacją Haskell, którą Google gdzieś dla mnie znalazło .

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

Rodzaje ni tmożna by zdefiniować znacznie bardziej ogólnie, ale to jest Codegolf ;-) ( njest to szczególny przypadek tego, co zaproponowałem assertNarrowdwa tygodnie temu ).

Paŭlo Ebermann
źródło
0

Perl 6 , 33 bajtów

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

Przykładowe użycie:

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
źródło
0

𝔼𝕊𝕄𝕚𝕟, 15 znaków / 30 bajtów

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

Try it here (Firefox only).

Właśnie zdałem sobie sprawę, że funkcja sortBy firmy Lodash działa również na łańcuchach.

Mama Fun Roll
źródło
0

Stax , 5 bajtów

LMFop

Tak blisko LMNOP :(

Uruchom i debuguj go na staxlang.xyz!

Umieść wszystkie dane wejściowe w jednej liście ciągów ( L) i transponuj tę listę ( M). Dla każdego wynikowego ciągu ( F) posortuj ( o) i wydrukuj ( p).

Khuldraeseth na'Barya
źródło