Teilen Sie die Zeichenfolge in n Teile (oder Teile der Länge n).

11

Die Herausforderung

Bei dieser Herausforderung müssen Sie je nach Reihenfolge der Eingabe zwei verschiedene (aber verwandte) Aufgaben ausführen.
Ihr Programm erhält eine Zeichenfolge sund eine Ganzzahl nals Eingabe und wird

  • sin Stücke der Länge teilen, nwenn szuerst kommt. Das letzte Element wird bei Bedarf kürzer.
  • sin nStücke gleicher Länge teilen, wenn nzuerst kommt. Wenn len(s)nicht, wird ein Vielfaches nder ersten len(s) mod nElemente länger sein.

Sie dürfen nur diese 2 Eingänge nehmen. swird niemals nur Ziffern enthalten.

Anmerkungen

  • Sie können die umgekehrte Zuordnung verwenden. Beachten Sie dies in Ihrer Antwort, wenn Sie dies tun.
  • senthält nur druckbare ASCII-Zeichen (keine Zeilenumbrüche).
  • Sie dürfen keine integrierten Funktionen verwenden, die diese beiden Aufgaben direkt lösen. Alle anderen Einbauten sind erlaubt.
  • Sie müssen beide Argumente aus derselben Quelle entnehmen.
  • Sie können die Argumente in einer geordneten Liste oder einem anderen Format verwenden, das ihre Reihenfolge eindeutig angibt, solange sie eindeutig ist.
  • Sie können die Eingabe als eine Zeichenfolge / einen Stream verwenden und ein Zeichen verwenden, das keine gültige Eingabe ist (z. B. ein Nullbyte), um sie zu trennen.
  • nwird immer gleich oder kleiner als die Länge von sund größer als Null sein.
  • Sie können die resultierende Liste in einem beliebigen Format ausgeben, sofern die einzelnen Teile und ihre Reihenfolge eindeutig angegeben sind.

Beispiel

Eingabe: programming, 3
Das letzte Element enthält nur 2 Zeichen, da 11 nicht durch 3 teilbar ist.
Ausgabe: ["pro", "gra", "mmi", "ng"]

Eingabe: 3, programming
11 ist kein Vielfaches von 3, daher sind die ersten 2 Elemente eins länger:
Ausgabe: ["prog", "ramm", "ing"]

Regeln

  • Funktion oder volles Programm erlaubt.
  • Standardregeln für die Eingabe / Ausgabe.
  • Es gelten Standardlücken .
  • Dies ist , also gewinnt die niedrigste Byte-Anzahl. Tiebreaker ist eine frühere Einreichung.

Testfälle

Die Testfälle wurden mit diesem Pyth-Programm generiert (verwendet integrierte Funktionen, daher keine gültige Antwort). Vielen Dank an @FryAmTheEggman für die Bereitstellung der Basisversion davon!

3, helloworld -> ['Hölle', 'owo', 'rld']
helloworld, 3 -> ['hel', 'low', 'orl', 'd']
1, Programmierung -> ['Programmierung']
Programmierung, 1 -> ['p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g']
8, Programmierung -> ['pr', 'og', 'ra', 'm', 'm', 'i', 'n', 'g']
Programmierung, 8 -> ['programmieren', 'ing']
9, Code Golf -> ['c', 'o', 'd', 'e', ​​'', 'g', 'o', 'l', 'f']
Code Golf, 9 -> ['Code Golf']
4, 133tspeak -> ['133', 'ts', 'pe', 'ak']
133tspeak, 4 -> ['133t', 'spea', 'k']

Viel Spaß beim Codieren!

Denker
quelle
Sie dürfen keine integrierten Funktionen verwenden, die diese beiden Aufgaben lösen. Enthält das auch andere integrierte Funktionen, z. B. das Abrufen jedes n-ten Zeichens aus einer Zeichenfolge oder das Aufteilen bei Vorkommen ?
Dennis
@ Tennis Dies sollte nur Buildins ausschließen, die dies direkt lösen. Ich habe klargestellt.
Denker
Wie sollen wir ausgeben, wenn unsere Sprache keine Arrays unterstützt? Wäre eine neue Zeile zwischen jedem Ergebnis der Zeichenfolge akzeptabel?
Conor O'Brien
Wie sollte die Vorgehensweise für Sprachen sein, in denen die Eingabe ein Array mehrdeutiger Zahlen ist?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Kann nicht passieren. s wird niemals nur Ziffern enthalten . Auch Sie können Ausgang die resultierende Liste in jedem vernünftigen Format, solange es klar die besonderen Stücke und deren Reihenfolge zeigt die mehrzeilige Ausgabe natürlich enthält.
Denker

Antworten:

3

MATL, 46 26 21 27 29 42 Bytes

jtU?jtbUe!tn2Gn>?0t(]tgbw(}ie]!2t$X{Oc''Zt

Probieren Sie es online aus! (Leicht aktualisiert, um mit der neuesten Version der Sprache zu arbeiten)

Erläuterung

j           % Explicitly grab the first input as a string
t           % Duplicate
U           % Attempt to convert it to a number
?           % If the conversion to a number was successful
    j       % Explicitly grab the second input as a string
    t       % Duplicate the value
    b       % Bubble-up the first element in the stack
    U       % Convert to a number from a string
    e       % Reshape the string into a nGroup x nPerGroup matrix
    !       % Take the transpose
    t       % Duplicate the result
    n       % Number of characters in the repmat result
    2Gn     % Number of characters in the string
    >?      % If chars in repmat > chars in string
        O   % Zero
        t   % Duplicate 
        (   % Assign the last element to a null character (bug in MATL)
    ]       % End if statement
    t       % Duplicate this matrix
    g       % Convert to a logical matrix
    b       % Bubble-up the original string
    w       % Flip the top two elements
    (       % Assign the non-empty characters to the chars from the input string
}           % Else the string comes first
    i       % Explicitly grab the second input (the number)
    e       % Reshape the characters into an nPerGroup x nGroup 2D array
]           % End of if statement
!           % Take the transpose so it reads left-to-right
2           % Number literal
t           % Duplicate
$X{         % Call num2cell to convert to a cell array
Oc          % Null character
''          % Empty string
Zt          % Replace null chars with empty strings
            % Implicit display of stack contents
Suever
quelle
Was sind diese nicht druckbaren Dateien, die am Ende einiger Listenelemente erscheinen? Diese sind nicht Teil der Eingabe und sollten daher auch nicht Teil der Ausgabe sein.
Denker
Ist eein verbotenes eingebautes nicht?
FliiFe
Ersetzen Vielleicht XUZN?...durch U?...und tauschen die beiden ifZweige. Auch brauchen Sie nicht die3$
Luis Mendo
@DenkerAffe Entschuldigung. Sollte jetzt behoben sein.
Suever
@FliiFe Basierend auf den Kommentaren zum ersten Beitrag, elöst das Problem nicht direkt, daher halte ich es nicht für verboten, nein.
Suever
4

JavaScript (ES6), 132 Byte

(s,t)=>+t?[...Array(-~(~-s.length/+t))].map((_,i)=>s.substr(i*t,t)):[...Array(s=+s)].map(_=>t.slice(p,p-=~((t.length-p-1)/s--)),p=0)

Dies ist wahrscheinlich hoffnungslos überarbeitet.

Neil
quelle
Nun, meine (inzwischen verstorbene) Lösung war stark unterentwickelt. +1 für Sie
edc65
4

JavaScript (Firefox), 88 87 Byte

a=>b=>(s=+b?a:b,i=x=0,l=s.length,[for(c of s)if(r=s.slice(x,x+=+b||l/a+(i++<l%a)|0))r])

Nennen Sie es wie (...)("programming")(3)Firefox 30+.

user81655
quelle
2

Ruby, 119 Bytes

->x,y{r=[t=0];x.to_s==x ?(r.push x[t...t+=y]while x[t]):x.times{r.push y[t...t+=y.size/x+(r[y.size%x]? 0:1)]};r[1..-1]}

Und ich nehme den ersten Platz mit 2 Bytes ein ...

MegaTom
quelle
In Regex-Objekte in Ruby können Werte wie in Zeichenfolgen eingefügt werden. Dies x.scan(/.{,#{y}})funktioniert im ersten Fall genauso gut zum Teilen der Zeichenfolgen. Oder zählt das als eingebaut?
Wert Tinte
2

AWK, 121 130 128 122 Bytes

$1~/^[0-9]+$/{s=1}{a=$(s+1)
b=s?$1:$2
$0=""
for(j=-b;j<=c=length(a);)$0=$0 substr(a,j+=b+s,b+(s=s&&j<c%b*(b+1)?1:0))" "}1

Das einzige Problem ist, wenn der erste Eintrag eine Zeichenfolge ist, die mit einem numerischen Wert beginnt. Dies würde dazu führen AWK, dass die Zeichenfolge als diese Nummer und der zweite Eintrag als Zeichenfolge angezeigt wird.

OK ... das numerische Problem wurde behoben, aber es wurden 9 Bytes hinzugefügt :(.

Ein bisschen überarbeitet, um ein paar Bytes zu sparen.

Fast wieder auf die ursprüngliche Länge. :) :)

Robert Benson
quelle
OK, @DenkerAffe, hat das Problem behoben und nur (eventuell) 1 Byte hinzugefügt.
Robert Benson
1

Haskell, 131 Bytes

import Data.Lists
q(d,m)=splitPlaces$(d+1<$[1..m])++[d,d..]
a#b|all(`elem`['0'..'9'])a=q(divMod(length b)$read a)b|1<2=q(read b,0)a

Anwendungsbeispiel:

*Main> "8" # "programming"
["pr","og","ra","m","m","i","n","g"]
*Main> "programming" # "8"
["programm","ing"]

So funktioniert es: Die Hauptarbeit erledigt die Hilfsfunktion, qdie ein Zahlenpaar (d,m)und eine Zeichenfolge benötigt s. Zuerst wird eine Liste von mZeiten erstellt, d+1gefolgt von unendlich vielen d(z . B. (1,3)-> [2,2,2,1,1,1,1,1,...]). Anschließend werden die splitPlacesin sder Liste angegebenen Längenabschnitte aufgeteilt. splitPlacesstoppt, wenn skeine Elemente mehr vorhanden sind, sodass eine unendliche Liste in Ordnung ist.

Die Hauptfunktion #prüft, welcher Parameter die Nummer n/ Zeichenfolge ist strund ruft qentweder (div (length str) n, mod (length str) n)oder (n, 0)plus auf str.

Nimi
quelle
0

C # (LINQPAD) - 335 Bytes

var y=Util.ReadLine().Split(',');int x,j=0;var t=int.TryParse(y[0].Trim(),out x);x=x==0?int.Parse(y[1].Trim()):x;var i=t?y[1].Trim():y[0];var z="";if(!t){while(i.Substring(j).Length>x){z+=i.Substring(j).Length>x?i.Substring(j,x)+", ":"";j+=x;}z+=i.Substring(j);}else z=string.Join(", ",i.Split(x).Select(s=>string.Concat(s)));z.Dump();

Der Eingabe-Leseteil nahm etwas Platz ein. Gewinner der längsten Antwort.

Verwendungszweck 1:

$ 3, helloworld

>> hell, owo, rld

Verwendung Nr. 2:

$ helloworld, 3

>>hel, low, orl, d
jzm
quelle
owo was ist das?
Benjamin Urquhart
0

Pyth, 181 Bytes

Stellen wir uns vor, der längste Code in Bytes gewinnt \ o /

DyGK@G0J:@G1"."1=YJV%lJKW<[email protected]=YXYN+@YN@YhN=Y.DYhN)FNr%lJK/-lJ%lJK/-lJ%lJKKW<l@YNsclJK=YXYN+@YN@YhN=Y.DYhN))RY)DPG=K@G1=J:@G0"."1=YJV/lJKW<l@YNK=YXYN+@YN@YhN=Y.DYhN))RY).xyQPQ

Probieren Sie es hier aus! (Der Online-Interpreter scheint einen Fehler zu haben, er zeigt die Eingabe an, während dies nicht der Fall sein sollte.)

Hier ist die Ausgabe vom Terminal:

» pyth split.pyth <<<'["helloworld", 3]' 
['hel', 'low', 'orl', 'd']
» pyth split.pyth <<<'[3, "Helloworld"]'
['Hell', 'owo', 'rld']

Im Ernst, ich bin offen für neue Ansätze. Ich bin neu in Python, daher habe ich wahrscheinlich ein paar Abkürzungen verpasst.

Ich meine, ich denke, meine Antwort ist verzweifelt, da sie länger ist als die Javascript-Antwort ...

FliiFe
quelle
Können Sie eine Beispielein- und -ausgabe bereitstellen?
Undichte Nonne
Beachten Sie die offizielle Lösung unter der Überschrift testcases. Die Testfälle werden von Pyth generiert. Die Lösung ist .xcsJKcJsK, wo Jund Ksind die beiden Argumente.
Undichte Nonne
@KennyLau Ich habe einen Link zum Online-Python-Interpreter hinzugefügt. Seltsamerweise gibt es auch die Eingabe aus, obwohl ich mir sicher bin, dass es nicht gestern war ... Ich werde versuchen, das zu beheben.
FliiFe
Verwenden Sie Leerzeichen, um das Drucken zu unterdrücken
Leaky Nun
@ KennyLau Räume wo?
FliiFe
0

PHP, 114 Bytes

[$t,$n,$p]=$argv;for(@+$p?$s=$n:$f=$n*($p=strlen($s=$p)/$n)%$n;$t;)echo$t=substr($s,$a+=$e,$e=$p+($i++<$f)|0),"
";
  • Die Zeichenfolge sollte nicht mit Ziffern beginnen.
    (Ersetzen +@$pmit is_numeric($p)zu beheben.)
  • Die Ausgabe sollte keinen Block "0" enthalten.
    ( ~Für druckbares ASCII einfügen, a&für jedes ASCII vor $t;dem Fixieren.)
  • Laufen Sie mit -nroder versuchen Sie es online .
Titus
quelle
0

PowerShell , 122 118 Byte

param($a,$b)if($a-is[int]){$a,$b=$b,((($l=$b|% Le*)-($c=$l%$a))/$a)}$a-split("(..{$b})"*$c+"(.{0,$b})"*$a.Length)-ne''

Probieren Sie es online aus!

Weniger Golf:

param($a,$b)
if($a-is[int]){
    $length=$b|% Length
    $c=$length%$a
    $a,$b=$b,(($length-$c)/$a)  # recalc length and swap
}
$pattern="(..{$b})"*$c+"(.{0,$b})"*$a.Length
$parts=$a -split $pattern       # pattern like '(..{3})(..{3})(.{0,3})(.{0,3})(.{0,3})'
$parts -ne ''                   # output not empty parts
mazzy
quelle