Dividi la stringa in n pezzi (o pezzi di lunghezza n)


11

La sfida

In questa sfida devi svolgere due attività diverse (ma correlate) a seconda dell'ordine dell'input.
Il tuo programma riceverà una stringa se un numero intero ncome input e will

  • dividere sin pezzi di lunghezza nse sviene prima. L'ultimo elemento sarà più corto se necessario.
  • dividere sin npezzi di uguale lunghezza se nviene prima. Se len(s)non è un multiplo dei nprimi len(s) mod nelementi sarà uno più lungo.

Puoi prendere solo quei 2 ingressi. snon conterrà mai solo cifre.

Appunti

  • È possibile utilizzare la mappatura inversa. Nota questo nella tua risposta se lo fai.
  • sconterrà solo caratteri ASCII stampabili (nessuna nuova riga).
  • Non è possibile utilizzare alcun builtin che risolva direttamente queste due attività. Sono ammessi tutti gli altri builtin.
  • Devi prendere entrambi gli argomenti dalla stessa fonte.
  • Puoi prendere gli argomenti in un elenco ordinato o in qualsiasi altro formato che indichi chiaramente il loro ordine purché non ambiguo.
  • Puoi prendere l'input come una stringa / stream e usare un carattere che non è un input valido (come un nullbyte) per separarli.
  • nsarà sempre uguale o inferiore alla lunghezza se maggiore di zero.
  • È possibile produrre l'elenco risultante in qualsiasi formato resonable purché indichi chiaramente i pezzi particolari e il loro ordine.

Esempio

Input: programming, 3
l'ultimo elemento contiene solo 2 caratteri, perché 11 non è divisibile per 3.
Output: ["pro", "gra", "mmi", "ng"]

Input: 3, programming
11 non è un multiplo di 3, quindi i primi 2 elementi saranno uno più lungo:
Output: ["prog", "ramm", "ing"]

Regole

Casi test

I casi di test sono stati generati con questo programma Pyth (usa i builtin, quindi nessuna risposta valida). Grazie a @FryAmTheEggman per averci fornito la versione base!

3, helloworld -> ['hell', 'owo', 'rld']
helloworld, 3 -> ['hel', 'low', 'orl', 'd']
1, programmazione -> ['programmazione']
programmazione, 1 -> ['p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g']
8, programmazione -> ['pr', 'og', 'ra', 'm', 'm', 'i', 'n', 'g']
programmazione, 8 -> ['programm', 'ing']
9, codice golf -> ['c', 'o', 'd', 'e', ​​'', 'g', 'o', 'l', 'f']
code golf, 9 -> ['code golf']
4, 133tspeak -> ['133', 'ts', 'pe', 'ak']
133tspeak, 4 -> ['133t', 'speak', 'k']

Buona programmazione!


Non è possibile utilizzare alcun builtin che risolva questi due compiti. Questo include altri built-in, come ottenere ogni n-esimo carattere da una stringa o dividere in occasione ?
— Dennis,

@Dennis Questo voleva solo escludere i builtin che lo risolvono direttamente. Ho chiarito.
— Denker,

Se la nostra lingua non supporta gli array, come dovremmo produrre? Sarebbe accettabile una nuova riga tra ogni risultato della stringa?
— Conor O'Brien,

Inoltre, per le lingue in cui l'input è una matrice di numeri ambigui, quale dovrebbe essere la procedura?
— Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Non può succedere. s non conterrà mai solo cifre . Inoltre è possibile produrre l'elenco risultante in qualsiasi formato resonable purché indichi chiaramente i pezzi particolari e il loro ordine che includa ovviamente l'output multilinea.
— Denker,

Risposte:


3

MATL, 46 26 21 27 29 42 byte

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

Provalo online! (Aggiornato leggermente per funzionare con l'ultima versione della lingua)

Spiegazione

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

Quali sono quegli non stampabili che appaiono alla fine di alcuni elementi dell'elenco? Quelli non fanno parte dell'input e pertanto non dovrebbero far parte neanche dell'output.
— Denker

Non è eun builtin proibito?
— FliiFe

Forse sostituire XUZN?...da U?...e scambiare i due iframi. Inoltre, non è necessario il3$
— Luis Mendo

@DenkerAffe Mi dispiace per quello. Ora dovrebbe essere risolto.
— Suever

@FliiFe Sulla base dei commenti sul post iniziale, enon risolve direttamente il problema, quindi non lo considero proibito, no.
— 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)

Questo è probabilmente eccessivamente ingegnerizzato.


Bene, la mia soluzione (ora deceduta) è stata gravemente poco ingegnerizzata. +1 per te
— 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])

Chiamalo come (...)("programming")(3)usando Firefox 30+.


2

Rubino, 119 byte

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

E prendo il primo posto di 2 byte ...


Gli oggetti Regex in Ruby possono avere valori iniettati nello stesso modo delle stringhe, quindi x.scan(/.{,#{y}})funziona altrettanto bene per dividere le stringhe nel primo caso. O conta come incorporato?
— Value Ink

2

AWK, 121 130 128 122 byte

$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

L'unico problema è se la prima voce è una stringa che inizia con un valore numerico. Ciò farebbe AWKvedere la stringa come quel numero e la seconda voce come stringa.

OK ... risolto il problema numerico, ma ha aggiunto 9 byte :(.

Rielaborato un po 'per salvare un paio di byte.

Quasi tornato alla lunghezza originale. :)


OK, @DenkerAffe, risolto per funzionare in generale e solo (eventualmente) aggiunto 1 byte.
— Robert Benson,

1

Haskell, 131 byte

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

Esempio di utilizzo:

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

Come funziona: il lavoro principale è svolto dalla funzione helper qche accetta una coppia di numeri (d,m)e una stringa s. Costruisce prima un elenco di mvolte d+1seguito da infiniti d(ad esempio (1,3)-> [2,2,2,1,1,1,1,1,...]). Quindi utilizza splitPlacesper dividere sin blocchi di lunghezze fornite dall'elenco. splitPlacessi interrompe se si sesauriscono gli elementi, quindi un elenco infinito va bene.

La funzione principale #controlla quale parametro è il numero n/ stringa stre chiama qcon uno (div (length str) n, mod (length str) n)o (n, 0)più str.


0

C # (LINQPAD) - 335 byte

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

La parte di lettura dell'input ha occupato un po 'di spazio. Vincitore della risposta più lunga.

Uso n. 1:

$ 3, helloworld

>> hell, owo, rld

Uso n. 2:

$ helloworld, 3

>>hel, low, orl, d

che cos'è questo?
— Benjamin Urquhart,

0

Pyth, 181 byte

Facciamo finta che il codice più lungo in byte vinca \ o /

DyGK@G0J:@G1"."1=YJV%lJKW<l@YN.EclJK=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

Provalo qui! (L'interprete online sembra avere un bug, mostra l'input mentre non dovrebbe)

Ecco l'output dal terminale:

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

Seriamente, sono aperto a un nuovo approccio. Sono nuovo di Python, quindi probabilmente mi sono perso alcuni shorthands.

Voglio dire, penso che la mia risposta sia disperata dal punto in cui è più lunga della risposta javascript ...


Potete fornire un input e un output di esempio?
— Leaky Nun

Nota la soluzione ufficiale sotto l'intestazione testcases. I testcase sono generati da Pyth. La soluzione è .xcsJKcJsK, dove Je Ksono i due argomenti.
— Leaky Nun

@KennyLau Ho aggiunto un link all'interprete pyth online. Stranamente, emette anche l'input mentre sono sicuro che non è successo ieri ... Proverà a risolverlo.
— FliiFe

usa gli spazi per sopprimere la stampa
— Leaky Nun

@KennyLau spazi dove?
— FliiFe

0

PHP, 114 byte

[$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),"
";
  • La stringa non dovrebbe iniziare con le cifre.
    (Sostituisci +@$pcon is_numeric($p)per risolvere.)
  • L'output non deve contenere un blocco "0".
    (Inserisci ~per ASCII stampabile, a&per qualsiasi ASCII prima $t;di risolvere.)
  • Corri con -nro provalo online .

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''

Provalo online!

Meno 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.