String Zip and Sort

14

Dada una lista de cadenas, genere una única cadena formada tomando un carácter de cada cadena en cada posición, ordenándolas por ordinal ASCII y agregándolas en orden a la cadena de salida. En otras palabras, para las ncadenas de entrada, los primeros ncaracteres de la salida serán los primeros caracteres de cada una de las entradas ordenadas por ordinal, los segundos ncaracteres de la salida serán los segundos caracteres de cada una de las entradas ordenadas por ordinal, y así en. Puede suponer que las cadenas son todas de igual longitud y que habrá al menos una cadena. Todas las cadenas estarán compuestas solo por caracteres imprimibles ASCII (ordinales 32-127).

Implementación de referencia en Python ( pruébelo en línea ):

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

Ejemplos:

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

Reglas

  • Las lagunas estándar están prohibidas
  • Este es el , por lo que la respuesta más corta en bytes gana

Tabla de clasificación

El Fragmento de pila al final de esta publicación genera la tabla de clasificación a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

## Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:

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

Mego
fuente

Respuestas:

11

GS2 , 4 bytes

*Ü■/

Esto lee las cadenas de STDIN, separadas por avances de línea.

El código fuente usa la codificación CP437 . Pruébalo en línea!

Prueba de funcionamiento

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

Cómo 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
fuente
6

Haskell, 39 36 bytes

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

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

Transponga la lista de cadenas, mapee sortsobre ella y concatene la lista resultante de cadenas ( >>=en el contexto de la lista es concatMap).

nimi
fuente
se me ocurrió exactamente esto!
orgulloso Haskeller
No hice; Me olvido de explotar la instancia de Monad para cosas como listas. (+1)
ballesta25
5

TeaScript , 9 bytes

_t¡ßlp¡)µ

TeaScript tiene todas las funciones integradas correctas implementadas de manera incorrecta.

Pruébalo en línea

Sin golf

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

Explicación

_t()        // Transposes input array
    m(#     // Loops through inputs
       lp() // Sorts characters by char code
     )
j``         // Joins back into string
Downgoat
fuente
@intrepidcoder funciona bien para mí. Tal vez su navegador ha almacenado en caché algunos archivos? Quizás limpiar su caché podría funcionar. Aunque estoy usando Safari. Intentaré actualizar los archivos
Downgoat
4

CJam, 5 bytes

q~z:$

Pruébalo aquí .

geokavel
fuente
1
Te gané como 14 segundos; P.
Maltysen
4

Python, 50 48 bytes

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

¡Gracias a @xnor por -2 bytes!

Dennis
fuente
44
Puede guardar "".joinen una variable.
xnor
Oh, no tenía idea. ¡Gracias!
Dennis
4

JavaScript (ES6), 57 bytes

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

Octava, 15 bytes

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

Ejemplo:

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

Julia, 46 bytes

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

Esto crea una función sin nombre que acepta una matriz de cadenas y devuelve una cadena. Para llamarlo, asígnele un nombre, por ejemplo f=x->....

Sin golf:

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

Minkolang 0.13 , 46 bytes

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

Pruébalo aquí. Espera entradas como "HELLO""world""!!!!!"(así que no hay comas).

Explicación

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

GolfScript, 8 bytes

~zip{$}%

Pruébelo en línea en Web GolfScript .

Cómo funciona

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

K, 10 bytes

,/{x@<x}'+

Unir ( ,/) el tipo de ( {x@<x}) cada ( ') de la transposición ( +) de una lista de cadenas.

En acción:

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

Simple, pero K se lastima un poco aquí al no tener una función de clasificación de un solo carácter y en su lugar dividir la operación en un operador de índice de dispersión-reunión @y una primitiva que produce el vector de permutación que ordenaría una lista <.

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

No utilizo ninguna ventaja de map + zip (adivina por qué)

Sin golf + uso

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

Mathematica, 51 bytes

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

La manipulación de cadenas en Mathematica es costosa ...

LegionMammal978
fuente
1

Japt , 12 bytes 20

Ny m_q n q)q

Pruébalo en línea!

Explicación

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

PHP ,92 91 bytes

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

Pruébalo en línea!

Estoy seguro de que esto podría hacerse más corto al no intentar usar las funciones de matriz integradas de PHP, ¡pero tuve que intentarlo!

O 85 bytes

El swing de @ Night2, hecho más corto al no intentar usar las funciones de matriz integradas de PHP:

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

Pruébalo en línea!

640 KB
fuente
@ Night2 muy bien hecho! Deberías publicarlo como tuyo. Es una pena que array_columnno funcione en una serie de cadenas, de lo contrario sería bastante más útil para CG. Y, por supuesto, tener que saltar $argv[0]siempre es un dolor también ...
640KB
0

Clojure / ClojureScript, 43 bytes

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

Crea una función anónima. Escrito en un ClojueScript REPL, también debe ser válido Clojure.

Ingrese aquí , luego llame a través de (*1 ["HELLO" "world" "!!!!!"]). O hazlo (def f *1)y luego úsalo (f ["abc" "cba"]).

MattPutnam
fuente
0

Ceilán, 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)};

Mientras que Ceilán tiene una zipfunción , solo necesita dos iterables en lugar de uno iterable. unzip, por otro lado, toma un iterable de tuplas, y no quiero convertir mis cadenas en tuplas. Así que implementé mi propia función de transposición, inspirada en una implementación de Haskell que Google encontró para mí en alguna parte .

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

Los tipos de ny tpodrían definirse de manera mucho más general, pero esto es Codegolf ;-) ( nes un caso especial de qué que propuse assertNarrowhace dos semanas ).

Paŭlo Ebermann
fuente
0

Perl 6 , 33 bytes

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

Ejemplo 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
fuente
0

𝔼𝕊𝕄𝕚𝕟, 15 caracteres / 30 bytes

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

Try it here (Firefox only).

Me acabo de dar cuenta de que la función sortBy de Lodash también funciona en cadenas.

Mama Fun Roll
fuente
0

Stax , 5 bytes

LMFop

Tan cerca de LMNOP :(

¡Ejecútelo y depúrelo en staxlang.xyz!

Coloque todas las entradas en una lista de cadenas ( L) y transponga esta lista ( M). Para cada cadena resultante ( F), ordénela ( o) e imprímala ( p).

Khuldraeseth na'Barya
fuente