Рядок Zip та Sort


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"

Правила

  • Стандартні лазівки заборонені
  • Це , тому найкоротша відповідь у байтах виграє

Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує таблицю лідерів з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальну таблицю лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## 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 має всі правильні вбудовані модулі, реалізовані абсолютно неправильно.

Спробуйте в Інтернеті

Безумовно

_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

Пітон, 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->....

Безголівки:

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}'+

Приєднати ( ,/) різновид ( {x@<x}) кожного ( ') транспозиції ()+ ) списку рядків.

Дія:

  ,/{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

Математика, 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]завжди теж біль
640KB

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)



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.