Квадрат тексту


29

Змагання

Давши рядок, виведіть текст у формі квадрата.

Можна припустити, що текст завжди поміститься в квадрат , і що він ніколи не буде порожнім рядком.

Ви також можете припустити, що ніколи не буде нових рядків.

Приклад

Input:
Hi, world

Output:
Hi,
 wo
rld

Випробування

Input:
Hi, world! Hello

Output:
Hi, 
worl
d! H
ello

Input:
Lorem ipsum dolor sit amt

Output:
Lorem
 ipsu
m dol
or si
t amt

Input:
H

Output:
H

Правила

  • Це , тому найкоротша відповідь у байтах виграє! Tierereaker - найбільш відповідна відповідь.
  • Стандартні лазівки заборонені.

Чи можна припустити, що вхід ніколи не матиме нових рядків?
Міський голова

@MayorMonty так.
акроліт

2
Чи можемо ми замість цього вивести масив рядків?
Leaky Nun

@LeakyNun немає 15
годин

2
Чи можемо ми друкувати за допомогою нового шрифту?
Джузеппе

Відповіді:


21

Vim, 59, 57 , 48 байт / натискання клавіш

$:let @q=float2nr(sqrt(col('.')))."|li<C-v><cr><C-v><esc>@q"<cr>@q

Оскільки V назад сумісний, ви можете спробувати його в Інтернеті!

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


15

Brainfuck , 116 112 байт

>>>>,[[<]<<+>>>[>],]<[<]<+<[>>+<[-<-<+>>]<<++[->>+<<]>]>[-]>>[<[->.[-]<[->+<]<+[->+<]>>]++++++++++.[-]<[->+<]>>]

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

Безпечний в ароматах BF, який не маскує клітини 256, не підтримує нульові байти.

Видаліть початкові стрілки праворуч, якщо аромат підтримує негативну пам’ять на збережені 4 байти.

Пояснення

Програма поділена на 3 етапи:

Stage 1: >>>>,[[<]<<+>>>[>],]<[<]
Stage 2: <+<[>>+<[-<-<+>>]<<++[->>+<<]>]>[-]>>
Stage 3: [<[->.[-]<[->+<]<+[->+<]>>]++++++++++.[-]<[->+<]>>]

1 етап

На цьому етапі ми ставимо всіх персонажів на стрічку, зберігаючи при цьому кількість символів.

Це стрічка для введення abcdefghiпісля цієї стрічки:

000 009 000 000 095 096 097 098 099 100 101 102 103
             ^

Це 009- кількість.

Для кожного символу переміщуємо перший нуль зліва, [<]а потім додаємо його до лічильника <<+>>>, а потім переходимо до самого правого нуля, [>]щоб підготуватися до наступного символу.

2 етап

Цей етап виконує квадратний корінь довжини, що зберігається у другій комірці.

Він продовжує віднімати, 1, 3, 5, 7, ...поки число не досягне нуля, зберігаючи перевірку кількості ітерацій.

Це працює, тому що квадратні числа можна виразити як 1 + 3 + 5 + ....

3 етап

Позначимо квадратний корінь довжини, знайденої вище як n.

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


1
+1 не читав, але виглядає дивовижно
Рохан Джунхунвалала

11

Python 2, 55 байт

s=input()
n=int(len(s)**.5)
while s:print s[:n];s=s[n:]

10

05AB1E , 5 байт

Dgtô«

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

D    duplicate a (implicit input)
g    length of a
t    square root of a
ô    push a split in pieces of b
«    join by newlines (implicit output)

1
Чудова відповідь. Але як це працює? Чи можете ви редагувати, щоб додати пояснення?
grooveplex

@grooveplex зроблено.
акроліт


3
Дивно бачити старі відповіді 05AB1E, де »зараз є нові рядки.
Чарівний восьминога Урна

8

MATL , 6 байт

tnX^e!

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

Пояснення

t     % Take input implicitly. Push another copy
n     % Get number of elements of the copy
X^    % Take square root
e     % Reshape the input into that number of rows, in column-major order
      % (which means: down, then across)
!     % Transpose so that text reads horizontally. Implicitly display

1
квадратний "тоор"? : P
акроліт

@daHugLenny :-D. Виправлено
Луїс Мендо

4
@daHugLenny Це зворотний квадрат квадратного кореня. ;-)
WBT

7

Желе, 8 7 байт

sLƽ$j⁷

Збережено байт завдяки @ Dennis .

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

Пояснення

sLƽ$j⁷  Input: string S
    $    Monadic chain
 L         Get the length of S
  ƽ       Take the integer square root of it, call it n
s        Split S into chunks of size n
     j⁷  Join using newline

2
œsі sзробіть те ж саме тут.
Денніс

Чому ½замість цього не працює ƽ?
Луїс Мендо

@LuisMendo Тому що він повертає поплавок. Я буду латати sі œsтак вони кидають на int.
Денніс

@Dennis довгоочікуваний патч все ще чекає ...
Ерік Позашляховик

7

JavaScript (ES7), 49 байт

s=>s.match(eval(`/.{${s.length**.5}}/g`)).join`
`

44 байти лише у Firefox Nightly 43-46 ( **було введено деякий час між Firefox Nightly 42 та 43 та gяк окремий параметр було видалено деякий час між Firefox Nightly 46 та 47):

s=>s.match(`.{${s.length**.5}}`,`g`).join`
`

У першій версії, навіщо вам потрібно +вs.length*+.5
Пуховик

Я ніколи раніше не бачив *+синтаксису. Може хтось, будь ласка, пояснить це?
Міський голова

Він, мабуть, означає **.
Conor O'Brien

@MayorMonty Так, це було помилковим вибаченням.
Ніл

@Downgoat Це був помилковий пробач.
Ніл

7

J, 9 байт

$~,~@%:@#

Це монадичний гак над вхідним рядком:

$~ ,~@%:@#

Правильний зубчик - це серія композицій:

,~ @ %: @ #

Зліва - формує дієслово, переключене таким чином, що воно працює у гаковому форматі.

Ось кілька проміжних результатів:

   # 'hiya'
4
   %:@# 'hiya'
2
   ,~@%:@# 'hiya'
2 2

На словах:

   size =: #
   sqrt =: %:
   dup =: ,~
   on =: @
   shape =: $~
   block =: shape dup on sqrt on size
   block 'Hello, World! :)'
Hell
o, W
orld
! :)

2
Мені подобається те, що $~,~@нагадує якийсь смайлик, але @здається дивним для вуха, але &підходить краще, або$~,~&
миль

1
І я вважаю, що вони функціонально рівноцінні. Ну, переважно. Один дозволяє чути краще, ніж інший;)
Conor O'Brien

1
+1 за те, щоб ваш рахунок був n². Моя теж :)
Digital Trauma

@DigitalTrauma весело! +1 також!
Conor O'Brien

1
$~2#%:@#є 8. Ліва частина виделки може бути постійною.
FrownyFrog

5

C, 64 байти

Зателефонуйте f()за допомогою рядка на квадрат.

m;f(char*s){for(m=sqrt(strlen(s));*s;s+=m)printf("%.*s\n",m,s);}

Спробуйте це на ideone .


1
Чи можете ви змусити його працювати з неявним intаргументом замість char*?
anatolyg

Я не думаю, що так. Це потрібно зменшити, щоб числовий тип не працював, і це не може бути, int*оскільки це додасть масштаб помилок при додаванні.
owacoder

Запропонувати s+=write(puts(""),s,m));замістьs+=m)printf("%.*s\n",m,s);
roofcat

5

Perl, 23 + 4 ( -pFпрапори) = 27 байт

-2 байти завдяки @DomHastings
-1 байт завдяки @DomHastings

$==sqrt@F;s/.{$=}/$&
/g

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

Розширення : обчислює квадратний корінь (давайте називати його Sдля пояснення) розміру вхідного даних (він завжди буде цілим числом) ( @Fвикористовується в скалярному контексті, таким чином повертаючи його розмір), а потім додавати новий рядок після кожного блоку Sсимволів.


Приємне використання $@,;) Ви можете зберегти байт, використовуючи y///cзамість довжини, і я думаю, ви можете використовувати буквально новий рядок. Мені здавалося, що я намагаюся зробити щось із встановленням $,та узгодженням, але думаю, це набагато коротше!
Дом Гастінгс

1
@DomHastings Так, я думав, що тобі сподобається $@! Дякую за те y///c, що я забуваю забути, що воно існує.
Дада

1
@DomHastings вдалося зберегти 1 байт, використовуючи $=замість $@, що дозволяє не використовувати -lпрапор.
Дада

Добре йдуть! Добре використовувати і магічні змінні з справжніх причин!
Дом Гастінгс

Гей, сподіваюся, ти все гаразд! Це натрапило на домашню сторінку, і я помітив ще одну оптимізацію для коду-pF
Дом Гастінгс

4

zsh, 36 байт

fold -`sed s/.$//<<<$[$#1**.5]`<<<$1

Приймає введення як аргумент командного рядка, виводить в STDOUT.

                      $#1             get the length of the input string
                    $[   **.5]        take it to the .5 power (sqrt)
                 <<<                  and pass the result to
       sed s/.$//                     sed, which removes the last character
                                      this is because sqrt(9) is 3. instead of 3
     -`                       `       give the result as a command line flag to
fold                                  the fold util, which wraps at nth column
                               <<<$1  pass the input as input to fold

+1 за те, щоб ваш рахунок був n². Моя теж :)
Digital Trauma

4

05AB1E , 8 6 байт

Завдяки @quartata за те, що він повідомив мені про функцію квадратного кореня

Dgtô¶ý

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

Пояснення

D     Implicit input. Duplicate
g     Number of elements
t     Square root
ô     Split into chunks of that length
¶     Push newline character
ý     Join list by newlines. Implicit display

Дуже хороша! Крім того, «короткий для приєднання на нових лініях :).
Аднан

1
@Adnan Дякую! Тепер я перевершив себе :-D
Луїс Мендо

Я повернувся до своєї 6-байтної версії, тому що раніше було відповідь«
Луїс Мендо

1
О, це дуже погано :(
Аднан

Хто-небудь ще відчуває, що ці мови, спеціально створені для кодового гольфу, начебто руйнують привабливість усього цього?
Рене Рот

4

Пітон, 94 75 71 65 63 байт

import re;lambda r:"\n".join(re.findall("."*int(len(r)**.5),r))

Стара версія:

lambda r:"\n".join(map("".join,zip(*[iter(r)]*int(len(r)**.5))))

Зауважте, що ви можете використовувати input() за замовчуванням для отримання введення в лапки, якщо ви не хочете спеціально видалити цю опцію.
xnor

@xnor Ох, кілька днів тому мені було цікаво, чи можу я використати котирування на вході ...
acrolith

Чи не буде коротше використовувати лямбда?
Leaky Nun

@LeakyNun true ...
acrolith



3

Діалог APL, 10 байт

⊢⍴⍨2⍴.5*⍨≢

Пояснення:

         ≢   length of the argument   
     .5*⍨    square root 
   2⍴        reshape that to a length-2 vector
⊢⍴⍨          reshape the input by that vector

Тести:

      (⊢⍴⍨2⍴.5*⍨≢)'Hi, world'
Hi,
 wo
rld
      (⊢⍴⍨2⍴.5*⍨≢)'Hi, world! Hello'
Hi, 
worl
d! H
ello
      (⊢⍴⍨2⍴.5*⍨≢)'Lorem ipsum dolor sit amt'
Lorem
 ipsu
m dol
or si
t amt
      (⊢⍴⍨2⍴.5*⍨≢) 'H'
H

3

Чеддар, 27 байт (неконкурентоспроможний)

s->s.chunk(s.len**.5).vfuse

Я додав .chunkфункцію деякий час тому, але я видалив її при переході до нового формату stdlib і забув її знову додати. Чеддар має спеціального sqrtоператора, але **.5він коротший

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

Пояснення

s ->              // Function with argument s
    s.chunk(      // Chunk it into pieces of size...
      s.len ** .5 // Square root of length.
    ).vfuse       // Vertical-fuse. Join on newlines

3

Утиліти Bash + GNU, 25

fold -`dc -e${#1}vp`<<<$1

Не так відрізняється від відповіді @ Doorknob , але dcце коротший спосіб отримати квадратний корінь.


3

𝔼𝕊𝕄𝕚𝕟, 11 символів / 14 байт

ѨĊ(ï,√ ïꝈ⸩Ė⬮

Try it here (ES6 browsers only).

Створено за допомогою цього коду (запустіть у консолі браузера інтерпретатора):

c.value=`Ѩ${alias(_,'chunk')}(ï,√ ïꝈ⸩${alias(Array.prototype,'mjoin')}⬮`

3

Brainfuck, 83 байти

,[>+[>+<-],]
>
[
  >>[<+<-->>-]
  +<[>+<-]
  <-
]
<<
[
  [<]
  >.,
  >[>]
  >>+>-[<]
  <[[>+<-]++++++++++.,<<]
  <
]

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

Тут використовується та сама ідея, що і у Leaky Nun's відповіді . Він попросив допомогти в гольфі в чаті, потім запропонував мені додати це як нову відповідь. (Насправді те, що я писав у чаті, було 84-байтним рішенням, дуже подібним до цього.)

Для порівняння, додатково > на початку потрібна версія для мозкових завдань, які не дозволяють негативні адреси пам'яті.

Як і очікувалося, це знаходить довжину вводу, потім бере квадратний корінь, після чого друкує рядки відповідно. Він використовує ідеальні квадрати, які є частковими сумами 1 + 3 + 5 ....


3

Мозг-Флак , 110 96 байт

([]<>){({}{}(({}[()])))}{}{({}()<(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>)>)}{}{}{({}<>)<>}<>

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

Другий розчин, 96 байт

(([]<>)<{({}({})({}[()]))}{}>){({}(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>))}{}{}{({}<>)<>}<>

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

Пояснення

Тут я пояснюю перше рішення, обидва мають однакову довжину, але мені подобається перше, оскільки воно крутіше і використовує деякі приємні хитрощі.

Найважливіша частина коду - це змінена функція квадратного кореня, про яку я писав деякий час тому. Оригінальна версія була

{({}[({})({}())])}{}

І це працює, але ми насправді хочемо дві копії негативного квадратного кореня. Чому? Нам потрібні дві копії, оскільки ми пробираємося через рядок на двох рівнях, один для створення рядків і один для підрахунку кількості рядків. Ми хочемо, щоб це було негативним, оскільки циклічне використання негативів дешевше.

Щоб зробити цей негатив, ми рухаємось [...]так, щоб це виглядало так

{({}({})({}[()]))}{}

Щоб зробити дві копії, ми змінюємось, коли трапляються попси

{({}{}(({}[()])))}{}

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

([]<>){({}{}(({}[()])))}{}

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

Тепер будуємо основну петлю

{({}()<(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>)>)}{}{}

Це досить прямо вперед, ми обводимо n разів кожен раз, пересуваючи n елементів, і обмежуємо їх новим рядком (ASCII 10).

Після того, як цикл виконаний, нам потрібно змінити порядок нашого виводу, щоб ми просто застосували стандартну зворотну конструкцію.

{({}<>)<>}<>



2

Perl 6 , 38 байт

$_=get;.put for .comb: .chars.sqrt.Int

Пояснення:

$_ = get;          # get a single line of input


$_.put             # print with trailing newline

for                # every one of the following:

$_.comb:           # the input split into

$_.chars.sqrt.Int  # chunks of the appropriate size

2

Чеддар, 57 байт

n->(m->(|>m).map(i->n.slice(i*m,i*m+m)).vfuse)(n.len**.5)

Оскільки змінні зламані, мені доведеться передати змінні через лямбда-додаток.

Крім того, виявляється, що навіть якби змінні працювали, користуватися лямбда-програмою все одно було б коротше.

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

cheddar> (n->(m->(|>m).map(i->n.slice(i*m,i*m+m)).vfuse)(n.len**.5))("abcd")
"ab
cd"


2

Java 1.7, 110 байт

void f(String s){for(int i=-1,k=(int)Math.sqrt(s.length());++i<k;)System.out.println(s.substring(i*k,i*k+k));}

Спробуй це! (Ідеон)

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

Треба любити багатослівність Java ... :)


Приємна відповідь +1. Ви можете грати в гольф це 1 байт, використовуючи i=0, i<kі s.substring(i*k,i++*k+k)замість того i=-1, ++i<k, s.substring(i*k,i*k+k). Крім того, зазвичай ми використовуємо лише Java 7замість цього Java 1.7, але добре, що ви додали його, багато людей забувають це зробити.
Кевін Кройсейсен




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