Geben Sie jede Nummer aus einer Gruppe von Nummern zurück

11

Die Herausforderung

Das Programm muss alle Zahlen zurückgeben, die in einer Gruppe (durch Kommas und Bindestriche getrennte Folge) von Zahlen enthalten sind.

Regeln

  • s ist die Sequenzzeichenfolge;
  • Alle darin enthaltenen Zahlen ssind positiv .
  • Zahlen werden immer zunehmen ;
  • Zahlen werden sich nie wiederholen
  • Wenn Sie antworten, zeigen Sie die Ausgabe für s="1,3-5,9,16,18-23"

Beispiele

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

Viel Glück. =)

BernaMariano
quelle
1
Werden wir jemals Eingabesequenzen haben, die nicht ständig zunehmen, zum Beispiel: 4-9,1-2oder 1-3,9-6?
Matt
1
Oder überlappend? Muss die Ausgabe sortiert werden und darf keine Duplikate enthalten?
Peter Taylor
@Gareth Ja, dies ist ein Code-Golf, dann stimmen Sie bitte für die kürzeste Antwort ab. Matt und Peter, ich habe die Frage bearbeitet, bitte überprüfen Sie sie. Vielen Dank!
BernaMariano
Muss es ein vollständiges Programm sein und gibt es eine Einschränkung für das Format der Ausgabe?
Brad Gilbert b2gills
1
Duplikat?
ev3commander

Antworten:

6

GolfScript (24 Zeichen)

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

Z.B

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

Ich habe tatsächlich vier 24-Zeichen-Lösungen, aber ich habe diese gewählt, weil sie keine alphanumerischen Zeichen enthält.

Wie es funktioniert

# 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
Peter Taylor
quelle
Wie kann man 3-5 zu 3,4,5 erweitern, ohne einen einzelnen Charakter zu verwenden -?
BernaMariano
@BernaMariano, sorry, ich habe deine Frage irgendwie verpasst. Ich werde die Antwort mit einer detaillierten Erklärung erweitern.
Peter Taylor
7

Perl 25 26 25

$_ ist die Sequenzzeichenfolge

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

Beispielsitzung:

[~/] $ 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

1 Zeichen zur Anzahl der Zeichen für die Option hinzugefügt (danke Gareth, ..kinda).-n-p

ardnew
quelle
Ich habe wahrscheinlich die Zeichenzählung falsch gemacht (mit den Befehlszeilenoptionen). Fühlen Sie sich frei, meine Zählung zu korrigieren, bitte
ardnew
Wenn Sie sich die Antwort auf diese Frage auf Meta ansehen , müssen Sie nur 1 Zeichen für die nOption hinzufügen .
Gareth
Entfernen Sie -M5.010und tauschen Sie -efür-E
Brad Gilbert b2gills
4

Golfskript, 46 45

Mein erstes Golfskriptprogramm dauerte Stunden.

{','/{'-'/{~}%.,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

Sie können es unter http://golfscript.apphb.com/ versuchen.

Mein bester Versuch, diese Gräueltat zu erklären:

{...}: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 ","

edit 1: hat das letzte {}% ~ in {} / geändert, auch meine Beschreibung war wahrscheinlich falsch.

Shiona
quelle
2
+1, weil jeder, der ein Programm in GolfScript macht, es verdient hat.
Gareth
@ Gareth Danke. Ich dachte zuerst, ich würde es einfach perl machen: ändern - zu ... und es bewerten. Dann konnte ich keinen vernünftigen Weg finden, um Arrays zu erstellen, also tat ich dies. Ich bin mir sicher, dass jemand mit einer ~ 20-Zeichen-Lösung mit Golfscript vorbeikommt.
Shiona
Ich habe im Moment 24, also nehme ich 20 als Herausforderung;) Sie können jedoch ein paar ganz einfach sparen. Das Problem fragt nach einem Programm, keine Funktion, so dass Sie die anfänglichen verlieren können {und das Finale }:r;und man kann man auch durch den Austausch sparen 1-mit (. (IIRC ist übrigens ein Trick, den ich auch in meinem ersten GolfScript-Programm verpasst habe)
Peter Taylor
PS Es gibt einen subtilen Unterschied zwischen {...}%~und {...}/. Wenn Sie mit etwas weiter unten im Stapel auf etwas zugreifen, ist das integer $erste einfacher, da Sie die Ganzzahl nicht jedes Mal anpassen müssen, um zu kompensieren, was Sie auf dem Stapel belassen.
Peter Taylor
4

R , 44 Bytes

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

Probieren Sie es online aus!

Definieren Sie neu, um -zu bedeuten seq(dh :), umgeben Sie die Eingabe mit c()und bewerten Sie den entsprechenden Ausdruck.

Robin Ryder
quelle
3

K, 47

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

Testfall

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"
tmartin
quelle
","/:$,/{{x+!1+y-x}. 2#"J"$"-"\:x}'","\:0:0für 43 Bytes
Streetster
3

Gelee , 9 Bytes

⁾-ryṣ”,VF

Probieren Sie es online aus!

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

Die Bereichs-Dyade rnimmt zwei Argumente auf beiden Seiten und erzeugt einen inklusiven Bereich zwischen ihnen.

Nicht verwandte Zeichenfolge
quelle
2

J, 53 43 41 39 38 Zeichen

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

Übernimmt Eingaben über die Tastatur:

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

Ausgabe für den angeforderten Testfall:

   ;(}.[: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
Gareth
quelle
2

Hassium , 173 Bytes

Dies war ziemlich lang und könnte nicht konkurrieren, da es am Ende ein Trailing gibt.

 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+",")}}

Laufen Sie online und sehen Sie hier erweitert

Jacob Misirian
quelle
1

Perl (37)

$_=<>;s/^/say join',',/;s/-/../g;eval
Marinus
quelle
- Wenn Sie antworten, zeigen Sie die Ausgabe für s="1,3-5,9,16,18-23", danke
BernaMariano
Wie wäre es say join",",eval<>=~s/-/../grmit 29 Bytes
Brad Gilbert b2gills
1

Python 2.7, 147 138 Bytes

z, f = input (). split (','), []
für i in z:
 x = i.split ('-')
 wenn len (x)> 1: f + = Bereich (int (x [0]), int (x [1]) + 1)
 sonst: f + = [int (x [0])]
print str (f) [1: -1]

Verwendung:

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

Nicht das beste Programm ...

Alex
quelle
1
Willkommen bei PPCG. Ich denke, Sie können Ihre Antwort verkürzen, indem Sie 1 Leerzeichen für Einrückungen verwenden.
intrepidcoder
Vielen Dank an @intrepidcoder, ich wusste nicht, dass Sie einzelne Leerzeichen verwenden können.
Alex
1

MATLAB, 47 Bytes

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

Dieses Snippet liest eine Zeichenfolgeneingabe aus dem Befehlsfenster, ersetzt '-' durch ':', fügt der Zeichenfolge eckige Klammern hinzu und wertet sie dann aus, sodass die Eingabe zu einem vollständigen Array von Zahlen erweitert wird.

Beispieleingabe:

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

Beispielausgabe:

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

Ich glaube, diese Ausgabe ist erlaubt, da die Herausforderung nur besagt, dass alle Zahlen in einer Gruppe angezeigt werden sollten.

slvrbld
quelle
Komma-getrennte Ausgabe wäre schöner, obwohl ich ein 5-Leerzeichen-getrenntes Muster sehen kann, das ist cool für mich :)
BernaMariano
1

Perl 6 , 36 Bytes

$_=get;say join ',',EVAL S:g/\-/../
1,3,4,5,9,16,18,19,20,21,22,23
Brad Gilbert b2gills
quelle
1

PowerShell, 79 71 Byte

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

Probieren Sie es online aus!

Der innere Teil ändert "1,5-9,12" in ein "(1), (5..9), (12)" - Format, das PowerShell versteht, und führt es dann mit iex aus, wodurch ein Array von Arrays erstellt wird. Durchlaufen Sie dann jedes innere Array und verbinden Sie schließlich alle äußeren Array-Elemente miteinander

Leiht Code aus meiner Antwort "Hilf mir, meine Zeit zu verwalten"

Verwendung

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 Bytes dank Veskah

AdmBorkBork
quelle
Sie machen redundante
Verknüpfungen
1

K (oK) , 40 31 Bytes

Lösung

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

Probieren Sie es online aus!

Erläuterung:

Hat mehr Golf gespielt, während die Erklärung hinzugefügt wurde ...

,/{{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
Streetster
quelle
0

Clojure, 110 Bytes

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

Der Umgang mit Saiten macht nicht viel Spaß :(

NikoNyrh
quelle
0

Python 2 , 112 Bytes

Ziemlich einfache und unkomplizierte Antwort.

L=[]
for s in input().split(','):
 if'-'in s:a,b=map(int,s.split('-'));L+=range(a,b+1)
 else:L+=[int(s)]
print L

Probieren Sie es online aus!

mbomb007
quelle
0

Japt , 12 Bytes

q, c@OvXr-'ò

Versuch es

Zottelig
quelle
Können Sie ersetzen c@mit £?
Oliver
@Oliver, da es sich um eine alte Herausforderung handelt, bei der das E / A-Format nicht angegeben ist, habe ich mich vorsichtshalber geirrt, indem ich die Eingabe als durch Kommas getrennte Zeichenfolge und die Ausgabe als abgeflachtes Array verwendet habe. Normalerweise hätte ich jedoch die Eingabe als Array von Zeichenfolgen angegeben, die Ausgabe als mehrdimensionales Array und nur £anstelle der ersten 5 Bytes verwendet.
Shaggy