Роздрукуйте рядок вертикальними словами


12

Ваше завдання - взяти рядок введення символів ascii і вивести рядок у вигляді серії вертикальних слів, розділених пробілами. Приклад наведено нижче:

Враховуючи рядок:

Hello, World! My name is Foo.

вихід повинен бути:

H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d
, !

10 бонусних балів будуть присвоєні, якщо ваша програма правильно обробляє рядки, які потрібно обернути навколо терміналу, який ми встановимо на 80 символів.

50 балів, якщо ваша програма також може зробити зворотне!



3
@manatwork: я вважаю, що так. Однак це не тотожно - і я можу стверджувати, що моя проблема трохи простіша.
Foo Barrigno

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

1
@PeterTaylor: Не зовсім. Моя проблема не потребує дотримання нових рядків у вихідному рядку. Ця проблема вимагає перетворення нових рядків у пробіли, а пробіли, перетворені у два нові рядки. Це не зовсім тривіальне зменшення.
Foo Barrigno

Відповіді:


10

J, 15

|:>'\S+| 'rxall

Використання:

   |:>'\S+| 'rxall 'Hello, World! My name is Foo.'
H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d        
, !        

5

Javascript - 228 172 145 126

A=prompt().split(" "),B="",N=A;for(y=0;y<N.length;y++){for(i=0;i<N.length;i++){if(A[i][y]){B+=A[i][y];}else{B+=" ";}}B+="\n";}

Мій перший гольф-код :)


Це чудово для вашої першої спроби!
Foo Barrigno

Ви повинні намагатися зробити свій код якомога коротшим, наприклад, видалити пробіли, також "Input ?"не дуже впливає на поведінку програми, також видаліть його.
понеділок

Виправлені помилки. Має працювати так, як очікувалося :)
Wolle Vanillebär Lutz

1
Працює зараз правильно. Але деякі незначні речі: немає необхідності в змінній N, зберігайте масив lengthзамість того, щоб запитувати його двічі, кілька безглуздих дужок, деякі непотрібні крапки з комою. A=prompt().split(" "),B="";for(y=0;y<(l=A.length);y++){for(i=0;i<l;i++)if(A[i][y])B+=A[i][y];else B+="_";B+="\n"}alert(B). (У Стандартах JavaScript для мета-запитання
вводу-

1
(неперевірено) if(A[i][y]){B+=A[i][y];}else{B+=" ";}=>B+=(x=A[i][y])?x:" "
Даніеро

5

APL, 22

{⍉⊃⍵⊂⍨1+0,+\2≠/⍵=' '}

Пояснення

{              ⍵=' '}   A. check which chars are spaces           
            2≠/         B. of that vector, which consecutive pairs are different  
          +\            C. compute the partial sums                           
      1+0,              D. insert 0 at the front and add 1 to every item
   ⍵⊂⍨                     use this vector to split the original string
 ⍉⊃                        disclose into a matrix and transpose

    'W o w   S u c h   D o g e'
A.   0 0 0 1 0 0 0 0 1 0 0 0 0
B.    0 0 1 1 0 0 0 1 1 0 0 0
C.    0 0 1 2 2 2 2 3 4 4 4 4
D.  1 1 1 2 3 3 3 3 4 5 5 5 5

Приклад

      {⍉⊃⍵⊂⍨1+0,+\2≠/⍵=' '} 'Hello, World! My name is Foo.'
H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d        
, !        

3

Рубі, 91 87

s=gets.split
puts s.map{|x|x.ljust(s.map(&:size).max,' ').split''}.transpose.map &:join

Ура, я побив Перла! : D

Рубін, 150 - 50 бонус = 100

s=$<.read
n=s.index"
"
s=s.split n ?'
':' '
o=s.map{|x|x.ljust(s.map(&:size).max,' ').split''}.transpose.map &:join
puts n ?o.map(&:strip).join(' '):o

Він просто виявляє нові рядки та застосовує спеціальні обробки, якщо вони виявлені.

Виконайте це як

ruby transposegolf.rb < transposegolfinput.txt

3

Javascript 184 149 123

var a=s.split(" "),b="",c;for(c in a)b+="<div style='float:left'>"+a[c].split("").join("<br>")+"</div>";document.write(b);

Визначається рядок прикладу:

var s = "Hello, World! My name is Foo.";
var a=s.split(" "),b="",c;for(c in a)b+="<div style='float:left'>"+a[c].split("").join("<br>")+"</div>";document.write(b);

Ви можете скопіювати друге твердження на консоль браузера.

Немініфікований:

var res = "Hello, World! My name is Foo.";
var t=res.split(" ");
var s ="";
for (var word in t){
    s+="<div style='float:left'>" + t[word].split("").join("<br />") + "</div>";
}
document.write(s);

Посилання JsFiddle: http://jsfiddle.net/FzMvK/

Мій перший пост для гольфу з кодом: P


Дуже красиво зроблено
Foo Barrigno

@FooBarrigno оновив відповідь на підтримку зворотного
RononDex

@FooBarrigno Оновлений відповідь, видалено зворотну підтримку та повністю змінив логіку, щоб зменшити кількість байтів
RononDex,

Розумна, мені це подобається. Ви не можете просто змінитись на float:rightзворотний?
Денні

2
Залежить, що означає "реверс". Якщо перша буква має бути внизу, тоді вона не буде працювати. Якщо це просто перевертає слова, то це має спрацювати так
RononDex

2

Perl - 92 97

$_=<>;chop;@x=split$";do{print((substr$_,$q,1or$").$")for@x;$q++,print$/}while/@{['\S'x$q]}/

Робота виконує досить просто.


Немає потреби в дужках навколо виразів модифікаторів висловлювань.
манатура

Зауважте, що whileтут використовується також модифікатор заяви.
манатура

Є це? Хіба це не do{}while()петля?
понеділок

Ні. doсама по собі не має нічого іншого, просто блок. Це whileокрема річ.
манастирство

2

К, 33

{" "/:',:''x@'/:!max@#:'x:" "\:x}

Приклад введення та виведення:

k){" "/:',:''x@'/:!max@#:'x:" "\:x}"Hello, World! My name is Foo."
"H W M n i F"
"e o y a s o"
"l r   m   o"
"l l   e   ."
"o d        "
", !        "

Чи "повинні там бути?
Доктор Белісарій,

@belisarius Ось як представлені рядки в k. Якщо ви спеціально хочете написати в stdout, тоді ви можете {-1@" "/:',:''x@'/:!max@#:'x:" "\:x;}(37 знаків), які дадуть вихід без"
tmartin

4
Ну, я думаю, вихід повинен бути потрібним, незважаючи на мову
д-р belisarius,

2

Пітон:

Один рядок коду для обробки жала:

import sys
m = "Hello, World! My name is Foo."

map(lambda y: sys.stdout.write(' '.join(y)+'\n'), zip(*map(lambda x: x.ljust(max(map(len,m.split()))), m.split())))

2

Python 2.7, 108 103

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

w=raw_input().split();m=max(map(len,w));i=0
while i<m:print" ".join(map(lambda x:x.ljust(m)[i],w));i+=1

Покращення:

  • split ("") => розділити ()
  • видалено кілька зайвих пробілів

Хороша робота! Якщо ви почнете з i=mі зменшити до 0, ви можете поголити ще 3 символи для рівних 100.
DLosc

2

F #, 187

let o=Console.ReadLine()
let s=o.Split(' ')
let m=s|>Seq.map String.length|>Seq.max
for l=0 to m-1 do
 for w in s|>Seq.map(fun x->x.PadRight(m,' ').[l])do printf"%c "w
 printfn"%s"""

2

Рубі, 63

$F.map(&:size).max.times{|i|puts$F.map{|s|s[i]||' '}.join' '}

Алгоритм дуже простий; тільки гольф. Код - 61 байт, плюс 2 байти для -naпараметрів, які йому потрібні для роботи. Від ruby -h:

-n   assume 'while gets(); ... end' loop around your script
-a   autosplit mode with -n or -p (splits $_ into $F)

Проба зразка:

$ echo 'This sentence is false' | ruby -na cols.rb
T s i f
h e s a
i n   l
s t   s
  e   e
  n    
  c    
  e

2

Python 2.7 - 137 112 байт

s=raw_input().split()
for c in range(max(map(len,s))):
 for w in s:
    try:print w[c],
    except:print' ',
 print''

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

Я придумав набагато кращий спосіб зробити це і вирізав 25 байт. Замість того, щоб набивати рядки з пробілами, щоб уникнути помилки індексу, я обробляю помилку безпосередньо! Всякий раз , коли немає нічого , щоб надрукувати, надрукувати єдиний простір на своєму місці з try:print w[c],, except:print' ',. Я також пам’ятав, що мені не потрібно пробілу між операцією друку та рядковим літералом, який врятував один байт.

Зауважте, що Python 2 дозволяє змішувати вкладки та пробіли і розглядає їх як окремі рівні відступи. Інтерпретатор Markdown SE замінює символ вкладки чотирма пробілами, але кожен рядок цієї програми, окрім першого, має рівно один байт відступу.

Форматування було досить легко, так як print 'something',відбитки , 'something 'а не 'something\n'. Я робив це для кожного персонажа і використовував порожній printвислів, щоб отримати новий рядок там, де мені це потрібно.


2

C, 111 110 95 90 байт

Це рішення використовує коди управління VT-100 для переміщення курсору по терміналу

main(int _,char**v){char*s=*++v;printf("^[7");while(*s)' '==*s?(s++,printf("^[8^[[2C^[7")):printf("%c^[[B^H",*s++);}

^[послідовність є заповнювачем для одного ASCII ESC характеру, які не можуть бути відображені тут.

  • ^[7 зберігає поточне положення вказівника
  • ^[8 повертає положення курсору до збереженого положення
  • ^[[2C рухається 2 кроки вправо
  • ^[[B рухається на 1 крок вниз

редагувати 1:^[[D (1 крок вліво) VT-100 код був замінений на забій (показано ^Hтут, але це тільки один ASCII символів); також забула інструкцію "розділені пробілами", тепер виправлена

редагувати 2:

7 символів збережено, використовуючи forцикл замість while, а 32не ' ':

main(int _,char**v){printf("^[7");for(char*s=*++v;*s;s++)32==*s?printf("^[8^[[2C^[7"):printf("%c^[[B^H",*s);}

Ще 8 символів збережено, зателефонувавши на один менший printf: термінальний ?:оператор зараз використовується в printfпараметрах

main(int _,char**v){printf("^[7");for(char*s=*++v;*s;s++)printf(32==*s?"^[8^[[2C^[7":"%c^[[B^H",*s);}

редагувати 3:

Позбувся локальної змінної s, працюючи безпосередньо з argvака v. Це абсолютно огидно. Але врятували 4 символи. Також замінені ==з ^і тому переключив ?:операнди, щоб зберегти більше 1 символ.

main(int c,char**v){printf("^[7");for(v++;**v;)printf(32^*(*v)++?"%c^[[B^H":"^[8^[[2C^[7",**v);}

Використання

$ gcc transpose.c -o transpose --std=c99
$ ./transpose 'Hello, World! My name is Foo.'
H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d
, !

Версія без гольфу (перша версія)

main (int _,char**v) {
    char*s=*++v; // init s with the address of the first letter
    printf("^[7"); // save the current cursor position
    while(*s) 
        ' '==*s ? ( /* if current char is a space */
            s++,printf("^[8^[[2C^[7") /* return to the saved location, move right, save position */
        ) : /* kind of else */
            printf("%c^[[B^H",*s++); /* print the current char, move down, move left */
}

Версія без гольфу (остання версія)

main(int c,char**v) {
    printf("^[7");
    for(v++;**v;) /* v++: make v point to argv[1] */
        printf(     
            32^*(*v)++? /* test if **v is different from ' ', and make *v point to
                           the next char */
                "%c^[[B^H":         
                "^[8^[[2C^[7",      
            **v); /* this undefined behaviour (using *v and (*v)++ in the same expression)
                     works as "expected" with gcc 4.7.2 */
} 

1
Ця версія без гольфу виглядає підозріло, як Befunge . :)
DLosc

2

Я відповів на це питання давно. Це був один із моїх перших внесків на сайт. Нещодавно я знову натрапив на це і був збентежений. 112 байт ?! Неприпустимо. Тож я ще раз пострілив:

Python 3 - 92 байти

s=input().split()
print('\n'.join(map(' '.join,zip(*[a.ljust(max(map(len,s)))for a in s]))))

За 109 днів, відколи я опублікував цю першу відповідь, мені подобається думати, що я пройшов довгий шлях. Навіть щось на зразок використання Python 3 понад 2.7 1 мені не прийшло в голову. З цим кодом, який перебуває внизу до 100 байт, моя душа може нарешті відпочити, і я можу перейти до потойбічного життя.

Пояснення

s=input().split()

Це отримує рядок stdinі створює список, розділяючи його на символи пробілу. Єдиний пробіл, який, можливо, буде вводити, - це пробіли, тому цей рядок отримує список слів.

Візьмемо другий рядок зсередини назовні:

                                           max(map(len,s))

mapприймає функцію та ітерабельний як аргументи. Він застосовує функцію до кожного елементу, який можна повторити, і повертає новий ітерабельний результат. Тут я створюю ітерабельний з довжинами кожного введеного слова. maxотримує максимальне значення від ітерабельного. Це дає нам найдовше слово у введенні.

                                  [a.ljust(              )for a in s]

Ознайомлення зі списком схоже на map. Він робить щось для кожного елемента, який можна повторити, і повертає список результатів. Для кожного слова у введенні я роблю that_word.ljust(якийсь код ). ljustє скороченням "left justify". Він бере ціле число як аргумент і додає пробіли до рядка, поки воно не буде таким довгим.

                             zip(*                                    )

Це акуратний трюк. У цьому контексті *означає "розпакувати цей ітерабельний як безліч аргументів". Таким чином, zipможна використовувати для транспонування матриці (наприклад zip(*[(1,2),(3,4)])-> [(1,3),(2,4)]). Єдине обмеження полягає в тому, що всі рядки в матриці повинні бути однакової довжини, або елементи з усіх рядків, але найкоротші відрізаються, щоб відповідати.

                map(' '.join,                                          )

Ми вже знаємо, що mapробить. Єдине нове тут - це те join, що приймає рядки рядків і робить його єдиним рядком, використовуючи роздільник, до якого він приєднаний. Наприклад, 'a'.join(['I', 'can', 'play', 'the', 'saxophone'])2 стає Iacanaplayatheasaxophone.

print('\n'.join(                                                        ))

Це joinзаймає купу рядків і відокремлює їх новими рядками. Все, що залишилося, - printце stdoutі ми зробили!

Усі разом зараз:

print('\n'.join(map(' '.join,zip(*[a.ljust(max(map(len,s)))for a in s]))))

Знайдіть довжину найдовшого слова з введення, додайте пробіли до кожного слова, поки вони не будуть однакової довжини, переведіть з zip(*трьома трюками, використовуйте joinдля відокремлення кожного символу в рядку з пробілами, joinщоб знову відокремити кожен рядок новим рядком, і друкуйте! Непогано для єдиного рядка, що не працює над входом у програмі на 92 байти.


1. Додаткові символи, витрачені на print()круглі дужки, переважають 4 символи, які я скидаю з raw_input()-> input().
2. Я не можу насправді грати на саксофоні.
3. ). Ласкаво просимо.


2
Я поняття не маю, чому це CW. Я, можливо, випадково натиснув кнопку. Що ж, добре.
підземниймонорельс

Ви можете змінити print("\n".join(...))на *map(print,...),. Спробуйте в Інтернеті!
Джо Кінг

2

05AB1E , оцінка 8 -20 -21 ( 30 29 байт - 50 бонусів):

|Dgi#ζεSðý}»}ë¹ε2ô€¬}ζJεðÜ}ðý

Спробуйте в режимі он-лайн (звичайний однорядковий ввід).
Спробуйте в режимі он-лайн (багаторядковий зворотний ввід).

Пояснення:

|                     # Take the input split on newlines:
                      #  i.e. 'This is a test' → ['This is a test']
                      #  i.e. 'T i a t\nh s   e\ni     s\ns     t'
                      #    → ['T i a t','h s   e','i     s','s     t']
 Dg                   #  Duplicate this list, and take the length
                      #   i.e. ['This is a test'] → 1
                      #   i.e. ['T i a t','h s   e','i     s','s     t'] → 4
   i         }        # If the length is exactly 1:
    ¹                 #  Take the input again 
     #                #  Split the input-string by spaces
                      #   i.e. 'This is a test' → ['This','is','a','test']
      ζ               #  Zip with space-filler: Swap all rows and columns
                      #   i.e. ['This','is','a','test'] → ['Tiat','hs e','i  s','s  t']
       ε   }          #  For each item:
        S             #   Convert the item to a list of characters
                      #    i.e. 'Tiat' → ['T','i','a','t']
         ðý           #   Join them by a single space
                      #    i.e. ['T','i','a','t'] → 'T i a t'
            »         #  Join the result by newlines (and output implicitly)
    ë                 # Else:
     ε    }           #  For each item:
      2ô              #   Split it into chunks of two characters
                      #    i.e. 'h s   e' → ['h ','s ','  ','e']
        €¬            #   Take the head (first character) of each:
                      #    i.e. ['h ','s ','  ','e'] → ['h','s',' ','e']
           ζ          #  Zip with space-filler: Swap all rows and columns
                      #   i.e. [['T','i','a','t'],['h','s',' ','e'],['i',' ',' ','s'],['s',' ',' ','t']]
                      #     → [['T','h','i','s'],['i','s',' ',' '],['a',' ',' ',' '],['t','e','s','t']]
            J         #  Join each inner list to a single string
                      #   i.e. [['T','h','i','s'],['i','s',' ',' '],['a',' ',' ',' '],['t','e','s','t']]
                      #     → ['This','is  ','a   ','test']
             ε  }     #  For each item:
              ðÜ      #   Remove any trailing spaces
                      #    i.e. 'is  ' → 'is'
                 ðý   #  Join the items by a single space (and output implicitly)

Оригінальна 8-байтна відповідь:

#ζεSðý}»

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

Пояснення:

#           # Split the input-string by spaces
            #  i.e. 'This is a test' → ['This','is','a','test']
 ζ          # Zip with space-filler: Swap all rows and columns
            #  i.e. ['This','is','a','test'] → ['Tiat','hs e','i  s','s  t']
  ε   }     # For each item:
   S        #  Convert the item to a list of characters
            #   i.e. 'Tiat' → ['T','i','a','t']
    ðý      #  Join them by a single space
            #   i.e. ['T','i','a','t'] → 'T i a t'
       »    # Join the result by newlines (and output implicitly)

1

Математика 49

Очевидно, що математика не найкраща для цього:

Grid[PadRight@Characters@StringSplit@s^T]/. 0->" "

Графіка математики

Примітка ^T(транспонирование) - це лише одна табличка (зараз не можу знайти потрібний код char)


1

Javascript, 141

a=prompt().split(' '),c=0,d=a.map(function(a){b=a.length;c=c<b?b:c});for(j=0;j<c;j++){b='';for(i in a)b+=a[i][j]?a[i][j]:' ';console.log(b);}

Зразок

hello, world! this is code golf

hwticg
eohsoo
lri dl
lls ef
od    
,! 

1

GolfScript [41 байт]

' '%:x{.,x{,}%$-1=-abs' '*+}%zip{' '*}%n*

Як це працює:

' '%:x          split text into words and store array in 'x'
{               for each word in the array:
    .,              from word's length
    x{,}%$-1=-      substract the length of the longest word in 'x'
    abs             get absolute value (maybe there is a shorter way?)
    ' '*+           add corresponding number of spaces
}%
zip{' '*}%      transpose array of words and add spaces between letters
n*              join words with a new line character

Ви можете побачити онлайн-демонстрацію тут .

PS: Це мій перший GolfScript код коли-небудь, тому не судіть мене строго;)



1

Bash + coreutils, 54

eval paste `printf " <(fold -w1<<<%s)" $@`|expand -t2

Вихід:

$ ./transpose.sh Привіт, світ! Мене звуть Фоо.
HWM ni F
еоясо
lrmo
lle
од       
,!       
$ 

Пропозиція щодо оновлення: зворотні посилання для заміни команд амортизуються. Використання $()конструкції тепер є загальним методом заміни команд.
Йокай

@Yokai - Це кодовий гольф - тут ми оптимізуємо довжину коду, а не відповідність стандартам / найкращим практикам. codegolf.stackexchange.com/a/25572/11259
Digital Trauma

Я подумав, оскільки норма змінилася для заміни команд, я б запропонував оновлення. Вам не доведеться. Це була лише пропозиція. Це все одно додало б лише одного нового символу.
Йокай

1

APL: 18

⍉↑1↓¨a⊂⍨' '=a←' ',

Пояснення:

a ← '', поставте пробіл перед рядком і призначте a

'' = знаходити пробіли, створює булеву форму

1 ↓ ¨a⊂⍨ зробіть підрядки, починаючи з булевого числа 1, і випустіть перший елемент кожного (так що пробіл)

⍉ ↑ Зробіть матрицю з отриманих підрядів та поверніть її по діагоналі


1

R , 81 байт

Збережіть байт, зберігаючи нову лінію як e, яка може використовуватися в обох scanдзвінках, порівнянні дзвінка та cat.

w=scan(,e,t=scan(,e<-"
"));while(any((s=substr(w,F<-F+1,F))>e))cat(pmax(" ",s),e)

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


1

K (oK) , 26 байт

Рішення:

`0:{" "/'+(|/#:'x)$x}@" "\

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

Пояснення:

`0:{" "/'+(|/#:'x)$x}@" "\ / the solution
                      " "\ / split input on whitespace
   {                }@     / apply (@) lambda
                  $x       / pad ($) input (x)
          (      )         / do this together
             #:'x          / count (#:) each (')
           |/              / max
         +                 / transpose / flip
    " "/'                  / join each with whitespace
`0:                        / print to stdout

0

Пітон 2,7 - 119 106

Візьміть 1 - 166. Повернення списків потрібно було зробити так, щоб попсові роботи були в тому порядку, який я хотів, але це здавалося марним. І коли я спробував поєднати в єдине розуміння для розваги, поп накрутив речі.

w=raw_input().split(' ');l=max([len(l) for l in w]);
q=[list(p)[::-1]for p in w]+[['\n']*l]
t=[' '+(v.pop() if v else' ')for i in range(l)for v in q]
print ''.join(t)

Візьміть 2 - 119. Тому я перейшов на просту індексацію списку. Але все ще здається незграбним, особливо прокладки пробілів та нових ліній.

w=raw_input().split(' ');l=max([len(l)for l in w]);print''.join([' '+(v+' '*l)[i]for i in range(l)for v in w+['\n'*l]])

Візьміть 3 - завдяки @grc

w=raw_input().split();l=max(map(len,w));print''.join(' '+(v+' '*l)[i]for i in range(l)for v in w+['\n'*l])

2
[len(l)for l in w]можна скоротити до map(len,w), .split(' ')до .split()і .join([...])до .join(...).
grc

Я не надто детально переглянув ваш код, щоб це не спрацювало, але: "Зміна списків потрібна для того, щоб поп-робота працювала в тому порядку, який я хотів" Не могли б ви використати, v.pop(0)щоб перескакувати перший елемент замість останній?
підземниймонорельс

0

Пітон 3, 124

a=input().split()
l=max(map(len,a))
print("\n".join(" ".join(c[i] for c in [i+" "*(l-len(i)) for i in a]) for i in range(l)))

0

Хаскелл, 112

Гольф:

import Data.List
r s=unlines$transpose$p$words s
p w=m(\s->s++replicate(maximum(m l w)-l s)' ')w
m=map
l=length

Пояснили:

import Data.List

-- Break on spaces, then pad, then transpose, then join with newlines
r s=unlines$transpose$p$words s

-- Pads each String in a list of String to have the same length as the longest String
p w=m(\s->s++replicate(maximum(m l w)-l s)' ')w

-- Aliases to save space
m=map
l=length

Приклад:

*Main Data.List> putStrLn $ r "Hello Doge"
HD
eo
lg
le
o

0

JavaScript, 139 (156 з виходом console.log)

s=" ",b="",a=prompt().split(s),l=0;for(var i in a){m=a[i].length;l=(l<m)?m:l;}for(i=0;i<l;i++){for(var j in a)b+=((x=a[j][i])?x:s)+s;b+="\n"}console.log(b);

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



0

Pyth, 8 байт

jbjL\ Cc

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

Досить прямо. Бере вхід, укладений у лапки, тобто"Hello World"

jbjL\ CcQ
---------
       cQ    Chop the input Q on spaces
      C      Matrix transpose
  jL\        Join each element by spaces,
             i.e. interleave spaces between the characters of each element
jb           Join by newlines

1
Cскорочує довжину найкоротшого запису, тому це не працює . Ось швидке виправлення, яке також становить 8 байт.
hakr14

0

APL (NARS), 79 символів, 158 байт

{m←⌈/↑∘⍴¨z←(' '≠⍵)⊂,⍵⋄v←∊m{⍵\⍨∊(k⍴1)(0⍴⍨⍺-k←↑⍴⍵)}¨z⋄((2×↑⍴z)⍴1 0)\[2]⍉(↑⍴z)m⍴v}

тест:

  f←{m←⌈/↑∘⍴¨z←(' '≠⍵)⊂,⍵⋄v←∊m{⍵\⍨∊(k⍴1)(0⍴⍨⍺-k←↑⍴⍵)}¨z⋄((2×↑⍴z)⍴1 0)\[2]⍉(↑⍴z)m⍴v}
  f 'Hello, World! My name is Foo.'
H W M n i F 
e o y a s o 
l r   m   o 
l l   e   . 
o d         
, !         

Старі функції мають вихід не ідеальний:

  {⍪¨(' '≠⍵)⊂,⍵}'Hello, World! My name is Foo.'
 H  W  M  n  i  F 
 e  o  y  a  s  o 
 l  r     m     o 
 l  l     e     . 
 o  d             
 ,  !
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.