Строка 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

Ответы:


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

@intrepidcoder отлично работает для меня. Возможно, ваш браузер кэшировал некоторые файлы? Возможно, очистка вашего кэша может сработать. Я использую Safari, хотя. Я попробую обновить файлы
Downgoat


4

Python, 50 48 байтов

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

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


4
Вы можете сохранить "".joinв переменной.
xnor

О, я понятия не имел. Благодарность!
Деннис


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

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


1

К, 10 байт

,/{x@<x}'+

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

В бою:

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

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


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

1

Mathematica, 51 байт

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

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



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

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


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


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)


0

Желе , 3 байта

ZṢ€

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

Действителен только в том случае, если рассматривается как полная программа : полученное значение представляет собой список строк, но при его печати Jelly неявно выравнивает его .

  €    Map
 Ṣ     sort
Z      over the columns of the input.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.