Fendre la chaîne en n morceaux (ou morceaux de longueur n)


11

Le défi

Dans ce défi, vous devez effectuer deux tâches différentes (mais liées) en fonction de l'ordre de l'entrée.
Votre programme recevra une chaîne set un entier nen entrée et

  • divisé sen morceaux de longueur nsi svient en premier. Le dernier élément sera plus court si nécessaire.
  • diviser sen nmorceaux de longueur égale si nvient en premier. Si len(s)n'est pas un multiple, nles premiers len(s) mod néléments seront un de plus.

Vous ne pouvez prendre que ces 2 entrées. sne contiendra jamais que des chiffres.

Remarques

  • Vous pouvez utiliser le mappage inverse. Notez cela dans votre réponse si vous le faites.
  • sne contiendra que des caractères ASCII imprimables (pas de nouvelle ligne).
  • Vous ne pouvez pas utiliser de modules intégrés qui résolvent directement ces deux tâches. Tous les autres buildins sont autorisés.
  • Vous devez prendre les deux arguments de la même source.
  • Vous pouvez prendre les arguments dans une liste ordonnée ou tout autre format qui indique clairement leur ordre tant qu'il n'est pas ambigu.
  • Vous pouvez prendre l'entrée comme une chaîne / flux et utiliser un caractère qui n'est pas une entrée valide (comme un octet nul) pour les séparer.
  • nsera toujours égal ou inférieur à la longueur de set supérieur à zéro.
  • Vous pouvez sortir la liste résultante dans n'importe quel format résonnant tant qu'elle indique clairement les pièces particulières et leur ordre.

Exemple

Entrée: programming, 3
Le dernier élément ne contient que 2 caractères, car 11 n'est pas divisible par 3.
Sortie: ["pro", "gra", "mmi", "ng"]

Entrée: 3, programming
11 n'est pas un multiple de 3, donc les 2 premiers éléments seront un de plus:
Sortie: ["prog", "ramm", "ing"]

Règles

Cas de test

Les cas de test ont été générés avec ce programme Pyth (utilise des fonctions intégrées, donc aucune réponse valide). Merci à @FryAmTheEggman d'avoir fourni la version de base de cela!

3, helloworld -> [«enfer», «owo», «rld»]
helloworld, 3 -> ['hel', 'low', 'orl', 'd']
1, programmation -> ['programmation']
programmation, 1 -> ['p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g']
8, programmation -> ['pr', 'og', 'ra', 'm', 'm', 'i', 'n', 'g']
programmation, 8 -> ['programm', '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']

Codage heureux!


Vous ne pouvez pas utiliser de modules intégrés qui résolvent ces deux tâches. Cela inclut-il d'autres éléments intégrés, tels que tous les n-ièmes caractères d'une chaîne ou fractionnés à des occurrences ?
Dennis

@Dennis Ceci était juste destiné à exclure les buildins qui résolvent cela directement. Clarifiai-je.
Denker

Si notre langue ne prend pas en charge les tableaux, comment devrions-nous produire? Une nouvelle ligne entre chaque résultat de la chaîne serait-elle acceptable?
Conor O'Brien

De plus, pour les langues où l'entrée est un tableau de nombres ambigus, quelle devrait être la procédure?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ça ne peut pas arriver. s ne contiendra jamais que des chiffres . En outre , vous pouvez sortir la liste résultant en un format resonable aussi longtemps qu'il indique clairement les pièces particulières et leur ordre qui comprend la production multiligne bien sûr.
Denker

Réponses:


3

MATL, 46 26 21 27 29 42 octets

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

Essayez-le en ligne! (Mis à jour légèrement pour fonctionner avec la dernière version de la langue)

Explication

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

Quels sont ces non imprimables qui apparaissent à la fin de certains éléments de la liste? Ceux-ci ne font pas partie de l'entrée et ne devraient donc pas faire partie de la sortie non plus.
Denker

N'est-ce pas eun builtin interdit?
FliiFe

Peut-être remplacer XUZN?...par U?...et échanger les deux ifbranches. De plus, vous n'avez pas besoin du3$
Luis Mendo

@DenkerAffe Désolé à ce sujet. Devrait être corrigé maintenant.
Suever

@FliiFe Sur la base des commentaires du post initial, ene résout pas directement le problème, donc je ne le considère pas comme interdit, non.
Suever

4

JavaScript (ES6), 132 octets

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

C'est probablement désespérément sur-conçu.


Eh bien, ma solution (aujourd'hui décédée) était extrêmement sous-conçue. +1 pour vous
edc65

4

JavaScript (Firefox), 88 87 octets

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

Appelez-le comme (...)("programming")(3)avec Firefox 30+.


2

Rubis, 119 octets

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

Et je prends la première place par 2 octets ...


Les objets Regex dans Ruby peuvent avoir des valeurs injectées de la même manière que les chaînes, donc x.scan(/.{,#{y}})fonctionne tout aussi bien pour diviser les chaînes dans le premier cas. Ou cela compte-t-il comme une fonction intégrée?
Value Ink

2

AWK, 121 130 128 122 Octets

$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

Le seul problème est que si la première entrée est une chaîne qui commence par une valeur numérique. Cela entraînerait AWKà voir la chaîne comme ce numéro et la deuxième entrée comme la chaîne.

OK ... résolu le problème numérique, mais il a ajouté 9 octets :(.

Retravaillé un peu pour économiser quelques octets.

Presque de retour à la longueur d'origine. :)


OK, @DenkerAffe, l'a corrigé pour fonctionner en général et n'a ajouté (éventuellement) qu'un octet.
Robert Benson

1

Haskell, 131 octets

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

Exemple d'utilisation:

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

Comment ça marche: le travail principal est effectué par la fonction d'aide qqui prend une paire de chiffres (d,m)et une chaîne s. Il construit d'abord une liste de mfois d+1suivie par un nombre infini d(par exemple (1,3)-> [2,2,2,1,1,1,1,1,...]). Il utilise ensuite splitPlacespour se diviser sen morceaux de longueurs données par la liste. splitPlacess'arrête s'il smanque d'éléments, donc une liste infinie convient.

La fonction principale #vérifie quel paramètre est le nombre n/ chaîne stret appelle qavec (div (length str) n, mod (length str) n)ou (n, 0)plus str.


0

C # (LINQPAD) - 335 octets

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 partie lecture d'entrée a pris un peu de place. Gagnant de la réponse la plus longue.

Usage # 1:

$ 3, helloworld

>> hell, owo, rld

Usage # 2:

$ helloworld, 3

>>hel, low, orl, d

owo qu'est-ce que c'est?
Benjamin Urquhart

0

Pyth, 181 octets

Imaginons que le code le plus long en octets gagne \ 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

Essayez-le ici! (L'interprète en ligne semble avoir un bug, il affiche l'entrée alors qu'il ne devrait pas)

Voici la sortie du terminal:

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

Sérieusement, je suis ouvert à une nouvelle approche. Je suis nouveau sur python, donc j'ai probablement raté quelques raccourcis.

Je veux dire, je pense que ma réponse est désespérée du point qu'elle est plus longue que la réponse javascript ...


Pouvez-vous fournir un exemple d'entrée et de sortie?
Leaky Nun

Notez la solution officielle sous l'en-tête testcases. Les cas de test sont générés par Pyth. La solution est .xcsJKcJsK, où Jet Ksont les deux arguments.
Leaky Nun

@KennyLau J'ai ajouté un lien vers l'interpréteur pyth en ligne. Étrangement, il produit également l'entrée alors que je suis sûr que ce n'était pas le cas hier ... J'essaierai de corriger cela.
FliiFe

utiliser des espaces pour supprimer l'impression
Leaky Nun

@KennyLau espaces où?
FliiFe

0

PHP, 114 octets

[$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 chaîne ne doit pas commencer par des chiffres.
    (Remplacez +@$ppar is_numeric($p)pour corriger.)
  • La sortie ne doit pas contenir de bloc "0".
    (Insérer ~pour ASCII imprimable, a&pour tout ASCII avant $t;de corriger.)
  • Courez avec -nrou essayez-le en ligne .

0

PowerShell , 122 118 octets

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

Essayez-le en ligne!

Moins 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.