Перемістіть сторінку тексту


28

EDIT Я змінив формулювання правил, щоб зробити явніші деякі речі. Я також додав деякий акцент, щоб усунути деякі моменти явної плутанини, і чітко визначив варіант створення окремої програми замість функції.

Мета полягає в тому, щоб зробити функцію, яка приймає текстовий файл (або рядок) і переміщує його, щоб рядки стали стовпцями і навпаки.

Приклад:

Я текст.
Перекладіть мене.
Ви можете зробити це?

Призводить до:

ІТЦ
 ра
аан
мн
 си
апо
 ун
ц
eed
xo
тм
.ei
 .t
  ?

Правила:

  • Ви дозволили припустити , що тільки пробільні символи використовуються " "і "\n"і що немає завершальних пропусків в будь-якому рядку.
  • Ви можете припустити, що файл ASCII. Який маркер кінцевої лінії ви хочете використовувати, залежить від вас (CRLF або LF). Він повинен правильно працювати на прикладі, але він також повинен працювати на будь-якому вкладі, який задовольняє наведеним вище припущенням.
  • Можливо, вам доведеться вставити пробіли (як у прикладі) там, де їх не було, щоб стовпці були у рядку.
  • У вашому результаті не повинно бути пробілів пробілу в жодному рядку .
  • Остаточний символ нового рядка (для останнього рядка) необов’язковий.
  • Це повинна бути або функція, або повна програма. Якщо ваша функція приймає рядок, вона повинна повертати результати у вигляді рядка. Якщо він приймає ім'я файлу, то ви повертаєте ім'я файлу, де ви зберегли результат. Вам також дозволено написати повну програму, яка приймає вхід від STDIN і видає правильний результат в STDOUT; якщо ви це зробите, ви не повинні нічого виводити на STDERR.
  • Найкоротша процедура виграє, але я підтримаю будь-яку відповідь, яка мені подобається.

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

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


Я вирішив зняти заборону на вбудовані мови.
Тім Сегуїн

Я відредагував, щоб уточнити умову пробілу в пробілі.
Тім Сегейн

Ви просите функцію? Чи прийнятно приймати рядок від STDIN і надрукувати правильний вихід у STDOUT?
Джастін

@Quincunx Так, я приймаю це як "функцію". Я зміню правила, які будуть явними в цьому питанні.
Тім Сегуїн

Функція транспозиції тексту не може бути інволюцією, якщо ви не дозволите для завершення трансляції тексту. Приклад: "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: Так, інакше я б цього не опублікував.
marinus

Чи чітко написано правило пробілів пробілів? У вас, здається, є більше персонажів, ніж я очікував.
Тім Сегуїн

Скільки символів у мене повинно бути? Останні символи в рядку є ?\n.
marinus

1
@Tim: Я міг отримати це лише до 44 в APL. Основна причина полягає в тому, що APL не надає cutабо dlbза замовчуванням, і сама їх написання займає купу символів навіть у APL.
marinus

4

Рубін 111

Гольф:

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

Безголівки:

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's Array # transpose, а потім перетворює масив символів назад у рядки.

Для гольфу це було просто за допомогою однозначних ідентифікаторів, видалення пробілів, використання тимчасових для text.lines та введення обчислення для вставки max_length (немає балів для ефективності).


Приємно. Ви можете вирізати ще один символ, замінивши "\n"з ?\n.
ОІ

Також .to_aзайве. Ви можете отримати ще 5 символів.
ОІ

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

EDIT: Відсутня вимога до функції;

Я досить впевнений, що це буде покращено, оскільки я тут як початківець, але для початку;

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

Код використовує простий, splitщоб розділити рядок на вектор рядків. Потім він використовує mapзі значенням функції None(функція єдності) та оператором 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)

Не зовсім сумісний. Це повинна бути функція take take string і повертає рядок.
Тім Сегуїн

@Tim Так, це пропустив. Виправлено зараз, дякую.
Йоахім Ісакссон

+1 ви, здається, є найкоротшим сумісним записом пітона на даний момент.
Тім Сегейн

Гарне використання map. Я продовжую шукати місце, де це скористатись ... а ти мене просто побив. ;)
кабінка

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

Редагувати: Це фактично порушує правила, оскільки воно приймає ім'я файлу в якості аргументу, але пише в stdout. Пізніше я відредагую його, щоб записати у файл, а потім надрукую ім'я файлу до stdout.

Це мій перший гольф з кодом коли-небудь, тож помилуй. Якийсь звичайний старий С. Помістіть вхід 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, то вона виконує segfaults під час руху.
wjl

На ваш коментар до редагування правил: ваша інша альтернатива - це прийняти вхід від stdin. Я вважаю, що це також відповідає. А також, я не можу сказати з побіжного погляду: чи знімає пробіл від кінців рядків у перенесеній версії?
Тім Сегуїн

Оскільки я перечитував файл кілька разів, щоб уникнути збереження в оперативній пам’яті, читання з 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)

Я не можу перевірити цього, але він виглядає сумісним
Тім Сегуїн

3

Ruby: 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

Bash, 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(розділені TAB стовпці)
  • видаліть таблички вирівнювання, замініть таблички заповнення BLANK, обріжте за допомогою sed

Редагувати:

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

Для кодового гольфу вам не обов’язково бути приємним та прибраним після себе. Ви можете залишити свій 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, можливо, краще рішення Рубі не вийшло б. Одне з речей, яке мені найбільше подобається в програмуванні, - це готовність до співпраці та перехресного запилення ідей. Доки ми знову не зустрінемося, добрий сер. Ура!
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)));}

Не гольф:

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. Ви можете зберегти два символи, намагаючись позбутися від "s навколо "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)&

Я не можу перевірити це, тож чи можете ви переконатися, що він видаляє пробільний пробіл на кінцях рядків? Також це не з'являється (на перший погляд) для визначення функції, якої вимагають правила.
Тім Сегейн

привіт @Tim, тепер це функція f! .. tks
Мурта


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 напрочуд громіздко (пропозиція user23013 вже значно покращила його).
Мартін Ендер

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

Зауважте, що для цього використовуються послідовності відбору ANSI і як такий не працює в TIO, однак ви можете побачити це в дії тут .

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

Пояснення

Цей код спочатку змінює значення роздільника списку ( $") на вертикальну вкладку, після чого послідовність аварійної послідовності ANSI для 'іти назад 1 стовпець' ( \x1b[1D), потім ми встановлюємо неявно надруковану змінну $_на рядок, що починається з послідовності запуску ANSI для 'почати друк у стовпці 1-го рядка $.(де $.знаходиться поточний рядок тексту)' ( \x1b1;$.H) та інтерполює список @F(який є списком усіх символів на цьому рядку, заповненим автосплітом ( -a) з порожнім розділеним малюнком ( -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 символів :

oneliner:

>>> 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*вистачить.

Пс. Наступна 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

Хаскелл

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

Це було так коротко, що мені потрібно було додати в білий простір ...


Я майже впевнений, що ви можете видалити тут частину пробілів. Але в іншому випадку чудове рішення.
Конрад Боровський

3
Це не дуже працює в моїй системі. Це трохи важко показати в коментарі, але якщо запустити його двічі, ви отримаєте I am a text..? Transpose met Can you do i.
Марина

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

1

Пітон 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 знаків для промислової міцності. : ^)


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

@Tim Мій поганий, виправлений. У будь-якому разі моє рішення поступається рішенням Йоахіма Ісакссона. Цікаво, чи є якийсь короткий спосіб вирішити цю проблему за допомогою рекурсії.
TrevorM


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"

Вихідним чином видається масив рядків?
Тім Сегейн

@Tim Це так. Якщо ви хочете отримати один рядок, додайте три символи. {`/:x@'/:!max@#:'x:`\:x}для 26.
tmartin

У вас також є проблема з пробілом пробілів. І "Якщо він приймає ім'я файлу, то ви повертаєте ім'я файлу, де ви зберегли результат." Потрібно повернути вихід таким же чином, як ви прийняли введення.
Тім Сегуїн

@Tim слід виправити зараз. Вбиває мій обхідний рахунок, але
tmartin

Я підозрював, що це може бути :(, але специфікація - це специфікація
Тім Сегуїн

1

Гроовий, 98 ч

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

онлайн

неозорений:

{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 байти завдяки нахмуреній жабі

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

Бере рядок, повертає рядок. Я не впевнений, чи існує більш коротка версія дієслова функції cutopen, яку я міг би використати.

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

t=.|:@:>@cutLF

Але я не впевнений, що він підпадає під керівництво ОП, оскільки він повертає масив символів.

Як це працює:

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