Транспонировать страницу текста


28

РЕДАКТИРОВАТЬ Я изменил формулировку правил, чтобы сделать некоторые вещи, которые были неявными, более явными. Я также добавил некоторые акценты, чтобы прояснить некоторые моменты кажущейся путаницы, и явно определил возможность создания отдельной программы вместо функции.

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

Пример:

Я текст.
Транспонировать меня.
Ты можешь сделать это?

Результаты в:

ITC
 ра
аан
Миннесота
 сы
апо
 ОУ
Т.С.
ПЕД
XO
тм
.ei
 .t
  ?

Правила:

  • Вы можете предположить, что используются только пробельные символы " "и "\n"что ни в одной строке нет пробельных символов .
  • Вы можете предположить, что файл ASCII. Какой конечный маркер вы хотите использовать, зависит от вас (CRLF или LF). Он должен работать правильно на примере, но он также должен работать на любом входе, который удовлетворяет вышеуказанным предположениям.
  • Возможно, вам придется вставить пробелы (как в примере), где их не было, чтобы столбцы были в строке.
  • Ваш результат не должен содержать пробелы в конце строки .
  • Последний символ новой строки (для последней строки) является необязательным.
  • Это должна быть либо функция, либо полная программа. Если ваша функция принимает строку, то она должна возвращать результаты в виде строки. Если он принимает имя файла, вы возвращаете имя файла, в котором вы сохранили результат. Вам также разрешено написать полную программу, которая принимает входные данные из STDIN и выводит правильный результат в STDOUT; если вы сделаете это, вы не должны ничего выводить в STDERR.
  • Кратчайшая процедура выигрывает, но я буду одобрять любой ответ, который мне нравится.

Исходя из правил, выходные данные в примере имеют длину 53 или 52 байта (для новых строк LF) в зависимости от того, включен последний заключительный символ или нет.

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


Я решил снять запрет на встроенные языки.
Тим Сегин

Я отредактировал, чтобы уточнить условие конечного пробела.
Тим Сегин

Вы спрашиваете о функции? Допустимо ли принимать строку из STDIN и выводить правильный вывод в STDOUT?
Джастин

@Quincunx Да, я принимаю это как «функцию». Я изменю правила, которые будут явными по этому вопросу.
Тим Сегин

Функция транспонирования текста не может быть инволюцией, если вы не разрешите использовать ws. Пример: "a * c \ ndef \ n" -> TT-> "a * \ ncd \ nef \ n" ~ "a \ ncd \ nef \ n" -> TT-> "acd \ nef \ n", где * = ws
Эмануэль Ландехольм

Ответы:



4

J ( 31 40)

f=:3 :';(,&LF@dlb&.|.)&.><"1|:>LF cut y'

Это функция, которая принимает строку и возвращает строку (т. Е. Символьный вектор с переводами строк, вставленными в нужных местах, а не матрицей).

Редактировать: без пробелов ни в одной строке.

Тест:

   f=:3 :';(,&LF@dlb&.|.)&.><"1|:>LF cut y'

   string=:stdin''
I am a text.
Transpose me.
Can you do it?
^D

   $string
42
   $f string
53
   f string
ITC
 ra
aan
mn
 sy
apo
 ou
ts
eed
x o
tm
.ei
 .t
  ?

Надеюсь, вы заметили, что я снял запрет на встроенные модули.
Тим Сегин

@Tim: Да, иначе я бы не опубликовал это.
Маринус

Правильно ли написано конечное правило пробелов? Кажется, у тебя больше персонажей, чем я ожидал.
Тим Сегин

Сколько символов у меня должно быть? Последние символы на строке являются ?\n.
Маринус

1
@Tim: я мог получить только до 44 в APL. Основная причина в том, что APL не предоставляет ни один, cutни dlbпо умолчанию, и написание их самостоятельно занимает кучу символов даже в APL.
Марин

4

Ruby 111

Golfed:

def f t;s=t.lines;s.map{|l|l.chomp.ljust(s.map(&:size).max).chars}.transpose.map{|l|l.join.rstrip+?\n}.join;end

Ungolfed:

def transpose_text(text)
  max_length = text.lines.map(&:size).max
  text.lines.map do |line|
    line.chomp.ljust(max_length).chars
  end.transpose.map do |chars|
    chars.join.rstrip + "\n"
  end.join
end

В Ruby есть функция транспонирования массива, поэтому она просто дополняет строки, превращает их в массив символов, использует функцию Ruby Array # transpose, а затем превращает массив символов обратно в строки.

Игра в гольф состояла в простом использовании односимвольных идентификаторов, удалении пробелов, использовании временного для text.lines и размещении вычисления для max_length inline (нет никаких точек для эффективности).


Ницца. Вы можете удалить еще один символ, заменив "\n"на ?\n.
OI

Кроме того, .to_aэто лишнее. Вы можете получить еще 5 символов там.
OI

@OI Спасибо, я должен тебе шесть символов. Я накатал это на работе, которая использует 1.9.3. To_a требуется в 1.9.3, но не в 2.0.
Уэйн Конрад

Понимаю. Хорошо знать. Рассмотрим нас даже для того, чтобы показать мне несколько методов String в Ruby, которые я должен использовать чаще. Ура!
OI

2
Некоторые из проблем в гольф-коде возобновили мой интерес к изучению рубина.
Тим Сегин

4

R 171

function(e){p=strsplit
x=t(plyr::rbind.fill.matrix(lapply(p(p(e,"\n")[[1]],""),t)))
x[is.na(x)]=" "
cat(apply(x,1,function(y)sub(" *$","",paste(y,collapse=""))),sep="\n")}

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

text <- "I am a text.
Transpose me.
Can you do it?"


(function(e){p=strsplit
x=t(plyr::rbind.fill.matrix(lapply(p(p(e,"\n")[[1]],""),t)))
x[is.na(x)]=" "
cat(apply(x,1,function(y)sub(" *$","",paste(y,collapse=""))),sep="\n")})(text)

ITC
 ra
aan
mn
 sy
apo
 ou
ts
eed
x o
tm
.ei
 .t
  ?

Конечный пробел удаляется.


4

Python 2.7 ( 97 79 94 90)

РЕДАКТИРОВАТЬ: пропущено требование к функции;

Я вполне уверен, что это будет улучшено, так как я здесь начинающий, но для начала;

c=lambda a:'\n'.join(''.join(y or' 'for y in x).rstrip()for x in map(None,*a.split('\n')))

Код использует простое splitдля разделения строки на вектор строк. Затем он использует mapсо значением функции as None(функция unity) и оператор splat для транспонирования и zip_longestдополнения вектора (аналогично функциональности в Python3)

Остальная часть кода просто отображается Noneв пространство, обрезает и снова собирает матрицу в одну строку.

>>> a = 'I am a text.\nTranspose me.\nCan you do it?'
>>> c(a)                                                                            
'ITC\n ra\naan\nmn\n sy\napo\n ou\nts\need\nx o\ntm\n.ei\n .t\n  ?'
>>> len("""c=lambda a:'\n'.join(''.join(y or' 'for y in x).rstrip()for x in map(None,*a.split('\n')))""")
88
# (+2 since `\n` is considered by `len` to be a single char)

Не совсем соответствует. Это должна быть функция, которая берет строку и возвращает строку.
Тим Сегин

@ Тим Да, пропустил это. Исправлено сейчас, спасибо.
Иоахим Исакссон

+1 вы, кажется, самая короткая запись на Python, соответствующая на данный момент.
Тим Сегин

Хорошее использование map. Я продолжаю искать место, чтобы использовать это ... и ты просто избил меня до этого. ;)
Boothby

4

Bash + coreutils + sed, 83

eval paste `sed 's/.*/<(fold -w1<<<"&")/'`|expand -t2|sed 's/\(.\) /\1/g;s/ \+$//'

foldи pasteсделать важную работу. Остальное просто форматирование.

Принимает ввод из stdin и выводит в stdout:

$ < tr.txt ./transposefile.sh
ITC
 ra
aan
mn
 sy
apo
 ou
ts
eed
x o
tm
.ei
 .t
  ?
$ < tr.txt ./transposefile.sh | ./transposefile.sh
I am a text.
Transpose me.?
Can you do it
$ 

Вы, кажется, нарушаете правило «Ваш результат не должен содержать пробелы в конце строки».
Тим Сегин

@TimSeguine К сожалению, я пропустил это. Я только что исправил это в последней редакции.
Цифровая травма

3

C (278 байт)

Редактировать: это на самом деле нарушает правила, так как он принимает имя файла в качестве аргумента, но записывает в стандартный вывод. Я отредактирую это позже, чтобы записать в файл и затем напечатать имя файла на стандартный вывод.

Это мой первый гольф-код, так что помилуй. Какой-то старый добрый C. Поместите вход test.txtи дайте ему поработать!

clang transpose.c -o transpose && ./transpose test.txt

#import <stdio.h>
#import <stdlib.h>
#import <string.h>

#define BUFFER_SIZE 1024

#define MAX(A,B) ((A)>(B)?(A):(B))

int main(int argc, char **argv) {
    char line[BUFFER_SIZE];

    FILE *f; int nLines, maxLen;

    f = fopen(argv[1], "r");
    while(!feof(f) && fgets(line, BUFFER_SIZE, f)) {
        nLines++;
        maxLen = MAX(maxLen, strlen(line));
    }
    fclose(f);

    for (int charPos = 0; charPos < maxLen; charPos++) {
        f = fopen(argv[1], "r");
        for (int linePos = 0; linePos < nLines; linePos++) {
            fgets(line, BUFFER_SIZE, f);
            printf("%c", charPos < strlen(line) && line[charPos] != '\xA' ? line[charPos] : ' ');
        }
        printf("\n");
        fclose(f);
    }

    return 0;
}

Благодаря использованию коротких имен переменных, удалению произвольного форматирования, разрешению утечки файловых дескрипторов и отключению всех предупреждений это сокращается до 278 байт. (Так как при этом используется неявный импорт, он может не связываться должным образом на всех системах. Работает на моей машине!)

#import <stdio.h>
int main(int C,char**V){char L[1024];int A,B,D,I,J,*F=fopen(V[1],"r");while(!feof(F)&&fgets(L,1024,F)){A++;D=strlen(L);B=B>D?B:D;}for(I=0;I<B;I++){F=fopen(V[1],"r");for(J=0;J<A;J++)fgets(L,1024,F)&&printf("%c",I<strlen(L)&&L[I]!='\n'?L[I]:' ');printf("\n");}}

Я думаю, что вы можете воспользоваться неявным, intчтобы сократить некоторые ваши заявления, или это сейчас незаконно?
Тим Сегин

Да, я использую это в более поздней редакции, чтобы не импортировать stdlib.h или string.h. Если я не импортирую stdio.h, он будет работать при запуске.
WJL

Чтобы вы могли отредактировать комментарий к правилам: другой вариант - принять ввод от стандартного ввода. Я бы посчитал это соответствующим. И еще, я не могу сказать беглым взглядом: удаляет ли это пробелы из концов строк в транспонированной версии?
Тим Сегин

Поскольку я перечитываю файл несколько раз, чтобы избежать сохранения в ОЗУ, чтение из stdio, вероятно, будет сложнее. :) Я не уверен, какие пробелы должны быть удалены. Прямо сейчас я не думаю, что это вообще зачищает, к сожалению. Я тоже буду над этим работать.
WJL

Вы можете объявить A,B,D,I,J,*Fкак глобальные переменные, чтобы избежать intключевого слова. Точно так же вы можете удалить intиз mainобъявления и Cаргумент. В C, не intявляется обязательным во многих местах.
Конрад Боровски

3

AutoHotkey 210

f(i){
StringSplit,o,i,`n
m:=0
loop % o0 {
a:=A_index
if (t:=Strlen(p:=o%a%))>m
m:=t
StringSplit,l%a%,o%a%
}
loop % m {
a:=A_index,n:=""
loop % o0
n.=(j:=l%A_index%%a%)=""?" ":j
s.=Rtrim(n," ") "`n"
}
return s
}

Тест

text=
(
I am a text.
Transpose me.
Can you do it?
)
msgbox % f(text)

Я не могу проверить это, но это выглядит послушно
Тим Seguine

3

Рубин: 88 символов

(Размещено потому, что оно короче, чем у других решений Ruby. Не проверял, вводит ли мой код что-то новое по сравнению с ними. Если вы уже опубликовали решение Ruby и считаете, что это в основном ваша копия, прокомментируйте, и я удалю свой ответ. )

f=->t{l=t.split$/;r=[""]*m=l.map(&:size).max;l.map{|l|m.times{|i|r[i]+=l[i]||" "}};r*$/}

Образец прогона:

irb(main):001:0> f=->t{l=t.split$/;r=[""]*m=l.map(&:size).max;l.map{|l|m.times{|i|r[i]+=l[i]||" "}};r*$/}
=> #<Proc:0x99a9e68@(irb):1 (lambda)>

irb(main):002:0> sample='I am a text.
irb(main):003:0' Transpose me.
irb(main):004:0' Can you do it?'
=> "I am a text.\nTranspose me.\nCan you do it?"

irb(main):005:0> puts f[sample]
ITC
 ra
aan
mn
 sy
apo
 ou
ts
eed
x o
tm
.ei
 .t
  ?
=> nil

irb(main):006:0> puts f[f[sample]]
I am a text.
Transpose me.
Can you do it?
=> nil

+1 Вы играли в гольф лучше в любом случае.
Тим Сегин

3

Баш, 124 байта

D=`mktemp -d`;split -l1 - $D/;for F in $D/*;do grep -o . $F>$F+
done;paste $D/*+|sed -e's/\([^\t]\)\t/\1/g;s/\t/ /g;s/ *$//'

Он читает стандартный ввод и записывает стандартный вывод. Попытайся:

echo $'I am a text.\nTranspose me.\nCan you do it?' | script.sh

Как это работает:

  • splitввод в одну строку (файлы во временном каталоге $D)
  • разбить строки на отдельные символы, используя grep(файлы * +)
  • расположение символов рядом друг с другом paste(столбцы, разделенные табуляцией)
  • удалите выравнивающие вкладки, замените заливные вкладки на пустые, обрежьте, используя sed

Редактировать:

  • -9: убран код исправления ;rm -r $D(спасибо, Тим)
  • -2: использовать +вместо _суффикса и сократить ${F}_до$F+
  • -3: удалить префикс Lиз файлов результатов разделения

Для целей Code Golf вам не обязательно быть красивым и убирать за собой. Вы можете убрать rmбит из числа ваших персонажей.
Тим Сегин

2

Рубин - 144 символа

Вот моя первая попытка игры в гольф:

def f t
t.split(?\n).each{|l|l<<' 'until l.size==t.split(?\n).map(&:size).max}.map{|x|x.split('')}.transpose.map{|l|l.join.rstrip}.join(?/n)
end

Для вывода выполните puts f textгде textлюбая многострочная строка, соответствующая приведенным выше правилам. Развернутая версия ниже:

def text_transpose(text)
  lines = text.split(?\n)
  maxlen = lines.map(&:size).max
  lines.each { |line| line << ' ' until line.size == maxlen }
       .map  { |line| line.split('') }.transpose
       .map  { |char| char.join.rstrip }.join(?\n)
end

Для аналогичного, но в конечном итоге лучшего решения в Ruby, посмотрите код Уэйна Конрада выше.


Я не заметил transposeв вашем ответе, прежде чем я написал свой. Для меня не совсем кошмарно переписать твой ответ, только чуть лучше. :(
Уэйн Конрад

2
Я совсем не против. Вы придумали свой код самостоятельно, и это не гонка. Я определенно узнал кое-что из вашего решения. Если бы вы сдержались, потому что я использовал transpose, возможно, лучшее решение Ruby не появилось бы. Одна из вещей, которые мне больше всего нравятся в программировании, это желание сотрудничать и перекрестно опылять идеи. До новой встречи, добрый сэр. Ура!
OI

2

PHP 194

function x($a){$a.="\n";$s=strlen($a);$i=0;while($c<$s)if($a{$c}!="\n")$b[$i++].=$a{$c++};else{$c++;for(;$i<$s;$i++)$b[$i].=" ";$i=0;}ksort($b);return rtrim(implode("\n",array_map("trim",$b)));}

Non-golfed:

function x($a) {
    $a.="\n";
    $s=strlen($a);
    $i=0;
    while($c<$s)
        if($a{$c}!="\n")
            $b[$i++].=$a{$c++};
        else{
            $c++;
            for(;$i<$s;$i++)
                $b[$i].=" ";$i=0;
        }
    ksort($b);
    return rtrim(implode("\n",array_map("trim",$b)));
}

Это моя первая попытка игры в гольф, поэтому будьте добры! Также, советы / предложения будут с благодарностью!


Это короче, чем моя попытка PHP. Вы можете сохранить двух персонажей, избавившись от "окружающих "trim". php выдаст предупреждение, но работает нормально.
Тим Сегин

@TimSeguine Предупреждения выводятся на экран, правда? Вам придется использовать @для подавления предупреждений.
ericw31415

@eric Я не был активным некоторое время, поэтому мнения могли измениться, но в прошлом считалось приемлемым выводить нерелевантные данные со стандартной ошибкой.
Тим Сегин

Это разрешено? Если это правда, то я этого не знал.
ericw31415

2

MATHEMATICA 117 символов

t = "I am a text.\nTranspose me.\nCan you do it?";

f=(m=Length/@(f=Flatten[Characters/@StringSplit[#,"\n"],{{2},{1}}])//Max;
StringJoin@@@(PadLeft[#,m," "]&/@f)//Column)&

Я не могу проверить это, так что вы можете убедиться, что он удаляет пробелы на концах строк? Кроме того, это не выглядит (на первый взгляд), чтобы определить функцию, которая требуется правилами.
Тим Сегин

привет @ Тим, теперь это функция f! .. tks
Murta

2

Perl (92 + 1)

читает стандартный ввод и пишет в стандартный вывод. добавив 1 к баллу заsay

@L=map[grep!/\n/,split//],<>;do{$_=join'',map shift@$_||$",@L;s/ +$//;say}while grep@$_>0,@L

2

CJam, 32 25 байт

CJam новее, чем этот вызов, поэтому этот ответ не может быть принят.

Значительно сокращено пользователем 23013.

qN/_z,f{Se]}z{S+e`);e~N}%

Проверьте это здесь.

qN/                       "Read input, split into lines.";
   _z,                    "Transpose, get length (find maximum line length).";
      f{Se]}              "Pad each line to that length with spaces.";
            z             "Transpose.";
             {         }% "Map this block onto each line in the result.";
              S+          "Add a space to ensure there's at least one.";
                e`        "Run-length encode.";
                  );      "Discard the trailing run of spaces.";
                    e~    "Run-length decode";
                      N   "Push a newline.";

Право или нет, это отличный поздний ответ. Похоже, самой сложной частью этого ответа была работа с конечными пробелами.
Тим Сегин

@TimSeguine Действительно. Без встроенного оператора обрезки делать это вручную в CJam на удивление громоздко (предложение пользователя 23013 уже значительно улучшило его).
Мартин Эндер

2

Javascript, 103

s=>[...s].map((_,i)=>s.split`
`.map(b=>r+=b[q=b[i]||q,i]||' ',r=q='')&&r.replace(/ *$/,q?`
`:q)).join``

Меньше гольфа

s=>[...s].map(
     // we need 'i' ranging from 0 to the length of the longest input line
     // so we scan all the input string, that is surely longer
     // but we need to check that after some point the output must be empty
     (_, i) => ( 
       r = '', // the current output row, starts empty
       q = '', // flag to check if we are beyond the longest line
       s.split('\n') // split in rows
       .map( 
         b => ( // for each input row in b
           q = b[i] || q, // if there is a char at position i in b, i goes to q
           r += b[i] || ' ' // add to output the char at position i or a fill space
         )
       ),
       q // if q is still '', we are beyond the longest input line 
       ? r.replace(/ *$/,`\n`) // trim leading space and add newline
       : '' // no output 
     )
   ).join('')

Тест

F=
s=>[...s].map((_,i)=>s.split`
`.map(b=>r+=b[q=b[i]||q,i]||' ',r=q='')&&r.replace(/ *$/,q?`
`:q)).join``

function go() {
  var text=I.value
  var output = F(text)
  O.textContent = output
}

go()
#I { width:50%; height:5em }
<textarea id=I>I am a text.
Transpose me.
Can you do it?</textarea><br>
<button onclick='go()'>Transpose</button>
<pre id=O></pre>


2

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

P`.+
~L0$`.
L,$.%'vs,$.(x$%=),`.+
m` *$

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

Основанный на этой программе, которую я создал для транспонирования прямоугольника любого размера, который использует предложение Лео для транспонирования прямоугольника известного размера.

Изменить: Гольф больше и больше не имеет пробелы на линиях.


2

Perl 5 , 25 байт

Обратите внимание, что здесь используются escape-последовательности ANSI и, как таковые, они не работают на TIO, однако вы можете увидеть это в действии здесь .

$"="[1D";$_="[1;$.H@F"

объяснение

Этот код сначала меняет значение list separator ( $") на вертикальную табуляцию, за которой следует escape-последовательность ANSI для «go backwards 1 column» ( \x1b[1D), затем мы устанавливаем неявно напечатанную переменную $_как строку, начинающуюся с escape-последовательности ANSI для 'начать печать в строке 1 столбца $.(где $.находится текущая строка текста)' ( \x1b1;$.H) и интерполирует список @F(который представляет собой список всех символов в этой строке, заполненный функцией autosplit ( -a) с пустым шаблоном split ( -F)) который помещает содержимое $"между каждым элементом, перемещая курсор вертикально вниз вместо продолжения вывода после предыдущего символа.

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


1
Боже мой, ужас! Я люблю это!
Тим Сегин,

1

C ++ (243 символа)

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

Я мог бы побрить пару десятков символов, но решил оставить его как не глупый код (работает быстро, читает нормально). Может быть, я только решил сделать это, потому что это мой первый гольф-код ... Я еще не достаточно хардкор :)

string f(string s){stringstream ss(s);vector<string> v;for(size_t i=0;getline(ss,s);++i){if(v.size() < s.size())v.resize(s.size());for(size_t j=0;j<s.size();++j){v[j].resize(i,' ');v[j].push_back(s[j]);}}s="";for(auto& i:v)s+=i+'\n';return s;}

С форматированием:

string f(string s)
{
    stringstream ss(s);
    vector<string> v;

    for(size_t i = 0; getline(ss, s); ++i)
    {
        if(v.size() < s.size())
            v.resize(s.size());

        for(size_t j = 0; j < s.size(); ++j)
        {
            v[j].resize(i, ' ');
            v[j].push_back(s[j]);
        }
    }

    s = "";
    for(auto& i : v)
        s += i + '\n';

    return s;
}

Я полагаю, вы используете using namespace std;.
Конрад Боровски

@xfix Не обычно, но я сделал для этого
Дэвид

1
Если я разборчив, я бы сказал, что using namespace std;следует добавить количество символов.
Тим Сегин

1

Python 2,7 - 115 символов :

один лайнер:

>>> a
'I am a text.\nTranspose me.\nCan you do it?'

>>> "".join(["".join(i)+'\n' for i in zip(*[x+" "*(len(max(a.splitlines(), key=len))-len(x)) for x in a.splitlines()])])
'ITC\n ra\naan\nmn \n sy\napo\n ou\nts \need\nx o\ntm \n.ei\n .t\n  ?\n'

и в более чистой печати:

>>> print "".join(["".join(i)+'\n' for i in zip(*[x+" "*(len(max(a.splitlines(), key=len))-len(x)) for x in a.splitlines()])])
ITC
 ra
aan
mn 
 sy
apo
 ou
ts 
eed
x o
tm 
.ei
 .t
  ?

в 115 символов:

>>> len(""""".join(["".join(i)+'\n' for i in zip(*[x+" "*(len(max(a.splitlines(), key=len))-len(x)) for x in a.splitlines()])])""")
115

Вы не удаляете конечные пробелы в строках, как того требуют правила.
Тим Сегин

Кроме того, это на самом деле 116 байтов, \nсчитается lenодним символом, но это два :)
Йоахим Исакссон

1
@JoachimIsaksson в Unix \n- это одно. Поэтому я говорю, что все в порядке.
Тим Сегин

@Tim len("\n")покажет 1, хотя это, безусловно, 2 отдельных символа в исходном коде. Сохранение исходного кода в файл приведет к lsотображению 116. Просто сказать, что lenэто не лучший способ измерить размер кода из-за обработки управляющих символов перед измерением :)
Йоахим Исакссон

@JoachimIsaksson о, извините, я неправильно понял вашу точку зрения.
Тим Сегин

1

GolfScript, 51 символ

n%.{,}%$-1=" "*:y;{y+y,<}%zip{n\+0{;).32=}do}%((;\+

Это первая попытка; Я подозреваю, что это может быть улучшено. Большая часть кода должна соответствовать требованиям заполнения и удаления пробела - без них просто n%zip n*было бы достаточно.

Ps. Следующая 46- символьная версия выполнит работу для данного примера ввода, но потерпит крах, если любой столбец ввода будет состоять исключительно из пробелов:

n%.{,}%$-1=" "*:y;{y+y,<}%zip{0{;).32=}do]}%n*

Я предполагаю, что этого достаточно, чтобы дисквалифицировать его, даже если в заявке явно не говорится об этом.


Ваше предположение верно. Он должен работать с любым текстом ASCII в соответствии с допущениями, разрешенными в правилах.
Тим Сегин

1

Схема / Ракетка 113

Текст:

(define t (list 
    (string->list "I am a text.") 
    (string->list "Transpose me.")
    (string->list "Can you do it?")
))

Без новых строк и лишних пробелов:

(define s(λ(v x)(if(= x 0)'()(cons(list->string(car v))(s(cdr v)(- x 1))))))(s(apply map list t)(length(car t)))

Дружественная версия

(define text (list 
    (string->list "I am a text.") 
    (string->list "Transpose me.")
    (string->list "Can you do it?")
))

(define transpose
    (λ(text length)
        (if (= length 0)
            '()
            (cons (list->string (car text)) (transpose (cdr text) (- length 1)))
)))

(transpose (apply map list text) (length (car text)))

1

Haskell

import Data.List
main = interact (unlines . transpose . lines)

Это было так коротко, мне нужно было добавить в пустое пространство ...


Я почти уверен, что вы можете удалить некоторые пробелы здесь. Но в остальном отличное решение.
Конрад Боровски

3
Это не совсем работает в моей системе. Это немного сложно показать в комментарии, но если вы запустите его дважды, вы получите I am a text..? Transpose met Can you do i.
marinus

Да, я думаю, может быть, вы не добавляете строки, чтобы не повредить столбцы, как в примере. Теоретически, результатом запуска функции дважды должна стать исходная строка (возможно, с добавлением или удалением последней строки.)
Тим Сегин

1

Python 89 103 символа

def f(a):return'\n'.join([''.join(i).rstrip()for i in zip(*[j+' '*99 for j in a.split('\n')])]).rstrip()

Я чувствую себя грязным 90 104 символа для версии промышленного уровня. : ^)


не функция.
Тим Сегин

@ Плохо, исправлено. В любом случае, мое решение хуже, чем решение Иоахима Исакссона. Интересно, есть ли какой-нибудь короткий способ решить эту проблему с помощью рекурсии?
TrevorM

1

Mathematica, 95 символов

f=""<>Riffle[Thread@PadRight@Characters@StringSplit[#,"\n"]//.{0->" ",{x___," "..}:>{x}},"\n"]&

1

К, 56

Это должно соответствовать спецификации сейчас.

Принимает строку, возвращает строку.

{`/:{$[" "=*|x;|(+/&\" "=|x)_|x;x]}'x@'/:!max@#:'x:`\:x}

,

k)f:{`/:{$[" "=*|x;|(+/&\" "=|x)_|x;x]}'x@'/:!max@#:'x:`\:x}
k)f"I am a text.\nTranspose me.\nCan you do it?"
"ITC\n ra\naan\nmn\n sy\napo\n ou\nts\need\nx o\ntm\n.ei\n .t\n  ?\n"
k)f f"I am a text.\nTranspose me.\nCan you do it?"
"I am a text.\nTranspose me.\nCan you do it?\n"

Выходные данные выглядят как массив строк?
Тим Сегин

@ Тим Это так. Если вы хотите одну строку, то добавьте три символа. {`/:x@'/:!max@#:'x:`\:x}за 26.
tmartin

У вас также есть проблема с конечным пробелом. И «Если он принимает имя файла, вы возвращаете имя файла, в котором вы сохранили результат». Вам нужно возвращать вывод так же, как вы принимаете ввод.
Тим Сегин

@Tim должен быть исправлен сейчас. Хотя убивает мой byountount
tmartin

Я подозревал, что это может :(, но спецификация - это спецификация.
Тим Сегин

1

Groovy, 98 символов

{i->o=[].withDefault{''};i.readLines().each{it.toList().eachWithIndex{c,d->o[d]+=c}};o.join('\n')}

онлайн

ungolfed:

{i->
o=[].withDefault{''};//create list with empty string as default value 
i.readLines()
.each{
    it.toList() //split every line to characters
    .eachWithIndex{ 
        c,d->o[d]+=c //append to string from list with right index
    }
};
o.join('\n')}//join list with newlines
}


1

J, 28 26 байт

Сохранено 2 байта благодаря frownyfrog

t=.,@:(,&LF"1)@|:@:>@cutLF

Принимает строку, возвращает строку. Я не уверен, что есть более короткая версия глагола функции cutopen, который я мог бы использовать.

Там также короче

t=.|:@:>@cutLF

Но я не уверен, что это соответствует рекомендациям OP, так как он возвращает массив символов.

Как это работает:

                     cutLF   | Splits the input on new lines and boxes them
                    @        | Composes verbs (as does @:, but they're not equal)
                   >         | Unboxes this, forming an array of the lines
                 @:          |
               |:            | Transposes the array
      (      )@              |
       ,&LF                  | Appends a new line...
           "1                | To each row of the array
    @:                       |
   ,                         | Flatten the result
t=.                          | Assign this verb to t

Другая версия работает так же, но не преобразует транспонированный массив в правильно отформатированную строку.

Примеры:

NB. Define a multi-line string

    text =: 0 : 0
I am a text.
Transpose me.
Can you do it?
)

    t text
ITC
 ra
aan
mn    NB. There's whitespace after the 'n' here, but I assume it doesn't count as trailing since it's part of the original string
 sy
apo
 ou
ts 
eed
x o
tm 
.ei
 .t
  ?

    t t text
I am a text.     NB. Again, whitespace here, but it's part of the argument of the second 't' (added by the first 't' to keep columns straight)
Transpose me. 
Can you do it?

Я бы использовал cutLF.
FrownyFrog

1
Сохранить 1 символ с0|:>@cutLF
FrownyFrog

1

Луа ,203 189 байт

t={{}}i=1m=0(...):gsub(".",function(c)n=#t[i]if c=="\n"then i=i+1t[i]={}else t[i][n+1]=c end m=m<=n and n+1or m end)
for x=1,m do for p=1,i do io.write(t[p][x]or" ")end _=m<=x or print()end

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

Я видел другое решение Lua здесь, но я не думаю, что есть проблема с размещением 2 решений на одном языке. Если есть, скажите мне :)


1
Нет ничего плохого в нескольких ответах на одном языке. Даже идентичные ответы допускаются в определенной степени (хотя рекомендуется хотя бы проверить, публикуете ли вы подобное решение)
Джо Кинг,

К сожалению, ваш результат не должен содержать пробелы в конце строки .
Джо Кинг,

Но я не вижу конечных пробелов в выводе моего кода. Там нет пробелов после окончания строки и нет пустой строки в конце.
Visckmart

Часть, которая, кажется, ловит людей, находится на любой линии . например Это имеет дополнительные пробелы во второй строке
Джо Кингу

Оооо теперь я понял! Сожалею. Я постараюсь заставить его работать, как только у меня будет время. Я думаю, проблема заключалась в том, что есть только 1 пример теста, и я подумал, что это будет «стрессовый» тест, хахах. Но хорошо, спасибо, что
сказали
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.