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 .


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




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


@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.


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


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

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 !.)




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



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

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

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

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!



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.




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

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

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

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