Segi teks


29

Tantangan

Diberikan string, output teks dalam bentuk kotak.

Anda bisa berasumsi bahwa teks akan selalu masuk dalam kotak , dan itu tidak akan pernah menjadi string kosong.

Anda juga dapat menganggap itu tidak akan pernah memiliki baris baru.

Contoh

Input:
Hi, world

Output:
Hi,
 wo
rld

Uji Kasus

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

Aturan

  • Ini , jadi jawaban tersingkat dalam byte menang! Tiebreaker adalah jawaban yang paling banyak dipilih.
  • Celah standar dilarang.

Bisakah kita berasumsi bahwa input tidak akan pernah memiliki baris baru?
MayorMonty

@ MayorMonty ya.
acrolith

2
Bisakah kita menghasilkan array string saja?
Leaky Nun

@LeakyNun no 15 chars
acrolith

2
Bolehkah kita mencetak dengan baris baru yang tertinggal?
Giuseppe

Jawaban:


21

Vim, 59, 57 , 48 byte / penekanan tombol

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

Karena V kompatibel dari belakang, Anda dapat mencobanya secara online!

Saya secara acak menerima suara positif pada jawaban ini, jadi saya melihatnya lagi. Keahlian vim-golf saya meningkat pesat selama 7 bulan terakhir, jadi saya melihat bahwa jawaban ini sangat buruk golf. Yang ini jauh lebih baik.


15

Brainfuck , 116 112 byte

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

Cobalah online!

Aman dalam rasa BF yang tidak menutupi sel dengan 256, tidak mendukung byte nol.

Hapus panah kanan awal jika rasa mendukung memori negatif untuk 4 byte yang disimpan.

Penjelasan

Program ini dibagi menjadi 3 tahap:

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

Tahap 1

Pada tahap ini, kami menempatkan semua karakter ke dalam kaset, sambil tetap menghitung jumlah karakter.

Ini adalah rekaman untuk input abcdefghisetelah rekaman ini:

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

The 009adalah menghitung.

Untuk setiap karakter, kami memindahkan nol pertama di sebelah kiri [<]dan kemudian menambahkan satu ke hitungan <<+>>>, dan kemudian pindah ke nol paling kanan [>]untuk bersiap-siap untuk karakter berikutnya.

Tahap 2

Tahap ini melakukan akar kuadrat dari panjang yang disimpan di sel kedua.

Itu terus mengurangi 1, 3, 5, 7, ...hingga jumlahnya mencapai nol, sambil tetap memeriksa jumlah iterasi.

Ini bekerja karena angka kuadrat dapat dinyatakan sebagai 1 + 3 + 5 + ....

Tahap 3

Menunjukkan akar kuadrat dari panjang yang ditemukan di atas sebagai n.

Tahap ini menampilkan nkarakter pada satu waktu, dan kemudian menampilkan baris baru, sampai rekaman itu dihapus.


1
+1 tidak membaca terlihat luar biasa
Rohan Jhunjhunwala

11

Python 2, 55 byte

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

10

05AB1E , 5 byte

Dgtô«

Cobalah online!

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
Jawaban yang bagus Tetapi bagaimana cara kerjanya? Bisakah Anda mengedit untuk menambahkan penjelasan?
grooveplex

@grooveplex selesai.
acrolith

Sangat mengesankan!
Gryphon - Pasang kembali Monica

3
Sangat aneh melihat jawaban 05AB1E lama di mana »baris baru sekarang.
Magic Gurita Guci

8

MATL , 6 byte

tnX^e!

Cobalah online!

Penjelasan

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
persegi "toor"? : P
acrolith

@daHugLenny :-D. Diperbaiki
Luis Mendo

4
@daHugLenny Itu kebalikan dari akar kuadrat. ;-)
WBT

7

Jelly, 8 7 byte

sLƽ$j⁷

Menyimpan satu byte berkat @ Dennis .

Cobalah online.

Penjelasan

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
œsdan slakukan hal yang sama di sini.
Dennis

Kenapa ½tidak bekerja ƽ?
Luis Mendo

@LuisMendo Karena mengembalikan float. Saya akan menambal sdan œsmereka melemparkan ke int.
Dennis

@Dennis patch yang lama ditunggu-tunggu masih menunggu ...
Erik the Outgolfer

7

JavaScript (ES7), 49 byte

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

44 byte di Firefox Nightly 43-46 saja ( **diperkenalkan beberapa waktu antara Firefox Nightly 42 dan 43 dan gsebagai parameter terpisah dihapus beberapa waktu antara Firefox Nightly 46 dan 47):

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

Dalam versi pertama mengapa Anda memerlukan +ins.length*+.5
Downgoat

Saya belum pernah melihat *+sintaksis sebelumnya. Bisakah seseorang tolong jelaskan?
MayorMonty

Dia mungkin berarti **.
Conor O'Brien

@ MayorMonty Ya itu salah ketik maaf.
Neil

@Downgoat Itu salah ketik maaf.
Neil

7

J, 9 byte

$~,~@%:@#

Ini adalah kait monadik pada string input:

$~ ,~@%:@#

Tine yang tepat adalah serangkaian komposisi:

,~ @ %: @ #

Kiri adalah kata kerja pembentukan, diaktifkan sedemikian rupa sehingga berfungsi dalam format kait.

Berikut adalah beberapa hasil antara:

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

Dalam kata kata:

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

2
Saya suka fakta yang $~,~@menyerupai semacam emoticon tetapi @tampaknya aneh untuk telinga tetapi &lebih cocok, atau$~,~&
mil

1
Dan saya kira mereka secara fungsional setara. Yah, kebanyakan. Yang satu memungkinkan Anda mendengar lebih baik daripada yang lain;)
Conor O'Brien

1
+1 karena skor Anda menjadi n². Milik saya juga :)
Digital Trauma

@DigitalTrauma menyenangkan! +1 juga!
Conor O'Brien

1
$~2#%:@#adalah 8. Bagian kiri garpu bisa berupa konstanta.
FrownyFrog

5

C, 64 byte

Panggil f()dengan string ke kotak.

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

Cobalah di ideone .


1
Bisakah Anda membuatnya bekerja dengan intargumen implisit bukan char*?
anatolyg

Saya kira tidak. Itu perlu ditinjau ulang, jadi tipe numerik tidak akan berfungsi, dan itu tidak bisa menjadi int*karena itu akan salah skala saat menambahkan.
owacoder

Sarankan s+=write(puts(""),s,m));daripadas+=m)printf("%.*s\n",m,s);
ceilingcat

5

Perl, 23 + 4 ( -pFbendera) = 27 byte

-2 byte terima kasih kepada @DomHastings
-1 byte terima kasih ke @DomHastings

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

Cobalah online!

Expanations : menghitung root kuadrat (sebut saja Suntuk penjelasan) dari ukuran input (akan selalu berupa integer) ( @Fdigunakan dalam konteks skalar, sehingga mengembalikan ukurannya), lalu tambahkan baris baru setelah setiap blok Skarakter.


Penggunaan yang bagus dari $@;;) Anda dapat menyimpan byte menggunakan y///cbukan panjang dan saya pikir Anda dapat menggunakan baris baru secara literal juga. Saya terlihat berusaha melakukan sesuatu dengan pengaturan $,dan pencocokan, tetapi saya pikir ini jauh lebih pendek!
Dom Hastings

1
@Hastings Ya, saya pikir Anda akan menyukainya $@! Terima kasih untuk itu y///c, saya cenderung lupa bahwa itu ada.
Dada

1
@DomHastings berhasil menghemat 1 byte dengan menggunakan $=alih-alih $@, yang memungkinkan untuk tidak menggunakan -lflag.
Dada

Bagus! Bagus untuk menggunakan variabel sihir karena alasan asli juga!
Dom Hastings

Hei, semoga kamu baik-baik saja! Ini mendapat bumped ke beranda dan saya melihat optimasi lain untuk -1: 23 byte kode + 4 untuk-pF
Dom Hastings

4

zsh, 36 byte

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

Mengambil input sebagai argumen baris perintah, output ke 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 karena skor Anda menjadi n². Milik saya juga :)
Digital Trauma

4

05AB1E , 8 6 byte

Terima kasih kepada @quartata karena memberi tahu saya tentang fungsi akar kuadrat

Dgtô¶ý

Cobalah online!

Penjelasan

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

Sangat bagus! Juga, «singkat untuk bergabung di baris baru :).
Adnan

1
@ Adnan Terima kasih! Sekarang saya telah mengalahkan diri saya sendiri :-D
Luis Mendo

Saya telah memutar kembali ke versi 6-byte saya karena ada jawaban sebelumnya dengan«
Luis Mendo

1
Oh, itu terlalu buruk :(
Adnan

Apakah ada orang lain yang merasa bahwa bahasa-bahasa yang khusus diciptakan untuk golf kode itu merusak daya tarik semua ini?
René Roth

4

Python, 94 75 71 65 63 byte

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

Versi lama:

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

Perhatikan bahwa Anda dapat menggunakan input() secara default untuk menerima input dalam tanda kutip, kecuali jika Anda ingin secara khusus menghapus opsi itu.
xnor

@ xnor Oh wow, beberapa hari yang lalu saya bertanya-tanya apakah saya bisa menggunakan tanda kutip pada input ...
acrolith

Bukankah lebih pendek menggunakan lambda?
Leaky Nun

@ LeakyNun benar ...
acrolith

3

CJam , 8 byte

l_,mQ/N*

Cobalah online!

Penjelasan

l     e# Read line from input
_,    e# Duplicate. Get length 
mQ    e# Integer square root
/     e# Split into pieces of that size
N*    e# Join by newline. Implicitly display

3

Pyth, 8 byte

jcs@lQ2Q

Cobalah online

Bagaimana itu bekerja

    lQ     length of input
   @  2    square root
  s        floor
 c     Q   chop input into that many equal pieces
j          join on newline

3

Dyalog APL, 10 byte

⊢⍴⍨2⍴.5*⍨≢

Penjelasan:

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

Tes:

      (⊢⍴⍨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

Cheddar, 27 byte (tidak bersaing)

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

Saya menambahkan .chunkfungsi beberapa saat yang lalu, tetapi saya menghapusnya dalam transisi ke format stdlib baru dan lupa menambahkan kembali. Cheddar memiliki sqrtoperator khusus tetapi **.5lebih pendek

Cobalah online!

Penjelasan

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

Utilitas Bash + GNU, 25

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

Tidak jauh berbeda dengan jawaban @ Doorknob , tetapi dcmerupakan cara yang lebih pendek untuk mendapatkan akar kuadrat.


3

𝔼𝕊𝕄𝕚𝕟, 11 karakter / 14 byte

ѨĊ(ï,√ ïꝈ⸩Ė⬮

Try it here (ES6 browsers only).

Dihasilkan menggunakan kode ini (dijalankan di konsol peramban penerjemah):

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

3

Brainfuck, 83 byte

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

Cobalah online!

Ini menggunakan ide yang sama dengan jawaban Leaky Nun . Dia meminta bantuan bermain golf dalam obrolan, lalu menyarankan agar saya menambahkan ini sebagai jawaban baru. (Sebenarnya apa yang saya tulis dalam obrolan adalah solusi 84-byte yang sangat mirip dengan ini.)

Demi perbandingan, diperlukan ekstra >di awal untuk implementasi brainfuck yang tidak memungkinkan alamat memori negatif.

Seperti yang diharapkan, ini menemukan panjang input, kemudian mengambil akar kuadrat, lalu mencetak garis sesuai. Ini mengambil keuntungan dari kuadrat sempurna menjadi jumlah parsial 1 + 3 + 5 ....


3

Brain-Flak , 110 96 byte

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

Cobalah online!

Solusi kedua, 96 byte

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

Cobalah online!

Penjelasan

Di sini saya menjelaskan solusi pertama, keduanya sama panjang tetapi saya suka yang pertama karena lebih dingin dan menggunakan beberapa trik yang bagus.

Bagian terpenting dari kode adalah fungsi akar kuadrat yang dimodifikasi yang saya tulis beberapa waktu lalu. Versi aslinya adalah

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

Dan ini berhasil, tetapi kita sebenarnya menginginkan dua salinan dari akar kuadrat negatif. Mengapa? Kita membutuhkan dua salinan karena kita mengulang-ulang string pada dua level, satu untuk membuat garis dan satu untuk menghitung jumlah garis. Kami ingin menjadi negatif karena perulangan dengan negatif lebih murah.

Untuk membuat ini negatif, kami bergerak di sekitar [...]sehingga terlihat seperti ini

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

Untuk membuat dua salinan, kami mengubah kapan muncul

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

Sekarang kita memiliki bit itu, kita bisa menyatukannya dengan tumpukan tinggi untuk mendapatkan potongan kode pertama yang kita butuhkan.

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

Kami pindah ke offstack karena fungsi root kuadrat kami membutuhkan dua nol bebas untuk perhitungan, dan karena itu membuat barang sedikit lebih murah di masa depan dalam hal stack switching.

Sekarang kita membangun loop utama

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

Ini cukup lurus ke depan, kita loop n kali setiap kali memindahkan n item dan membatasi dengan baris baru (ASCII 10).

Setelah loop selesai, kita perlu membalik urutan output kita sehingga kita hanya menempel pada konstruksi terbalik standar.

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



2

Perl 6 , 38 byte

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

Penjelasan:

$_ = 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

Cheddar, 57 byte

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

Karena variabel rusak, saya harus meneruskan variabel melalui aplikasi lambda.

Juga, ternyata bahwa meskipun variabel berfungsi, masih akan lebih pendek untuk menggunakan aplikasi lambda.

Pemakaian

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 byte

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

Cobalah! (Ideone)

Saya mencoba pendekatan lain dengan fungsi mengembalikan hasil sebagai string, tetapi hanya harus mendeklarasikan string dan pernyataan kembali sudah lebih mahal (byte-count-wise) daripada pernyataan cetak.

Harus mencintai verbositas Java ... :)


Jawaban bagus +1. Anda dapat golf dengan 1 byte dengan menggunakan i=0, i<kdan s.substring(i*k,i++*k+k)bukan i=-1, ++i<k, s.substring(i*k,i*k+k). Selain itu, biasanya kami menggunakan hanya Java 7alih-alih Java 1.7, tetapi ada baiknya Anda menambahkannya, banyak orang lupa melakukannya.
Kevin Cruijssen

2

R , 59 54 byte

function(s)write(el(strsplit(s,'')),1,nchar(s)^.5,,'')

Cobalah online!

Mencetak dengan baris baru yang tertinggal. Mengejutkan, mengingat betapa buruknya R menangani string.




Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.