Распечатать строку с вертикальными словами


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: я так думаю. Это не то же самое - и я могу утверждать, что моя проблема немного легче.
Фу Барриньо

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

1
@PeterTaylor: не совсем. Моя проблема не требует соблюдения новых строк в исходной строке. Эта проблема требует преобразования новых строк в пробелы и пробелов в две строки. Это не совсем тривиальное сокращение.
Фу Барриньо

Ответы:


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";}

Мой первый код гольф :)


Это отлично подходит для вашей первой попытки!
Фу Барриньо

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

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

Ура, я победил Perl! : 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);

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

Unminified:

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


Очень красиво сделано
Фу Барриньо

@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]}/

Делает работу довольно простым способом.


Нет необходимости в скобках вокруг выражений модификаторов операторов .
manatwork

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

Это? Разве это не do{}while()петля?
Мниип

Нет. doСама по себе ничего другого, только блок. Это whileотдельная вещь.
manatwork

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 Это как строки представлены в к. Если вы специально хотите писать в stdout, вы можете использовать {-1@" "/:',:''x@'/:!max@#:'x:" "\:x;}(37 символов), что даст вывод без"
tmartin

4
Ну, я думаю, что результат должен быть требуемым, несмотря на язык
доктор Белизарий

2

Python:

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

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 ("") => 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''

Кто-то уже сделал это лучше, но я мог бы также бросить это. Добавляет пробелы к каждому слову во входных данных до тех пор, пока его длина не станет самой длинной (чтобы избежать ошибок индексации для следующей части), а затем печатает cth-ую букву каждого слова, в то время как 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является сокращением от «левого выравнивания». Он принимает целое число в качестве аргумента и добавляет пробелы в строку, пока она не станет такой длинной.

                             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(*3 , использовать joinдля разделения каждого символа в строке с пробелами, joinснова для разделения каждой строки с новой строкой, и распечатать! Неплохо для единственной строки без обработки ввода в 92-байтовой программе.


1. Дополнительные символы, потраченные на print()круглые скобки, перевешиваются четырьмя символами, которые я опускаю 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

Mathematica 49

Очевидно, что Mathematica не лучший для этого:

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

Математическая графика

Примечание ^T(транспонирование) - это только один символ (сейчас я не могу найти правильный код)


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

Баш + coreutils, 54

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

Выход:

$ ./transpose.sh Привет, мир! Меня зовут Фу.
HWM ni F
eoyaso
lrmo
Иль
О.Д.       
!       
$ 

Предложение по обновлению: обратные галочки для подстановки команд устарели. Использование $()конструкции теперь является распространенным методом подстановки команд.
Йокай

@Yokai - это код-гольф - здесь мы оптимизируем длину кода, а не соответствие стандартам / рекомендациям. codegolf.stackexchange.com/a/25572/11259
Цифровая травма

Я рассчитывал, так как норма для замены команд изменилась, я бы предложил обновить. Вам не нужно. Это было просто предложение. В любом случае, это будет только один новый персонаж.
Yokai

1

APL: 18

⍉↑1↓¨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 (ок) , 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

Python 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

Golfed:

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.