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


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

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

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


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.


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


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"

","/:$,/{{x+!1+y-x}. 2#"J"$"-"\:x}'","\:0:0für 43 Bytes
Streetster


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

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



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


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.


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


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



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

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ß :(




0

Japt , 12 Bytes

q, c@OvXr-'ò

Versuch es


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.