Renvoie chaque numéro d'un groupe de nombres


11

Le défi

Le programme doit renvoyer tous les nombres inclus dans un groupe (séquence séparée par des virgules et des tirets) de nombres.

Règles

  • s est la chaîne de séquence;
  • tous les nombres inclus dans ssont positifs ;
  • les nombres augmenteront toujours ;
  • les chiffres ne se répéteront jamais
  • lorsque vous répondez, affichez la sortie de s="1,3-5,9,16,18-23"

Exemples

input(s)    outputs
-----------------
1           1
1,2         1,2
1-4         1,2,3,4
1-4,6       1,2,3,4,6
1-4,8-11    1,2,3,4,8,9,10,11

Bonne chance. =)


1
Aurons-nous jamais des séquences d'entrée qui n'augmentent pas constamment, par exemple: 4-9,1-2ou 1-3,9-6?
Matt

1
Ou qui se chevauchent? La sortie doit-elle être triée et ne doit pas contenir de doublons?
Peter Taylor

@Gareth Oui, c'est un code-golf, alors votez pour la réponse la plus courte. Matt et Peter, j'ai édité la question, veuillez la vérifier. Merci!
BernaMariano

Doit-il s'agir d'un programme complet et y a-t-il une restriction sur le format de la sortie?
Brad Gilbert b2gills

Réponses:


6

GolfScript (24 caractères)

','/{~.,!{~)),>~}*}%','*

Par exemple

$ golfscript.rb expand.gs <<<"1,3-5,9,16,18-23"
1,3,4,5,9,16,18,19,20,21,22,23

J'ai en fait quatre solutions de 24 caractères, mais j'ai choisi celle-ci car elle n'a pas de caractères alphanumériques.

Comment ça fonctionne

# On the stack: a string such as "1,3-5,9,16,18-23"
','/
# Split on commas to get ["1" "3-5" "9" "16" "18-23"]
{
    # This is executed for each of those strings in a map
    # So stack holds e.g. "1" or "3-5"

    # Evaluate the string.
    # If it's a single number, this puts the number on the stack.
    # Otherwise it's parsed as a positive number followed by a negative number.
    ~
    # Stack holds e.g. 1 or 3 -5
    # Duplicate the last element on the stack and make a list of that length.
    # If it's negative or zero, the list will be empty
    .,
    # Negate. An empty list => 1; a non-empty list => 0
    !
    # If the string was a single number "n", the stack now holds n 0
    # If the string was a range "m-n", the stack now holds m -n 1
    # The following block will be executed 0 times for "n" and once for "m-n"
    {
        # Here we rely on twos-complement numbers satisfying ~n = -n -1
        # Stack: m -n
        ~))
        # Stack: m -(-n)-1+2  =  m n+1
        ,
        # Stack: m [0 1 2 ... n]
        >
        # Stack: [m m+1 ... n]
        ~
        # Stack: m m+1 ... n
    }*
}%
# On the stack: e.g. [1 3 4 5 9 16 18 19 20 21 22 23]
','*
# Joined by , to give the desired output

Comment pouvez-vous développer 3-5 en 3,4,5 sans utiliser un seul personnage -?
BernaMariano

@BernaMariano, désolé, j'ai en quelque sorte raté votre question. Je vais développer la réponse avec une explication détaillée.
Peter Taylor

7

Perl 25 26 25

$_ est la chaîne de séquence

s/-/../g;$_=join",",eval

Exemple de session:

[~/] $ perl -M5.010 -pe 's/-/../g;$_=join",",eval' <<< "1,3-5,9,16,18-23"
1,3,4,5,9,16,18,19,20,21,22,23

Ajout d'un caractère au nombre de caractères pour l' option (merci Gareth, ..kinda).-n-p


J'ai probablement mal fait le comptage des caractères (avec les options de ligne de commande). N'hésitez pas à corriger mon décompte, s'il vous plaît
ardnew

En passant par la réponse à cette question sur la méta , il vous suffit d'ajouter 1 caractère pour l' noption.
Gareth

Retirer -M5.010et échanger -epour-E
Brad Gilbert b2gills

4

golfscript, 46 45

Mon tout premier programme de script de golf a pris des heures.

{','/{'-'/{~}%.,1-{))+{,}/\-~}{~}if}%","*}:r; 

# call:
"1,3-5,9,16,18-23"r

# return:
1,3,4,5,9,16,18,19,20,21,22,23

Vous pouvez l'essayer sur http://golfscript.apphb.com/

Mon meilleur coup pour expliquer cette atrocité:

{...}:r;     # makes a function block ... and names it r

','/         # slices the top element of stack from each ','
             # so we get ["1" "3-5" "9" "16" "18-23"]

{...}%       # makes a function block ... and calls it for 
             # each element in the list

'-'/{~}%     # slices the list by '-' and evals each element 
             # from string to int. ["1"] becomes [1], 
             # ["3-5"] becomes [3 5]

.,1-         # adds the length of the list -1 on top of the stack
             # so for [1] the stack becomes [1] 0, for [3 5]
             # it becomes [3 5] 1

# next we add two function blocks, they, like the 0/1 just before
# are used by an if clause a tiny bit later. First block is for 
# lists that have a 1 on top of them, the latter for ones with 0.

# First block, we have something like [3 5]

))+          # pops the top element of the array, increments 
             # it and puts back. [3 6]

## It seems {...}%~ is same as {...}/
## this is why these two are not in the code any more

{,}%         # , makes a list from 0 to n-1, where n is the parameter
             # so we get [[0 1 2] [0 1 2 3 4 5]]

~            # Dumps the outer array, [0 1 2] [0 1 2 3 4 5]

\            # swaps the two arrays

-            # set complement [3 4 5]

~            # dumps the array, so the elements are left in the stack

# Second block, we have something like [16]

~            # just dumps the array, 16

# Blocks end

if           # takes the top three elements of the stack, evaluates the 
             # first (0 or 1), runs second if true (anything but 
             # [], "", 0 or {} ), otherwise the third.

","*         # joins an array with ","

modifier 1: changé le dernier {}% ~ en {} /, ma description était également probablement fausse.


2
+1, car quiconque fait un programme dans GolfScript l'a gagné.
Gareth

@Gareth Merci. J'ai d'abord pensé que je le ferais de la manière perl: changer - en .. et l'évaluer. Ensuite, je n'ai trouvé aucun moyen sain de construire des tableaux, alors j'ai fait cela. Je suis sûr que quelqu'un proposera une solution de ~ 20 caractères avec golfscript.
shiona

J'en ai 24 pour le moment, donc je vais prendre 20 comme défi;) Vous pouvez en enregistrer quelques-uns assez facilement, cependant. Le problème demande un programme, pas une fonction, vous pouvez donc perdre l'initiale {et la finale }:r;et vous pouvez également en enregistrer une en la remplaçant 1-par (. (Soit dit en passant, l'IIRC est une astuce que j'ai également ratée dans mon premier programme GolfScript)
Peter Taylor

PS Il y a une différence subtile entre {...}%~et {...}/. Si vous accédez à quelque chose plus bas dans la pile en utilisant integer $la première, c'est plus simple, car vous n'avez pas à ajuster l'entier à chaque fois pour compenser tout ce que vous laissez sur la pile.
Peter Taylor

4

R , 44 octets

`-`=seq;eval(parse(t=c("c(",scan(,""),")")))

Essayez-le en ligne!

Redéfinissez -pour signifier seq(c.-à-d. :), Entourez l'entrée c()et évaluez l'expression correspondante.


3

K, 47

","/:,/${x+!1+y-x}.'2#'a,'a:"I"$'"-"\:'","\:0:0

Cas de test

k)","/:,/${x+!1+y-x}.'2#'a,'a:"I"$'"-"\:'","\:0:0
1,3-5,9,16,18-23
"1,3,4,5,9,16,18,19,20,21,22,23"

","/:$,/{{x+!1+y-x}. 2#"J"$"-"\:x}'","\:0:0pour 43 octets
streetster

3

Gelée , 9 octets

⁾-ryṣ”,VF

Essayez-le en ligne!

   y         Replace
⁾-r          hyphens with the letter r,
    ṣ”,      split on commas,
       V     evaluate every element,
        F    and flatten.

La dyade de plage rprend deux arguments de chaque côté et produit une plage inclusive entre eux.


2

J, 53 43 41 39 38 caractères

;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1

Prend l'entrée du clavier:

   ;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1
1-4,8-11
1 2 3 4 8 9 10 11

Sortie pour le cas de test demandé:

   ;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1
1,3-5,9,16,18-23
1 3 4 5 9 16 18 19 20 21 22 23

2

Hassium , 173 octets

Ce fut assez long et peut-être pas en compétition car il y a une fuite, à la fin.

 func main(){p="1,2,3,5-8".split(",")for(c=0;c<p.length;c++){e=p[c]if(e.contains("-")){p=e.split("-")for(x=p[0].toInt();x<=p[1].toInt()print(x++ +",")){}}else print(e+",")}}

Exécuter en ligne et voir développé ici



1

Python 2.7, 147 138 octets

z, f = input (). split (','), []
pour i in z:
 x = i.split ('-')
 si len (x)> 1: f + = plage (int (x [0]), int (x [1]) + 1)
 sinon: f + = [int (x [0])]
imprimer str (f) [1: -1]

Usage:

>>> python nums.py
"1,3-5,9,16,18-23"
1, 3, 4, 5, 9, 16, 18, 19, 20, 21, 22, 23

Pas le meilleur programme ...


1
Bienvenue chez PPCG. Je pense que vous pouvez raccourcir votre réponse en utilisant 1 espace pour les retraits.
intrepidcoder

Merci @intrepidcoder, je ne savais pas que vous pouviez utiliser des retraits simples.
Alex

1

MATLAB, 47 octets

disp(eval(['[',strrep(input(''),'-',':'),']']))

Cet extrait de code lit une entrée de chaîne à partir de la fenêtre de commande, remplace '-' par ':', ajoute des crochets à la chaîne, puis l'évalue, de sorte que l'entrée sera étendue à un tableau complet de nombres.

Exemple d'entrée:

'1,3-5,9,16,18-23'

Exemple de sortie:

1     3     4     5     9    16    18    19    20    21    22    23

Je crois que cette sortie est autorisée, car le défi dit seulement que tous les numéros d'un groupe doivent être affichés.


une sortie séparée par des virgules serait plus agréable, bien que je puisse voir un motif séparé de 5 espaces , c'est cool pour moi :)
BernaMariano


1

PowerShell, 79 71 octets

('('+($args[0]-replace'-','..'-replace',','),(')+')'|iex|%{$_})-join','

Essayez-le en ligne!

La partie interne change "1,5-9,12" en un format "(1), (5..9), (12)" que PowerShell comprend, puis l'exécute avec iex, ce qui crée un tableau de tableaux. Ensuite, parcourez chaque tableau interne, puis enfin réunissez tous les éléments du tableau externe ensemble

Code d'emprunt de ma réponse «Aidez-moi à gérer mon temps»

Usage

PS C:\Tools\Scripts\golfing> .\return-each-number-from-a-group-of-numbers.ps1 '1,3-5,9,16,18-23'
1,3,4,5,9,16,18,19,20,21,22,23

-8 octets grâce à Veskah



1

K (oK) , 40 31 octets

Solution

,/{{x+!1+y-x}. 2#.:'"-"\x}'","\

Essayez-le en ligne!

Explication:

Géré plus de golf tout en ajoutant l'explication ...

,/{{x+!1+y-x}. 2#.:'"-"\x}'","\ / the solution
                           ","\ / split input on ","
  {                      }'     / apply lambda to each
                    "-"\x       / split x on "-"
                 .:'            / value (.:) each (')
               2#               / 2 take (dupe if only 1 element)
   {        }.                  / diadic lambda, 2 args x and y
         y-x                    / y subtract x
       1+                       / add 1
      !                         / range 0..n
    x+                          / add x
,/                              / flatten

0

Clojure, 110 octets

#(clojure.string/join","(for[s(.split %",")[a b][(map read-string(.split s"-"))]r(if b(range a(inc b))[a])]r))

Gérer les chaînes n'est pas très amusant :(




0

Japt , 12 octets

q, c@OvXr-'ò

Essayez-le


Pouvez-vous remplacer c@par £?
Oliver

@Oliver, comme c'est un vieux défi qui ne spécifie pas son format d'E / S, j'ai commis une erreur par prudence, en prenant l'entrée comme une chaîne délimitée par des virgules et la sortie comme un tableau aplati. Normalement, cependant, oui, j'aurais spécifié l'entrée comme un tableau de chaînes, la sortie comme un tableau multidimensionnel et juste utilisé £à la place des 5 premiers octets.
Shaggy

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.