Ein Quadrat aus Text


29

Die Herausforderung

Geben Sie bei einer gegebenen Zeichenfolge den Text in Form eines Quadrats aus.

Sie können davon ausgehen, dass der Text immer in ein Quadrat passt und niemals eine leere Zeichenfolge ist.

Sie können auch davon ausgehen, dass es niemals Zeilenumbrüche geben wird.

Beispiel

Input:
Hi, world

Output:
Hi,
 wo
rld

Testfälle

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

Regeln

  • Das ist , also gewinnt die kürzeste Antwort in Bytes! Tiebreaker ist die am besten bewertete Antwort.
  • Standardlücken sind verboten.

Können wir davon ausgehen, dass die Eingabe niemals neue Zeilen enthält?
MayorMonty

@ MayorMonty yep.
Acrolith

2
Können wir stattdessen ein Array von Strings ausgeben?
Undichte Nonne

@LeakyNun keine 15 Zeichen
Acrolith

2
Dürfen wir mit einem nachgestellten Zeilenumbruch drucken?
Giuseppe

Antworten:


21

Vim, 59, 57 , 48 Bytes / Tastenanschläge

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

Da V abwärtskompatibel ist, können Sie es online ausprobieren!

Ich habe zufällig eine positive Bewertung für diese Antwort erhalten, also habe ich sie noch einmal durchgesehen. Meine Vim-Golf-Fähigkeiten haben in den letzten 7 Monaten stark zugenommen, so dass ich sah, dass diese Antwort sehr schlecht golfen war. Dieser ist viel besser.


15

Brainfuck , 116 112 Bytes

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

Probieren Sie es online!

Sicher in Geschmacksrichtungen von BF, die die Zellen nicht maskieren 256, unterstützt keine Null-Bytes.

Entfernen Sie die anfänglichen Pfeile nach rechts, wenn die Variante einen negativen Speicher für 4 gespeicherte Bytes unterstützt.

Erläuterung

Das Programm ist in 3 Phasen unterteilt:

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

Bühne 1

In dieser Phase werden alle Zeichen auf das Band geschrieben, während die Anzahl der Zeichen gezählt wird.

Dies ist das Band für die Eingabe abcdefghinach diesem Band:

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

Das 009ist die Zählung.

Für jedes Zeichen verschieben wir die erste Null links [<]und addieren dann eine zur Zählung <<+>>>und bewegen uns dann ganz rechts zur Null, [>]um uns für das nächste Zeichen vorzubereiten .

Stufe 2

In dieser Phase wird die Quadratwurzel der in der zweiten Zelle gespeicherten Länge erstellt.

Es wird 1, 3, 5, 7, ...solange subtrahiert, bis die Zahl Null erreicht, während die Anzahl der Iterationen überprüft wird.

Es funktioniert, weil quadratische Zahlen als ausgedrückt werden können 1 + 3 + 5 + ....

Stufe 3

Bezeichnen Sie die Quadratwurzel der oben angegebenen Länge als n.

Diese Stufe gibt nZeichen auf einmal aus und gibt dann eine neue Zeile aus, bis das Band gelöscht ist.


1
+1 nicht gelesen sieht aber erstaunlich aus
Rohan Jhunjhunwala

11

Python 2, 55 Bytes

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

10

05AB1E , 5 Bytes

Dgtô«

Probieren Sie es 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
Gute Antwort. Aber wie geht das? Könnten Sie bitte bearbeiten eine Erklärung hinzufügen?
Grooveplex

@grooveplex erledigt.
Acrolith


3
Es ist seltsam, alte 05AB1E-Antworten zu sehen, in denen »sich jetzt Zeilenumbrüche befinden.
Magic Octopus Urn

8

MATL , 6 Bytes

tnX^e!

Probieren Sie es online!

Erläuterung

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
Quadrat "Toor"? : P
Acrolith

@daHugLenny :-D. Korrigiert
Luis Mendo

4
@daHugLenny Das ist die Umkehrung der Quadratwurzel. ;-)
WBT

7

Gelee, 8 7 Bytes

sLƽ$j⁷

Ein Byte dank @ Dennis gespeichert .

Probieren Sie es online aus.

Erläuterung

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
œsund smache dasselbe hier.
Dennis

Warum funktioniert ½nicht statt ƽ?
Luis Mendo

@ LuisMendo Weil es einen Schwimmer zurückgibt. Ich werde patchen sund œsso gießen sie auf int.
Dennis

@ Tennis lang erwartete Patch noch warten ...
Erik der Outgolfer

7

JavaScript (ES7), 49 Byte

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

44 Bytes nur in Firefox Nightly 43-46 ( **wurde irgendwann zwischen Firefox Nightly 42 und 43 eingeführt und gals separater Parameter wurde irgendwann zwischen Firefox Nightly 46 und 47 entfernt):

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

In der ersten Version , warum müssen Sie die +ins.length*+.5
Downgoat

Ich habe die *+Syntax noch nie gesehen . Könnte es bitte jemand erklären?
MayorMonty

Er meint wahrscheinlich **.
Conor O'Brien

@ MayorMonty Ja, es war ein Tippfehler, sorry.
Neil

@ Downgoat Es war ein Tippfehler sorry.
Neil

7

J 9 Bytes

$~,~@%:@#

Dies ist ein monadischer Hook über der Eingabezeichenfolge:

$~ ,~@%:@#

Der richtige Ton ist eine Reihe von Kompositionen:

,~ @ %: @ #

Das linke ist ein formendes Verb, das so geschaltet ist, dass es im Hook-Format funktioniert.

Hier sind einige Zwischenergebnisse:

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

In Worten:

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

2
Ich mag die Tatsache, dass $~,~@eine Art Emoticon ähnelt, aber @seltsam für ein Ohr scheint, aber &besser passt, oder$~,~&
Meilen

1
Und ich nehme an, sie sind funktional gleichwertig. Meistens. Mit einem kannst du besser hören als mit dem anderen;)
Conor O'Brien

1
+1 für deine Punktzahl ist n². Meins ist auch :)
Digital Trauma

@DigitalTrauma Spaß! +1 ebenfalls!
Conor O'Brien

1
$~2#%:@#ist 8. Der linke Teil einer Gabel kann eine Konstante sein.
FrownyFrog

5

C 64 Bytes

Rufe f()mit der Schnur zum Quadrat.

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

Probiere es auf ideone aus .


1
Können Sie es mit implizitem intArgument anstelle von arbeiten lassen char*?
Anatolyg

Ich glaube nicht. Es muss dereferenziert werden, damit ein numerischer Typ nicht funktioniert, und es kann kein numerischer Typ sein, int*da dieser beim Hinzufügen falsch skaliert würde.
Owacoder

Schlagen Sie s+=write(puts(""),s,m));stattdessen vors+=m)printf("%.*s\n",m,s);
ceilingcat

5

Perl, 23 + 4 ( -pFFlags) = 27 Bytes

-2 Bytes dank @DomHastings
-1 Bytes dank @DomHastings

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

Probieren Sie es online!

Erweiterungen : Berechnet die Quadratwurzel (nennen wir sie Sfür die Erklärung) der Größe der Eingabe (es wird immer eine Ganzzahl sein) ( @Fwird im skalaren Kontext verwendet und gibt somit ihre Größe zurück) und fügt nach jedem Block von eine neue Zeile hinzu SZeichen.


Gute Verwendung von $@,;) Sie können ein Byte mit y///canstelle der Länge speichern, und ich denke, Sie können auch eine wörtliche neue Zeile verwenden. Ich habe versucht, etwas mit dem Einstellen $,und Anpassen zu tun , aber ich denke, das ist viel kürzer!
Dom Hastings

1
@DomHastings Ja, ich dachte du würdest das mögen $@! Vielen Dank für die y///c, ich neige dazu zu vergessen, dass es existiert.
Dada

1
@DomHastings hat es geschafft, 1 Byte zu speichern, indem $=anstelle von verwendet wurde $@, wodurch -lFlag nicht verwendet werden kann .
Dada

Gut gemacht! Gut, um die magischen Variablen auch aus echten Gründen zu nutzen!
Dom Hastings

Hey, ich hoffe es geht dir gut! Dies wurde auf die Homepage gestoßen und ich bemerkte eine weitere Optimierung für -1: 23 Byte Code + 4 für-pF
Dom Hastings

4

zsh, 36 Bytes

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

Nimmt Eingaben als Befehlszeilenargument und gibt sie an STDOUT aus.

                      $#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 für deine Punktzahl ist n². Meins ist auch :)
Digital Trauma

4

05AB1E , 8 6 Bytes

Vielen Dank an @quartata, dass Sie mich über die Quadratwurzelfunktion informiert haben

Dgtô¶ý

Probieren Sie es online!

Erläuterung

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

Sehr schön! Auch «ist kurz für den Beitritt in Newlines :).
Adnan

1
@Adnan Danke! Jetzt habe ich mich selbst übertroffen :-D
Luis Mendo

Ich habe auf meine 6-Byte-Version zurückgesetzt, weil es eine vorherige Antwort mit«
Luis Mendo

1
Oh, das ist schade :(
Adnan

Hat jemand das Gefühl, dass diese speziell für Codegolf entwickelten Sprachen den Reiz dieser ganzen Sache irgendwie ruinieren?
René Roth

4

Python, 94 75 71 65 63 Bytes

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

Alte Version:

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

Beachten Sie, dass Sie input() standardmäßig verwenden können , um Eingaben in Anführungszeichen zu erhalten, es sei denn, Sie möchten diese Option ausdrücklich entfernen.
Xnor

@xnor Oh wow, vor ein paar Tagen habe ich mich gefragt, ob ich Anführungszeichen für Eingaben verwenden könnte ...
Acrolith

Wäre es nicht kürzer, ein Lambda zu verwenden?
Undichte Nonne

@LeakyNun wahr ...
Acrolith

3

CJam , 8 Bytes

l_,mQ/N*

Probieren Sie es online!

Erläuterung

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

Dyalog APL, 10 Bytes

⊢⍴⍨2⍴.5*⍨≢

Erläuterung:

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

Tests:

      (⊢⍴⍨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 Bytes (nicht konkurrierend)

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

Ich habe die .chunkFunktion vor einiger Zeit hinzugefügt , sie aber beim Übergang zum neuen stdlib-Format entfernt und vergessen, sie erneut hinzuzufügen. Cheddar hat einen engagierten sqrtOperator, **.5ist aber kürzer

Probieren Sie es online!

Erläuterung

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

𝔼𝕊𝕄𝕚𝕟 11 Zeichen / 14 Bytes

ѨĊ(ï,√ ïꝈ⸩Ė⬮

Try it here (ES6 browsers only).

Mit diesem Code generiert (in der Browserkonsole des Interpreters ausführen):

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

3

Brainfuck, 83 Bytes

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

Probieren Sie es online!

Dies verwendet die gleiche Idee wie die Antwort von Leaky Nun . Er bat um Hilfe beim Golfspielen im Chat und schlug mir vor, dies als neue Antwort hinzuzufügen. (Eigentlich war das, was ich im Chat geschrieben habe, eine 84-Byte-Lösung, die dieser sehr ähnlich ist.)

Zum Vergleich >wird zu Beginn ein zusätzliches Element für Brainfuck-Implementierungen benötigt, die keine negativen Speicheradressen zulassen.

Wie erwartet wird die Länge der Eingabe ermittelt, die Quadratwurzel verwendet und die Zeilen entsprechend gedruckt. Es nutzt perfekte Quadrate als Teilsummen von 1 + 3 + 5 ....


3

Brain-Flak , 110 96 Bytes

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

Probieren Sie es online!

Zweite Lösung, 96 Bytes

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

Probieren Sie es online!

Erläuterung

Hier erkläre ich die erste Lösung, beide sind gleich lang, aber ich mag die erste, weil sie kühler ist und einige nette Tricks anwendet.

Der wichtigste Teil des Codes ist eine modifizierte Quadratwurzelfunktion, die ich vor einiger Zeit geschrieben habe. Die ursprüngliche Version war

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

Und das funktioniert, aber wir wollen eigentlich zwei Kopien der negativen Quadratwurzel. Warum? Wir benötigen zwei Kopien, da wir die Zeichenfolge auf zwei Ebenen durchlaufen, eine, um die Zeilen zu erstellen, und eine, um die Anzahl der Zeilen zu zählen. Wir wollen, dass es negativ ist, weil das Schleifen mit Negativen billiger ist.

Um dieses Negativ zu machen, bewegen wir uns [...]so, dass es so aussieht

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

Um zwei Kopien zu erstellen, ändern wir, wenn Pops auftreten

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

Jetzt, da wir das Bit haben, können wir es mit einer Stapelhöhe zusammenfügen, um den ersten Code zu erhalten, den wir brauchen.

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

Wir begeben uns in den Offstack, weil unsere Quadratwurzelfunktion zwei freie Nullen für die Berechnung benötigt und weil dies die Dinge in der Zukunft im Hinblick auf die Stapelumschaltung ein wenig billiger macht.

Nun konstruieren wir die Hauptschleife

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

Dies ist ziemlich einfach, wir wiederholen n-mal jedes Mal, wenn wir n Elemente verschieben und mit einer neuen Zeile abschließen (ASCII 10).

Sobald die Schleife beendet ist, müssen wir die Reihenfolge unserer Ausgabe umkehren, damit wir nur ein Standard-Umkehrkonstrukt verwenden.

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



2

Perl 6 , 38 Bytes

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

Erläuterung:

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

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

Da Variablen defekt sind, müsste ich Variablen durch Lambda-Anwendung übergeben.

Es stellt sich auch heraus, dass die Verwendung der Lambda-Anwendung kürzer wäre, selbst wenn die Variablen funktionieren würden.

Verwendung

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 Bytes

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

Versuch es! (Ideone)

Ich habe einen anderen Ansatz mit einer Funktion versucht, die das Ergebnis als String zurückgibt, aber nur den String deklarieren zu müssen und die return-Anweisung ist bereits teurer (byte-count-weise) als die print-Anweisung.

Muss Javas Ausführlichkeit lieben ... :)


Schöne Antwort +1. Sie können Golf spielen um 1 Byte durch die Verwendung i=0, i<kund s.substring(i*k,i++*k+k)statt i=-1, ++i<k, s.substring(i*k,i*k+k). Normalerweise verwenden wir nur Java 7statt Java 1.7, aber es ist gut, dass Sie es hinzugefügt haben, viele Leute vergessen dies.
Kevin Cruijssen

2

R , 59 54 Bytes

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

Probieren Sie es online!

Druckt mit einem nachgestellten Zeilenumbruch. Überraschend kurz, wenn man bedenkt, wie schlecht R mit Saiten umgeht.




Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.