Zip e Classificação de Cordas

14

Dada uma lista de cadeias, produza uma única cadeia formada pegando um caractere de cada cadeia em cada posição, classificando-as por ordinal ASCII e anexando-as em ordem à cadeia de saída. Em outras palavras, para ncadeias de entrada, os primeiros ncaracteres da saída serão os primeiros caracteres de cada uma das entradas classificadas por ordinal, os segundos ncaracteres da saída serão os segundos caracteres de cada uma das entradas classificadas por ordinal, e assim em. Você pode supor que as strings são todas do mesmo comprimento e que haverá pelo menos uma string. Todas as seqüências de caracteres serão compostas apenas por caracteres imprimíveis ASCII (ordinais 32-127).

Implementação de referência em Python ( experimente 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

Exemplos:

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

Regras

  • As brechas padrão são proibidas
  • Isso é , então a resposta mais curta em bytes ganha

Entre os melhores

O snippet de pilha na parte inferior desta postagem gera o cabeçalho das respostas a) como uma lista da solução mais curta por idioma eb) como um cabeçalho geral.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet:

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

Mego
fonte

Respostas:

11

GS2 , 4 bytes

*Ü■/

Isso lê as seqüências de caracteres de STDIN, separadas por linhas de alimentação.

O código-fonte usa a codificação CP437 . Experimente online!

Execução de teste

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

Como funciona

*       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
fonte
6

Haskell, 39 36 bytes

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

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

Transponha a lista de cadeias, mapeie sort-a e concatene a lista resultante de cadeias ( >>=no contexto da lista é concatMap).

nimi
fonte
Eu vim exatamente com isso!
haskeller orgulhoso
Eu não; Eu continuo esquecendo de explorar a instância do Monad para coisas como listas. (+1)
ballesta25
5

Pitão, 5 bytes

Fecha ( C) a entrada ( Q), Maps Sort e, em seguida, sums.

sSMCQ

Experimente online .

Maltysen
fonte
5

TeaScript , 9 bytes

_t¡ßlp¡)µ

O TeaScript possui todos os recursos certos implementados de todas as maneiras erradas.

Experimente online

Ungolfed

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

Explicação

_t()        // Transposes input array
    m(#     // Loops through inputs
       lp() // Sorts characters by char code
     )
j``         // Joins back into string
Downgoat
fonte
@intrepidcoder funciona bem para mim. Talvez o seu navegador tenha armazenado alguns arquivos em cache? Talvez a limpeza do cache possa funcionar. Estou usando o Safari embora. Vou tentar atualizar os arquivos
Downgoat 23/11/2015
4

CJam, 5 bytes

q~z:$

Experimente aqui .

geokavel
fonte
1
Eu venci você por 14 segundos;
Maltysen 23/11/2015
4

Pitão, 50 48 bytes

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

Obrigado a @xnor por -2 bytes!

Dennis
fonte
4
Você pode salvar "".joinem uma variável.
Xnor
Oh, eu não fazia ideia. Obrigado!
Dennis
4

JavaScript (ES6), 57 bytes

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

Oitava, 15 bytes

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

Exemplo:

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

Julia, 46 bytes

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

Isso cria uma função sem nome que aceita uma matriz de cadeias e retorna uma cadeia. Para chamá-lo, dê um nome, por exemplo 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.
fonte
1

Tamanho 0.13 , 46 bytes

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

Experimente aqui. Espera entrada como "HELLO""world""!!!!!"(portanto, sem vírgulas).

Explicação

$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
fonte
1

GolfScript, 8 bytes

~zip{$}%

Experimente online no Web GolfScript .

Como funciona

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

K, 10 bytes

,/{x@<x}'+

Join ( ,/) o tipo de ( {x@<x}) cada ( ') da transposição ( +) de uma lista de strings.

Em ação:

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

Simples, mas K é prejudicado um pouco por não ter uma função de classificação de caractere único e, ao invés disso, dividir a operação em um operador de índice de dispersão @e uma primitiva que produz o vetor de permutação que ordenaria uma lista <.

JohnE
fonte
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;}};

Não usar nenhuma vantagem do mapa + zip (adivinhe por quê)

Ungolfed + use

#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
fonte
1

Mathematica, 51 bytes

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

A manipulação de strings no Mathematica é cara ...

LegionMammal978
fonte
1

Japonês , 12 bytes 20

Ny m_q n q)q

Experimente online!

Explicação

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

PHP ,92 91 bytes

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

Experimente online!

Estou confiante de que isso poderia ser feito mais curto se você não tentasse usar as funções de matriz internas do PHP, mas precisava tentar!

Ou 85 bytes

A oscilação do @ Night2, diminuída ao não tentar usar as funções de matriz incorporadas do PHP:

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

Experimente online!

640KB
fonte
@ Night2 bem feito! Você deve postar essa como sua. É uma pena que array_columnnão funcione em uma série de strings, caso contrário, seria um pouco mais útil para CG. E, claro, ter que pular $argv[0]é sempre uma dor muito ...
640KB
0

Clojure / ClojureScript, 43 bytes

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

Cria uma função anônima. Escrito em um REPL do ClojueScript, também deve ser um Clojure válido.

Digite aqui e , em seguida, ligue via (*1 ["HELLO" "world" "!!!!!"]). Ou faça (def f *1)e use (f ["abc" "cba"]).

MattPutnam
fonte
0

Ceilão, 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)};

Embora o Ceilão tenha uma zipfunção , são necessárias apenas duas iteráveis ​​em vez de uma iterável.unzip, por outro lado, utiliza iteráveis ​​de tuplas e não quero converter minhas strings em tuplas. Então, eu implementei minha própria função de transposição, inspirada em uma implementação Haskell que o Google encontrou para mim em algum lugar .

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

Os tipos de ne tpoderiam ser definidos muito mais gerais, mas este é o Codegolf ;-) ( né um caso especial do que propus assertNarrowhá duas semanas ).

Paŭlo Ebermann
fonte
0

Perl 6 , 33 bytes

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

Exemplo de uso:

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
fonte
0

, 15 caracteres / 30 bytes

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

Try it here (Firefox only).

Acabei de perceber que a função sortBy do Lodash também funciona em strings.

Mama Fun Roll
fonte
0

Stax , 5 bytes

LMFop

Tão perto de LMNOP :(

Execute e depure-o em staxlang.xyz!

Coloque todas as entradas em uma lista de strings ( L) e transponha essa lista ( M). Para cada sequência resultante ( F), ordene ( o) e imprima ( p).

Khuldraeseth na'Barya
fonte