Чередовать строки


30

Вдохновение. * Я не могу поверить, что у нас не было этого вызова раньше:

задача

Учитывая одну или несколько печатаемых строк ASCII, чередуйте их, беря один символ из каждой строки, циклически до тех пор, пока не выйдет из символов. Если в строке заканчиваются символы перед остальными, просто пропустите ее.

Примеры

SIMPLE дает SIMPLE

POLLSи EPEESдаетPEOPLELESS

LYESи APRONSдаетLAYPERSONS

ABCDEи a cи 123 567даетAa1B 2Cc3D E567

"\n$?*и (пустая строка) и ,(.)" (конечный пробел) дает ",\(n.$)?"* (конечный пробел)


* Есть более короткие решения APL.


Поскольку это в основном просто операция транспонирования, у нас было несколько очень похожих задач, но, возможно, ни одна из них не была такой же.
Мартин Эндер

7
У меня был этот вопрос на моем CS HW, это означает, что я могу закрыть это как домашнее задание? ; P
Downgoat

@EriktheOutgolfer Круто! Я кое-что узнал сегодня.
Адам

Ответы:


23

Желе , 1 байт

Z

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

Встроенный «transpose» сделает именно это со списком строк.


Мне интересно, как бы выглядел код, если бы вам приходилось заполнять короткие строки пробелами?
Адам

2
Это было бы z⁶. z«транспонировать влево, дополняя правым»; это пространство.
Линн

1
@ Adám Jelly очень хорошо работает со списками; где заканчиваются встроенные модули и начинаются языковые конструкции / дизайн?
Steenbergh

1
@ Линн в желе? Все в списках Atoms и Quicks - встроенные модули.
Adám

2
@ Adám ;"(поэлементная конкатенация) решит задачу без встроенного.
Деннис

8

Python 2, 101 89 86 69 байт

Я надеюсь, что смогу каким-то образом перенести это в лямбду, сократив его, сделав рекурсивным. Это не идеально, потому что вы надеетесь, что транспонирование будет короче, к сожалению, это не так (из того, что мне удалось придумать до сих пор).

f=lambda s:' '*any(s)and''.join(x[:1]for x in s)+f([x[1:]for x in s])

Старые решения:

w=input();o=''
while any(w):
 for i in range(len(w)):o+=w[i][:1];w[i]=w[i][1:]
print o

lambda s:''.join(''.join([c,''][c<' ']for c in x)for x in map(None,*[list(y)for y in s]))

w=input();o=''
while any(x>=' 'for x in w):
 for i in range(len(w)):o+=w[i][:1];w[i]=w[i][1:]
print o

спасибо mathmandan за то, что заставил меня чувствовать себя немым;) спас мне кучу байтов! (по старому решению)


Не могли бы вы просто сделать while any(w):? Пустые строки являются ложными в Python.
Матмандан

@mathmandan Вы абсолютно правы, не знаете, о чем я думал ..
Каде

Нет проблем :) Ваше новое решение выглядит великолепно, за исключением того, что я думаю, что вам нужно подготовиться f=.
Матмандан

Вы можете снять []рекурсивный вызов, оставив f(x[1:] for x in s), что делает его генератором понимания, который действует так же, как список в этом контексте.
биоласка



7

Pyth - 3 байта

Очень просто, добавим расширение позже, на мобильном телефоне.

s.T

Тестирование

s                         Join all the strings together
 .T                       Transpose, without chopping off overhang
  (Q implicit)

4
@Daniel Я тоже в школе: P
Maltysen

Есть ли планы по добавлению объяснения?
Джон Дворак

@JanDvorak уверен, что делает это сейчас.
Maltysen

6

JavaScript (ES6), 52 46 байт

f=([[c,...s],...a])=>s+a?c+f(s+s?[...a,s]:a):c

Принимает ввод как массив строк и выводит как одну строку.

Тестовый фрагмент

f=([[c,...s],...a])=>s+a?c+f(s+s?[...a,s]:a):c

g=a=>console.log("Input:",JSON.stringify(a),"Output:",JSON.stringify(f(a)))

g(["SIMPLE"])
g(["POLLS","EPEES"])
g(["LYES","APRONS"])
g(["ABCDE","a c","123 567"])
g(["\"\\n$?*",",(.)\" "]) // Backslash and quote are escaped, but in/output are correct


f=([[c,...s],...a])=>c?c+f([...a,s]):a+a&&f(a)
Нил

@Neil Это отличный подход. Мне удалось
сыграть

6

Haskell, 33 байта

import Data.List
concat.transpose

Попробуйте это на Ideone. Использование:

Prelude Data.List> concat.transpose$["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"

Без использования встроенного: ( 38 34 байта)

f[]=[]
f x=[h|h:_<-x]++f[t|_:t<-x]

Попробуйте это на Ideone. 4 байта благодаря Zgarb! Использование:

Prelude> f["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"

1
Вы можете удалить все парены в альтернативной версии. Все еще не побьет импорт все же.
Згарб

Вам действительно нужен базовый вариант?
xnor

Не берите в голову, конечно, базовый случай необходим.
xnor

@xnor Вы также не можете переместить базовый регистр до конца и заменить его, f a=aчтобы сохранить байт, потому что оба []имеют разные типы ... так близко.
Лайкони

5

C, 114 84 байта

-20 байт для не расчета длины.

i,b;f(char**s){b=1;while(b){i=-1;b=0;while(s[++i]>0)if(*s[i])putchar(*s[i]++),++b;}}

Принимает массив указателей на символы и требует, чтобы последний элемент был нулевым указателем (см. Использование).

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

i,b;f(char**s){
 b=1;
 while(b){
  i=-1;
  b=0;
  while(s[++i]>0)
   if(*s[i])
    putchar(*s[i]++),++b;
 }
}


int main(){
 char*a[]={ 
//  "POLLS","EPEES"
//  "LYES","APRONS"
 "ABCDE","a c","123 567"
 ,0};
 f(a);
 puts("");
}

Разрешено ли использование printf / sprintf? : D ты бы выиграл довольно много байтов.
Вальфрат

@ Walfrat Без прямой печати мне нужно было бы выделить строку, так как же это можно сохранить.
Карл Напф

это было до редактирования, где вы добавили ++ b и удалили вычисление длины, так что yes больше не работает.
Вальфрат

@ Walfrat Да, но у меня был mallocи returnраньше, и это было дольше, чем просто печать
Карл Напф

5

PHP, 68 67 байт

for(;$f=!$k=$f;$i++)for(;y|$v=$argv[++$k];$f&=""==$c)echo$c=$v[$i];

Зацикливает аргументы командной строки. Беги с -r.

После внутреннего цикла, $fэто 1когда все строки закончены, 0остальное (битовые &забросы ""==$cв межд).
Следующая итерация внешнего цикла: копирование $fв $k(сохраняет один байт из $k=0) и переключение $f:
когда все строки завершены, $fнаступает момент, falseи цикл прерывается.


Не работает с пустыми строками ввода. Посмотрите на последнюю TestCase
aross

@aross: исправлено. Спасибо.
Тит

4

Сетчатка , 13 байт

Количество байтов предполагает кодировку ISO 8859-1.

O$#`.
$.%`
¶

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

объяснение

O$#`.
$.%`

Это основано на стандартной технике транспонирования в сетчатке. Мы сортируем ( O) все символы, не являющиеся переводом строки ( .), по ( $#) количеству символов перед ними в одной строке ( $.%`), т.е. их горизонтальному положению.

Затем второй этап просто удаляет перевод строки из ввода.


4

Ява, 19 + 155 = 174 160

String f(java.util.Queue<String> q){String s,r="";while(!q.isEmpty()){s=q.poll();r+=s.isEmpty()?"":s.charAt(0);if(s.length()>1)q.add(s.substring(1));}return r;}

Ungolfed:

  String f(java.util.Queue<String> q) {
    String s, r = "";
    while (!q.isEmpty()) {
      s = q.poll();
      r += s.isEmpty() ? "" : s.charAt(0);
      if (s.length() > 1) {
        q.add(s.substring(1));
      }
    }
    return r;
  }

Выход:

ПРОСТО

PEOPLELESS

непрофессионалы

Aa1B 2Cc3D E567

", (n. $)?" *

Первая модификация: объединенная строковая декларация для сохранения нескольких байтов. Удаленный import, он использовался main()методом (не показан здесь), который также был необходим LinkedList. Меньше байтов для Queueпрямой ссылки .


инициализация строки s строкой r может спасти еще немного
Syamesh K

Я знаю, что это было почти год назад, но вы можете String f(java.util.Queue<String>q){String s,r="";for(;!q.isEmpty();r+=s.isEmpty()?"":s.charAt(0))if((s=q.poll()).length()>1)q.add(s.substring(1));return r;}
Кевин Круйссен

3

PHP, 77 байт

Golfed

function($a){for($d=1;$d!=$s;$i++){$d=$s;foreach($a as$v)$s.=$v[$i];}echo$s;}

Анонимная функция, которая принимает массив строк.

Я уверен, что это может быть больше в гольфе, но это рано. На каждой итерации мы берем i-ю букву из каждой заданной строки и добавляем ее к нашей последней строке, по одной за раз. PHP просто выдает предупреждения, если мы получаем доступ к битам строк, которые не существуют, так что это нормально. Мы останавливаемся только тогда, когда не было сделано никаких изменений после циклического прохождения всех строк один раз.

Я чувствую, что использование $dможет быть в гольфе больше, но это рано. :П


Как именно вы помещаете массив строк в один аргумент?
Тит

@Titus. Знаешь, я никогда не думал об этом. Я просто предположил, что ты мог.
Ксандерхолл

3

На самом деле , 7 6 байт

Предложения по игре в гольф приветствуются! Попробуйте онлайн!

Изменить: -1 байт благодаря Тил Пеликан.

a Z♂ΣΣ

Ungolfing

          Implicit input each string.
a         Invert the stack so that the strings are in the correct order.
<space>   Get the number of items on the stack, len(stack).
Z         Zip all len(stack) strings into one, transposing them.
♂Σ        sum() every transposed list of chars into strings.
Σ         sum() again to join the strings together.

Вы не можете удалить #, чтобы сделать его 6 байтов?
Тил пеликан

@Tealpelican Welp, теперь мне нужно будет просмотреть все мои старые ответы на самом деле и посмотреть, не могу ли я изменить Z♂#Σих Z♂Σво всех. Спасибо за совет: D
Sherlock9

Первый раз, глядя на язык, это выглядит так весело! Рад, что смог помочь :))
Чирок пеликан



2

J , 13 байт

({~/:)&;#\&.>

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

На основании вдохновения для этого вопроса.

Другой способ сделать это занимает 27 байтов, но работает с использованием транспонирования. Большинство байтов предназначены для обработки автоматически добавляемых нулей из-за заполнения.

[:u:0<:@-.~[:,@|:(1+3&u:)&>

объяснение

({~/:)&;#\&.>  Input: list of boxed strings S
          &.>  For each boxed string x in S
        #\       Get the length of each prefix from shortest to longest
                 This forms the range [1, 2, ..., len(x)]
                 Rebox it
(    )         Operate on S and the prefix lengths
      &;         Raze both
   /:            Grade up the raze of the prefix lengths
 {~              Index into the raze of S using the grades
               Return

Запрещение смешанных массивов J действительно вредит вам здесь. Попробуйте это в APL.
Адам

2

Утилиты Bash + GNU, 55

 eval paste `sed "s/.*/<(fold -1<<<'&')/g"`|tr -d \\n\\t

Ввод / вывод через STDIN (разделенный строкой) и STDOUT.

sedФорматирует каждую строку к замещению процесса Баша . Затем они evalэд в pasteделать фактическое перемежения. trзатем удаляет ненужные символы новой строки и вкладки.

Ideone.


2

PHP, 63 байта

Примечание: используется кодировка IBM-850

for(;$s^=1;$i++)for(;n|$w=$argv[++$$i];$s&=$x<~■)echo$x=$w[$i];

Запустите так:

php -r 'for(;$s^=1;$i++)for(;n|$w=$argv[++$$i];$s&=$x<~■)echo$x=$w[$i];' "\"\n\$?*" "" ",(.)\" " 2>/dev/null;echo
> ",\(n.$)?"* 

объяснение

for(                       # Iterate over string index.
  ;
  $s ^= 1;                 # Continue until $s (stop iterating) is 1.
                           # Flip $s so each iteration starts with $s
                           # being 1.
  $i++                     # Increment string index.
)
  for(
    ;
    "n" | $w=$argv[++$$i]; # Iterate over all input strings. OR with "n"
                           # to allow for empty strings.
    $s &= $x<~■            # If last character printed was greater than
                           # \x0 (all printable chars), set $s to 0,
                           # causing the loop to continue.
  )
    echo $x = $w[$i];      # Print char $i of current string.

IBM-850 ?! Это естественная кодировка для PHP?
Адам

@ Adám, что ты подразумеваешь под "естественным"? PHP обрабатывает байты в диапазоне 128-255 как текст, который поэтому интерпретируется как константа. Если константа не определена, она будет интерпретирована как строка. Это так, что я могу сделать ~■(отрицанный двоичный код 254) вместо "\x1"(двоичный 1).
aross

1
Понимаю. Дело не в том, что вам действительно нужна эта кодовая страница, вам просто нужен 254 байт.
Адам

@ Adám да, кодовая страница просто делает ее печатным символом, который немного менее раздражает.
aross

Отличное использование $$!
Тит

2

Python 3, 75 байт

Я знаю, что другой Python один короче, но это первый раз, когда я использовал его mapв своей жизни, поэтому я очень горжусь этим

lambda n:''.join(i[k]for k in range(max(map(len,n)))for i in n if len(i)>k)

1

C 75 71 байт

Единственным ограничением является длина выхода. В настоящее время это 99, но его можно легко растянуть до 999 (+1 байт).

i;main(a,b)char**b;{a--;for(;i<99;i++)*b[i%a+1]&&putchar(*b[i%a+1]++);}

Ungolfed:

i;
main( a, b )
char **b;
{
    a--;
    for( ; i < 99; i++ )
        *b[i % a + 1] && putchar( *b[i % a + 1]++ );
}

1

Oracle SQL, 195 байт

    select listagg(b,'') within group(order by l,o) from(select substr(a,level,1) b,level l,o from i start with length(a)>0 connect by prior a=a and level<=length(a) and prior sys_guid() is not null)

Принимает свои данные из таблицы с именами iстолбцов a(содержащих строку) и o(порядок строки):

    create table i (a varchar2(4000), a integer)

Объяснение:
Мы используем, CONNECT BYчтобы разбить строки на каждого из составляющих их персонажей. PRIOR SYS_GUID()будучи NOT NULLуверенным, мы не в конечном итоге застряли в петле.
Затем мы объединяем отдельные символы с, LISTAGGно мы перемешиваем ихORDER BY предложения, упорядочивая их сначала по их положению в исходной строке, а затем - по строке, из которой они получены.

Не так коротко, как другие ответы, но SQL на самом деле не подразумевается как язык манипулирования строками :)


1

Python 2, 128 96

Я надеялся не использовать itertools

a=lambda a:"".join([i for i in reduce(lambda: b,c:b+c, map(None,*map(lambda m:list(m),a)) if i])

Ungolfed

 a=lambda a:                              #Start a lambda taking in a
    "".join(                              #Join the result together with empty string
        [i for i in reduce(               #For every item, apply the function and 'keep'
           lambda: b,c:b+c,               #Add lists from...
                map(None,*map(            #None = Identity function, over a map of...
                    lambda m:list(m), a)  #list made for mthe strings m
                   ) if i                 #truthy values only (otherwise the outer map will padd with None.
       ])

Был бы признателен за отзыв / совет по улучшению этого.
Pureferret


1

R , 73 байта

for(i in 1:max(nchar(s<-scan(,""))))for(j in seq(s))cat(substr(s[j],i,i))

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

Объяснение: очень просто (но многословно), просто циклически iпечатайте символ jth строки. К счастью, substrвозвращает пустую строку, если задан вход вне допустимого диапазона.


0

Python, 112 байт

i=len(x)if len(x)>len(y) else len(y) h=0 a="" while h<i: if h<len(x) a+=x[h] if h<len(y): a += y[h] h+=1 print a

6
Ваше форматирование действительно испорчено .. откуда вы вообще взяли xи yоткуда?
Каде

0

Perl 5 , 53 байта

$i=0,map{push@{$a[$i++]},$_}/./g for<>;print@$_ for@a

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

метод

Создает двумерный массив, в котором количество строк равно длине самой длинной строки, а максимальное количество столбцов равно количеству строк. Затем выведите каждую строку массива без пробелов.


0

TXR Lisp , 20 байтов

(opip weave cat-str)

Бег:

1> (opip weave cat-str)
#<intrinsic fun: 0 param + variadic>
2> [*1 "LYES" "APRONS"]
"LAYPERSONS"
3> [*1 "ABCDE" "a c" "" "123 567"]
"Aa1B 2Cc3D E567"
4> [*1 "\"\\n$?*" "" ",(.) "]
"\",\\(n.$)? *"

weaveФункция ленива, поэтому он возвращает список, поэтому мы должны заставить результат в строку. Будучи ленивым, он может плести бесконечные последовательности. Например, мы можем соткать четные и нечетные натуральные числа, которые сами по себе представляют собой бесконечные ленивые списки:

5> (take 20 (weave (range 2 : 2) (range 1 : 2)))
(2 1 4 3 6 5 8 7 10 9 12 11 14 13 16 15 18 17 20 19)

0

K (ок) , 35 29 байт

Решение:

{`c$r@&~^r:,/+(`i$x)[;!#,/x]}

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

Пример:

> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("ABCDE";"a c";"123 567")
"Aa1B 2Cc3D E567"
> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("\n$?*";"";",(.)\" ")
"\n,$(?.*)\" "
> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("POLLS";"EPEES")
"PEOPLELESS"

Объяснение:

Используйте индексирование 2-го уровня, чтобы вытащить индексы от 0 до max (длина сплющенного списка) во всех входных списках. Любая индексация за пределами подсписка вернет ноль. Отразить (повернуть на 90), сгладить, а затем вытянуть ненулевые результаты.

Заметки:

  • Я привел к integer ( i$), чтобы мы получили полезные нули, так как space ( ) считается нулевым для списка символов, что означает, что вы не можете отличить нули от допустимых пробелов.
  • Также я не мог заставить TIO работать с вводом (нормально работал в oK repl), поэтому ссылка TIO включает в себя пример "ABCDE" ....

0

Jq 1,5 , 49 байт

map(explode)|transpose|map(map(values)[])|implode

объяснение

                      # example input:          ["LYES","APRONS"]
  map(explode)        # make list of ordinals   [[76,89,69,83],[65,80,82,79,78,83]]
| transpose           # zip lists               [[76,65],[89,80],[69,82],[83,79],[null,78],[null,83]]
| map(map(values)[])  # rm nulls and flatten    [76,65,89,80,69,82,83,79,78,83]
| implode             # convert back to string  "LAYPERSONS"

Пробный прогон

$ paste input <(jq -Mrc 'map(explode)|transpose|map(map(values)[])|implode' input)
["SIMPLE"]                  SIMPLE
["POLLS","EPEES"]           PEOPLELESS
["LYES","APRONS"]           LAYPERSONS
["ABCDE", "a c", "123 567"] Aa1B 2Cc3D E567
["\"\\n$?*", "", ",(.)\" "] ",\(n.$)?"* 

$ echo -n 'map(explode)|transpose|map(map(values)[])|implode' | wc -c
  49    

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

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