Divisé en trois!

16

Étant donné une chaîne, vous devez la diviser en groupes de trois caractères (en complétant _à la fin).

Lié , mais c'est toujours différent.


Exemple d'E / S:

  • 'abcde' -> 'abc', 'de_'

  • '1234' -> '123', '4__'

  • '' -> [] or falsey value

  • 'Three spree!' -> 'Thr', 'ee ', 'spr', 'ee!'

  • Chaîne de 6 Mo

Il s'agit d'un , donc le moins d'octets gagnera!

Edit: Enfin, la sortie n'est pas restreinte .

Rahul Verma
la source
10
Pourquoi cas spécial la chaîne vide? Pouvons-nous choisir le caractère à utiliser pour le rembourrage?
Shaggy
12
Donc, la tâche est en fait: étant donné une chaîne, renvoyer une valeur de falsey si elle est vide, sinon la diviser en groupes de trois, en ajoutant des soulignements si nécessaire ? Cela ressemble à une paire étrange de deux tâches indépendantes (vérification de la longueur de la chaîne et fractionnement).
Adám
15
Choses à éviter: Cas de bord exceptionnels . Dans ce cas, une chaîne vide doit renvoyer un tableau vide ou équivalent, pas une valeur de falsey
Jo King
6
Beaucoup de langages typés statiquement ne peuvent pas renvoyer plus d'un type à partir d'une fonction
Incarnation de l'ignorance
4
@manassehkatz Oui, mais uniquement dans ces langues. Dans certaines langues, cela rend les solutions beaucoup plus compliquées, voire impossibles (par exemple, les langues typées statiquement).
Jo King

Réponses:

8

Python 3, 58 47 34 octets

Je suis sûr que quelqu'un d'autre peut faire mieux. Quelqu'un d'autre a fait mieux. Merci Jo roi pour -11 -24 octets!

La sortie est illimitée, bienvenue dans l'enfer des tuples. Retourne une liste vide ( fausse ) sur une entrée vide

lambda x:[*zip(*[iter(x+"__")]*3)]

TIO

Benjamin Urquhart
la source
5

Perl 5 , 16 15 octets

"@_\__"=~/.../g

Essayez-le en ligne!

Kjetil S.
la source
1
15 avec "@_\__"=~/.../g. Il y avait d'autres 16: (pop.__)=~/.../gou map/.../g,pop.__.
Grimmy
1
Merci à @Grimy pour obtenir des conseils sur \. Il a rasé 1 octet et j'ai appris quelque chose de nouveau.
Kjetil S.20
4

APL + WIN 36 24 22 octets

12 octets enregistrés en raison de la sortie maintenant restreinte et de l'utilisation du code dans le premier commentaire de @ Adám modifié pour fonctionner dans APL + WIN et 2 autres avec son deuxième commentaire. Merci.

(⌈(↑⍴s)÷3)3⍴(s←⎕),'__'

Invite à entrer la chaîne et affiche le résultat sous forme de tableau nx3

Essayez-le en ligne! Gracieuseté de Dyalog Classic

Graham
la source
@Adam. Lance une erreur de domaine dans APL + WIN à droite ⍴
Graham
Échoue '', non? Je pense que OP (pour une raison étrange) exige que le résultat soit 0(avec n'importe quel rang).
Adám
1
@ Adám Il produit un tableau 0 x 3. L'OP semble maintenant vouloir "falsey" pour une entrée nulle. Avec les spécifications en constante évolution, je vais me retirer à ce stade et laisser ma réponse inchangée! Merci pour vos améliorations.
Graham
3

Perl 6 , 19 octets

{$_~"__"~~m:g/.../}

Essayez-le en ligne!

Remplit la chaîne de deux traits de soulignement, puis divise la chaîne en morceaux de trois caractères. Renvoie un tableau d'objets Match.

Jo King
la source
3

Japt , 8 octets

+1 octet dans le cas spécial de la chaîne vide. Peut sauver 2 si nous pouvons choisir notre caractère de remplissage.

©ò3 ú'_3

Essayez-le

©ò3 ú'_3     :Implicit input of string
©            :Logical AND with
 ò3          :Split into chunks of 3
    ú'_3     :Right pad each with "_" to length 3
Hirsute
la source
2

CJam , 11 octets

q'_3*+3/);p

Essayez-le en ligne!

Pour une entrée vide, cela donne une chaîne vide, ce qui est faux.

Comment ça fonctionne

q     e# Read input as a string
'_    e# Push char '_'
3*    e# String formed by that char repeated 3 times
+     e# Concatenate to input string
3/    e# Split in groups of 3, the last of which may be shorter. Gives array of strings
);    e# Detach last string from the array and delete it
p     e# Print string representation of the array
Luis Mendo
la source
2

Retina 0.8.2 , 10 octets

$
__
!`...

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

$
__

Ajoutez deux _s, au cas où le dernier groupe doit être rembourré.

!`...

Faites correspondre autant de groupes de trois que possible, produisant les correspondances elles-mêmes plutôt que le nombre. (Dans Retina 1, ce serait Lau lieu de !.)

Neil
la source
2

C (gcc) , 67 octets

i;f(char*_){for(;*_;puts(""))for(i=3;i--;)putchar(*_?*_++:95);_=0;}

Essayez-le en ligne!

Renvoie toujours une valeur de falsey (0).

attinat
la source
1
Avez-vous même besoin de retourner quoi que ce soit?
plafond
63 octets
Johan du Toit
2

Wolfram Language (Mathematica) , 28 21 octets

-7: Ne nécessite plus de Falsevaleur falsy ( ) sur une entrée vide

Partition[#,3,1,1,_]&

Essayez-le en ligne!

Prend une liste de caractères en entrée. Renvoie une liste de 3 tuples de caractères remplis de Blanks ( _).


34 27 octets

StringPartition[#<>"__",3]&

Essayez-le en ligne!

Entrée de chaîne, liste de sortie de chaînes

attinat
la source
1

Gelée , 9 octets

s3o€“___”

Un lien monadique acceptant une liste de caractères qui donne une liste de listes de caractères (une entrée vide donne une sortie vide).

Essayez-le en ligne!

Comment?

s3o€“___” - Link: list of characters
s3        - split into chunks of three
   €      - for each chunk:
  o       -   OR (vectorises):
    “___” -     list of characters = ['_', '_', '_']

Remarques:
Le n'est nécessaire que pour gérer le cas de bord d'une entrée vide.
Un programme complet peut supprimer une fin , mais ici nous ne pouvons pas le faire car le comportement d'impression d'un programme complet écrase tout ensemble.


Équivalent 9:

o3ÐƤ“___”

Essayez-le


Alternative 9:

;“___”s3Ṗ

Essayez-le

Jonathan Allan
la source
1

Java 10, 116 113 octets

s->{s+="__";int l=s.length()/3,i=l;var r=new String[l];for(;i-->0;)r[i]=s.substring(i*3,i*3+3);return l<1?0>1:r;}

Essayez-le en ligne.

Ou 104 101 octets si un tableau vide au lieu de falseest autorisé en sortie.

s->{s+="__";int l=s.length()/3;var r=new String[l];for(;l-->0;)r[l]=s.substring(l*3,l*3+3);return r;}

Essayez-le en ligne.

Explication:

s->{                             // Method with String as both parameter and return-type
  s+="__";                       //  Append two "_" to the input-String
  int l=s.length()/3;            //  Get the length, integer-divided by 3
  var r=new String[l];           //  Create a string-array with that many parts
  for(;l-->0;)                   //  Loop `l` in the range (l, 0]:
    r[l]=                        //   Set the `l`'th value of the array to:
         s.substring(l*3,l*3+3); //   Get the substring of size 3 from index `l*3` from `s`
  return r;}                     //  Return the array
Kevin Cruijssen
la source
Un tableau vide est maintenant autorisé
Benjamin Urquhart
1

Rubis, 73 42 octets

a=gets
a.length!=0?a.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}:'falsey value'

Edit: comme la valeur de falsey ne semble pas nécessaire:

gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}
Max Langerak
la source
1
Le remplissage maximal est de 2 caractères, ce '_'*2serait donc suffisant, pour lequel un littéral '__'est plus court. Mais si vous ajoutez le rembourrage à l' avance, tout simplement pas correspondre les pièces de moins de 3 caractères, est plus courte: puts"#{gets}__".scan /.../. (Notez que sans l'impression explicite qui n'est irbpas considérée ruby.)
Manatwork
1

C # (compilateur interactif Visual C #) , 74 octets

Ajoutez simplement deux traits de soulignement «_» à la fin de l'entrée pour vous assurer qu'ils sont imprimés si la longueur de l'entrée n'est pas un facteur de 3.

s=>Enumerable.Range(0,(s.Length+2)/3).Select(i=>(s+"__").Substring(i*3,3))

Essayez-le en ligne!

Innat3
la source
67
dana
57
mon pronom est monicareinstate
1

C (gcc) , 55 octets

i;f(char*s){for(;i%4|*s;)putchar(++i%4?*s?*s++:95:10);}

Essayez-le en ligne!

l4m2
la source
Utiliser 9 ( \t) au lieu de 10 ( \n) devrait être bien, mais ce n'est pas le point principal
l4m2
1

C (clang) , 128 126 94 67 octets

67 octets grâce à @ceilingcat

f(char*k){for(;*k;k++)printf("%c%c%c\n",*k,*++k?*k:95,*++k?*k:95);}

Essayez-le en ligne!

une arachnide de pierre
la source
1

Frapper , 90 octets

Cela utilise les fonctionnalités de Bash plutôt qu'une combinaison de commandes Bourne shell plus * nix plus traditionnelles (dont une version que j'ai créée s'est retrouvée à 205 octets). J'ai triché en utilisant l'esquive d'ajouter deux caractères _ à la chaîne.

c=;read a;a=${a}__;while (($(echo ${#a})>2));do b=${a:0:3};c=$c\ $b;a=${a#$b};done;echo $c

Essayez-le en ligne!

PJF
la source
1

GNU sed , 27 octets

s:$:__:
s:...:& :g
s: _*$::

Essayez-le en ligne!

Cela devient un peu délicat en ce qui concerne l'entrée de chaîne vide, car sed n'a aucune signification d'une valeur falsifiée. Donc pour y faire face, je vous propose deux interprétations possibles des règles pour valider ma soumission:


A. Vous ne fournissez essentiellement rien en entrée, pas même une nouvelle ligne de fin (comme c'est le cas avec tous les exemples, y compris ce fichier de 6 Mo).

Usage:

echo -n ""|sed -f script

Sortie: rien n'est imprimé, car sed n'exécute même pas le script sans entrée.


B. On pourrait considérer comme valeur fausse pour sed une chaîne unique, c'est-à-dire renvoyée uniquement lorsque l'entrée est une chaîne vide.

Usage:

echo ""|sed -f script

Production:

__

Je préfère beaucoup plus la première interprétation, car je pense qu'elle est la plus proche de la règle prévue, mais la dernière aide si vous exécutez le script en utilisant ce lien TIO.

seshoumara
la source
0

Attaché , 34 23 octets

PadRight&"_"&3=>@Chop&3

Essayez-le en ligne!

Explication (obsolète)

{On[#_-1,PadRight&"_"&3,_]}@Chop&3
                           @Chop&3    chop the input string into groups of 3s
{On[#_-1               ,_]}           on the last group
        ,PadRight                         pad it
                     &3                   to length three
                 &"_"                     with underscores
Conor O'Brien
la source
Souhaitez-vous enregistrer quelque chose en remplissant tous les éléments au lieu du seul dernier?
Shaggy
@Shaggy Bon point! Je vais m'en
Conor O'Brien
0

Fusain , 10 octets

E⪪S³…⁺ι__³

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

  S         Input string
 ⪪ ³        Split into groups of up to 3 characters
E           Map over each group
      ι     Current group
     ⁺      Concatenated with
       __   Literal `__`
    …    ³  Moulded to length 3
            Each group implicitly printed on its own line
Neil
la source
0

Scala , 31 octets

(s+"___").grouped(3).toSeq.init

Essayez-le en ligne!

Explication

(s+"___")       // add "___"
  .grouped(3)   // make groups of 3
  .toSeq        // change to Seq
  .init         // take all but last
pme
la source
0

Befunge-93 , 30 29 octets

~:1+%,~:1+!"`"*+,~:1+!"`"*+,,

Essayez-le en ligne!

Outputs nothing for an empty input, otherwise outputs strings of length 3 separated by NUL characters.

Explanation:

~                               Push character of input to stack
 :1+                            Duplicate input and add 1
    %                           Modulo top 2 values of stack and push result
                                If input was -1 (end of stream), calculate -1%0 -> halt
                                Otherwise calculate input%(input+1) -> input
     ,                          Pop and output character
      ~                         Push character of input to stack
       :1+!                     Duplicate input, add 1 and perform logical NOT
           "`"*                 Multiply by 96 (ASCII code for '`')
                                This returns 96 or 0 depending on the result of the NOT
               +                Add the top 2 values from the stack and push the result
                                Si l'entrée était -1 (fin de flux), pousse -1 + 96 = 95 ou le code ASCII pour '_'
                                Sinon, pousse l'entrée + 0
                , Pop et caractère de sortie
                 ~: 1 +! "` "* +, Même bloc à nouveau pour gérer le troisième caractère
                            , Génère un caractère NUL (la pile est vide, donc le fait de sortir de la pile renvoie simplement 0)

Le pointeur d'instruction s'enroule à la fin, bouclant toute la ligne.
sept négatif
la source