Строка Zip и сортировка

14

Имея список строк, выведите единственную строку, сформированную путем взятия символа из каждой строки в каждой позиции, сортировки их по порядковому номеру ASCII и добавления их по порядку к выходной строке. Другими словами, для nвходных строк первые nсимволы вывода будут первыми символами каждого из входов, отсортированных по порядковому номеру, вторые nсимволы вывода будут вторыми символами каждого из входов, отсортированных по порядковому номеру, и т.д. на. Вы можете предположить, что все строки имеют одинаковую длину и что будет хотя бы одна строка. Все строки будут состоять только из печатных символов ASCII (порядковые номера 32-127).

Ссылочная реализация в Python ( попробуйте онлайн ):

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

Примеры:

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

правила

  • Стандартные лазейки запрещены
  • Это , поэтому выигрывает самый короткий ответ в байтах

Leaderboard

Фрагмент стека в нижней части этого поста создает таблицу лидеров из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш счет равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

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

Вы также можете сделать имя языка ссылкой, которая затем будет отображаться во фрагменте:

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

Mego
источник

Ответы:

11

GS2 , 4 байта

*Ü■/

Это читает строки из STDIN, разделенные переводом строки.

Исходный код использует кодировку CP437 . Попробуйте онлайн!

Тестовый забег

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

Как это устроено

*       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 байт

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

Пример использования: ((>>=sort).transpose) ["HELLO","world","!!!!!"]-> "!Hw!Eo!Lr!Ll!Od".

Транспонировать список строк, отобразить sortего и объединить результирующий список строк ( >>=в контексте списка есть concatMap).

Ними
источник
я придумал именно это!
гордый haskeller
Я не; Я постоянно забываю использовать экземпляр Monad для таких вещей, как списки. (+1)
ballesta25
5

TeaScript , 9 байт

_t¡ßlp¡)µ

TeaScript имеет все правильные встроенные модули, реализованные всеми неправильными способами.

Попробуйте онлайн

Ungolfed

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

объяснение

_t()        // Transposes input array
    m(#     // Loops through inputs
       lp() // Sorts characters by char code
     )
j``         // Joins back into string
Downgoat
источник
@intrepidcoder отлично работает для меня. Возможно, ваш браузер кэшировал некоторые файлы? Возможно, очистка вашего кэша может сработать. Я использую Safari, хотя. Я попробую обновить файлы
Downgoat
4

CJam, 5 байтов

q~z:$

Попробуй это здесь .

geokavel
источник
1
Я побил тебя, как 14 секунд; P.
Maltysen
4

Python, 50 48 байтов

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

Спасибо @xnor за -2 байта!

Деннис
источник
4
Вы можете сохранить "".joinв переменной.
xnor
О, я понятия не имел. Благодарность!
Деннис
4

JavaScript (ES6), 57 байт

a=>a[0].replace(/./g,(c,i)=>a.map(w=>w[i]).sort().join``)
Джордж Райт
источник
3

Октава, 15 байт

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

Пример:

octave:1> (@(a)sort(a)(:)')(["abc";"cba"])
ans = acbbac
octave:2> (@(a)sort(a)(:)')(["HELLO";"world";"!!!!!"])
ans = !Hw!Eo!Lr!Ll!Od
alephalpha
источник
2

Юлия, 46 байт

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

Это создает безымянную функцию, которая принимает массив строк и возвращает строку. Чтобы назвать его, дайте ему имя, например 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

Минколанг 0,13 , 46 байт

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

Попробуй это здесь. Ожидает ввода, как "HELLO""world""!!!!!"(так что без запятых).

объяснение

$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'ndia Starman
источник
1

GolfScript, 8 байт

~zip{$}%

Попробуйте онлайн на сайте GolfScript .

Как это устроено

~         # Evaluate the input.
 zip      # Zip it.
    {$}%  # Map sort ($) over the resulting array.
Деннис
источник
1

К, 10 байт

,/{x@<x}'+

Join ( ,/) своего рода ( {x@<x}) each ( ') из transpose ( +) списка строк.

В бою:

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

Все просто, но K здесь немного больно, если у него нет односимвольной функции сортировки, а вместо этого делится операция на оператор индекса разброса @и примитив, который дает вектор перестановки, который будет сортировать список <.

Johne
источник
1

C ++ 14, 152 байта

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

Не пользуясь преимуществами map + zip (угадайте почему)

Ungolfed + использование

#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
источник
1

Mathematica, 51 байт

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

Манипулирование строками в Mathematica стоит дорого ...

LegionMammal978
источник
1

PHP ,92 91 байт

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

Попробуйте онлайн!

Я уверен, что это можно сделать короче, не пытаясь использовать встроенные в PHP функции массива, но пришлось попробовать!

Или 85 байт

Качели @ Night2, сделанные короче, не пытаясь использовать встроенные в PHP функции массива:

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

Попробуйте онлайн!

640 КБ
источник
@ Night2 красиво сделано! Вы должны опубликовать это как свой собственный. Это очень плохо, что array_columnне будет работать с массивом строк, иначе это будет немного более полезно для CG. И, конечно, пропустить $argv[0]это тоже всегда
неприятно
0

Clojure / ClojureScript, 43 байта

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

Создает анонимную функцию. Написано в ClojueScript REPL, также должен быть действительным Clojure.

Введите его здесь , затем позвоните через (*1 ["HELLO" "world" "!!!!!"]). Или делай, (def f *1)а потом пользуйся (f ["abc" "cba"]).

MattPutnam
источник
0

Цейлон, 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)};

В то время как у Цейлона есть zipфункция , она требует только двух итераций вместо итерируемых из них. unzipс другой стороны, принимает итеративный набор кортежей, и я не хочу конвертировать мои строки в кортежи. Поэтому я реализовал свою собственную функцию транспонирования, вдохновленную реализацией на Haskell, которую Google где-то нашел для меня .

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

Типы nи tмогут быть определены гораздо более общие, но это Codegolf ;-) ( nэто частный случай того, что я предложил, как assertNarrowдве недели назад ).

Пауло Эберманн
источник
0

Perl 6 , 33 байта

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

Пример использования:

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)
Брэд Гилберт b2gills
источник
0

𝔼𝕊𝕄𝕚𝕟, 15 символов / 30 байтов

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

Try it here (Firefox only).

Просто понял, что функция sortBy Lodash работает и со строками.

Mama Fun Roll
источник
0

Stax , 5 байт

LMFop

Так близко к LMNOP :(

Запустите и отладьте его на staxlang.xyz!

Поместите все входные данные в один список строк ( L) и транспонируйте этот список ( M). Для каждой полученной строки ( F), sort ( o) и print ( p) это.

Хулдрасет на'Барья
источник