Zeichenfolge aus alphanumerischen Zeichen in einer sortierten Liste von durch Kommas getrennten Bereichen

12

Bei einer Zeichenfolge aus unsortierten alphanumerischen Zeichen, z

ABC321STPpJqZZr0

Eine durch "," getrennte Liste von Zeichenbereichen ausgeben, sortiert nach ASCII-Wert, Groß- und Kleinschreibung ignorieren und Duplikate entfernen ( dh nur Großbuchstaben und numerische Zeichen ausgeben), z

0-3, A-C, J, P-T, Z

Regeln

  • Die Länge Ihres Programms entspricht wie gewohnt Ihrer Grundpunktzahl.
  • Sie müssen initialisiert werden (hard) das obige Beispiel in Ihrem Programm, aber Sie können die Länge dieses Beispiels aus dem Programm Länge Rabatt, zB für char* s="ABC321STPpJqZZr0";Sie 16 Zeichen diskontieren können, die anderen 11 Zeichen in Richtung Ihrer Programmlänge zu zählen.

Bonus (+50 Kopfgeld)

  • Da dies ein echtes Problem war, auf das mein Kollege heute gestoßen ist und das in Tcl 8.0.5 geschrieben werden muss (eine alte Version, in der viele der neuesten Tcl- Integrationen fehlen), werde ich jedem, der die kürzeste Tcl 8.0 schreibt, 50 Punkte geben .5 Lösung, wenn es mindestens 2 gültige Einsendungen in Tcl 8.0.5 gibt.
Andrew Cheong
quelle
@FezVrasta - Ich habe absichtlich geschrieben ", ", um das Leerzeichen einzuschließen , aber wir können Ihre Bearbeitung verlassen und diesen Kommentar als diese Anzeige dienen lassen.
Andrew Cheong
Warum absichtlich GolfScript einbinden? Warum nicht andere Sprachen wie Befunge zulassen?
Justin
Wir können sagen, dass alles faires Spiel ist. Ich werde einfach nicht in der Lage sein, die meisten von ihnen sehr leicht zu überprüfen.
Andrew Cheong
Also ist das ein Code-Golf-Tag?
VisioN
1
@ Chron - Guter Fang. AB in meinem Fall, aber da es bereits viele Einreichungen gegeben hat, lassen wir beide Möglichkeiten zu.
Andrew Cheong

Antworten:

5

Rubin, 87-16 = 71

BEARBEITEN: Es mussten einige Zeichen hinzugefügt werden, damit die Bereiche mit zwei Zeichen korrekt angezeigt werden. Verwenden Sie auch ?[anstelle von ?Z, um einen Fehler mit Bereichen zu beheben, die auf Z enden.

$><<[*?0..?[].join.gsub(/[^ABC321STPpJqZZr0]/i,$/).gsub(/\B.+\B/,?-).scan(/.-.|./)*', '

Sie können das Ideone hier sehen .

Paul Prestidge
quelle
+1 Für Einzeiler. Sehr geschickter Umgang mit verschiedenen Methoden; Das ist wirklich genial.
Daniero
1
Beachten Sie, dass gsub(/[]/i)kürzer als tr(''.upcase)2 Zeichen ist. Außerdem spart scan(/.+/)-> split5 und $><<anstelle eines putsanderen.
Howard
@ Howard Tolle Vorschläge, danke!
Paul Prestidge
2

Julia, 131

julia> l=sort(unique(uppercase("ABC321STPpJqZZr0")))
julia> prod([!(c+1 in l)?"$c"*(c==l[end]?"":", "):!(c-1 in l)?"$c":(c+1 in l)&&!(c+2 in l)?"-":"" for c in l])

"0-3, A-C, J, P-T, Z"

Wird von Ideone.com nicht unterstützt und wird wahrscheinlich sowieso zerstört.

gggg
quelle
1
Danke trotzdem! Die Einschränkung von Ideone.com war nur, damit ich es testen konnte, aber ich schätze, ich kann der Integrität der Golfer vertrauen und diese Regel entfernen. Auf jeden Fall +1.
Andrew Cheong
2

221 Bytes

class P{
    static void Main(){
        var s="ABC321STPpJqZZr0";
        var l=new int[257];
        foreach(int c in s.ToUpper())
            l[c]=1;
        var r="";
        for(int i=0;i<255;){
            if(l[i++]-l[i]<0)
                r+=", "+(char)i;
            else if(l[i+1]-l[i]<0)
                r+="-"+(char)i;
        }
        System.Console.Write(r.Substring(2));
    }
}
Hand-E-Food
quelle
2

C 193

char*s="ABC321STPpJqZZr0";
int c[99];memset(c,0,396);while(*s){++c[toupper(*s++)];}for(int i=0,f=1,r=0;
i<=99;++i){if(!r&&c[i])r=i;if(r&&!c[i]){if(!f)printf(", ");putchar(r);
if(i-r>1)printf("-%c",i-1);r=f=0;}}
warrenm
quelle
Können Sie eine kleine Erklärung hinzufügen?
Justin
Durchlaufen Sie die Zeichenfolge und sammeln Sie die Anzahl der Instanzen jedes alphanumerischen Zeichens. Anschließend werden alle alphanumerischen Zeichen in alphabetischer Reihenfolge durchlaufen, wobei der Anfang jedes kompakten Bereichs und gegebenenfalls ein Bindestrich, gefolgt vom Ende des Bereichs, notiert werden. Wenn dies nicht der erste geschriebene Bereich ist, fügen Sie das Komma-Leerzeichen hinzu. Code muss in eine main () - Funktion eingebettet sein, mit entsprechenden Kopfzeilen (stdio, string, ctypes), also habe ich dort irgendwie geschummelt.
Warrenm
2

GolfScript 57 54 52

 'ABC321STPpJqZZr0'
 {.95>32*-}%.|:x..{(}%&-x..{)}%&-+$2/{.|'-'*}%', '*

Probieren Sie es hier aus .

Der Code setzt zuerst alles in Großbuchstaben:

{.95>32*-}%

Ruft dann eindeutige Zeichen ab und speichert sie in einer Variablen:

.|:x

Dann erhalten wir die Zeichen, deren direkte Vorgänger nicht in der Zeichenfolge enthalten sind (so dass sie den Anfang eines Bereichs darstellen):

..{)}%&-x

Ebenso bekommen wir die Bereichsenden mit x..{)}%&-.

Bilden Sie nun die Bereiche, indem Sie die Listen verketten, sortieren und in Zweiergruppen aufteilen:

+$2/

Der Rest ist nur die Formatierung mit *als String-Join.

Ben Reich
quelle
1
In der Ausgabe müssen die Bereiche durch ',' und nicht nur ',' getrennt werden
Paul Prestidge
1
Auch .95>{32-}{}if-> .95>32*-speichert 5 Zeichen.
Howard
@ Howard Großartig! Ich wusste, dass dieser Teil nicht optimal war.
Ben Reich
1
@Chron Platzproblem behoben!
Ben Reich
2

Q, 94

{","sv(,/){{"-"sv(?) -1 1#\:x}'[cut[;a]0,1_(&)1<(-':)"i"$'a:asc upper[x]inter y]}[x]'[.Q`n`A]}
tmartin
quelle
1

Python 2.x, 304-16 = 288

Dies kann sicherlich weiter golfen werden, alle Kommentare sind willkommen!

e=[""]*11;f=[""]*27
for c in"ABC321STPpJqZZr0".lower():e["0123456789".find(c)]=f["abcdefghijklmnopqrstuvwxyz".find(c)]=c
e[-1]=f[-1]=""
def h(j):
 g=[];k=l=i=0
 for e in j:
  if e:
   if not l:k=i;l=1
  elif l:l=g.append((k,i-1))
  i+=1
 print", ".join([j[m],j[m]+"-"+j[n]][n-m>1]for m,n in g)
h(e);h(f)
ChristopheD
quelle
1

Rebol (218 - 16 = 202)

m: s: sort uppercase unique"ABC321STPpJqZZr0"i: :to-integer f: does[either 1 = length? x: copy/part m s[x][rejoin[x/1"-"last x]]]while[not tail? s: next s][if(1 + i pick back s 1)!=(i s/1)[prin join f", "m: s]]print f

Nicht verkleinerte Version:

m: s: sort uppercase unique "ABC321STPpJqZZr0"
i: :to-integer

f: does [
    either 1 = length? x: copy/part m s [x] [rejoin [x/1 "-" last x]]
]

while [not tail? s: next s][
    if (1 + i pick back s 1) != (i s/1) [
        prin join f ", "
        m: s
    ]
]

print f
draegtun
quelle
1

q [116 Zeichen]

{.a:();{m:6h$x;.a:.a,$[m[1]=1+m[0];45;m[0],44,m 1];1_x}/[x:asc distinct upper x];p where differ 6h$p:-3_10h$x[0],.a}

Verwendung

{.a:();{m:6h$x;.a:.a,$[m[1]=1+m[0];45;m[0],44,m 1];1_x}/[x:asc distinct upper x];p where differ 6h$p:-3_10h$x[0],.a}"ABC321STPpJqZZr0"
Ausgabe
"0-3,A-C,J,P-T,Z"

Es gibt einen Bereich zum Speichern von Zeichen, ich werde eine andere Methode ausprobieren und es veröffentlichen.

Nyi
quelle
0

Tcl 8.0.5, 344 (360 Bytes)

set a ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
set s string
set x [join [lsort [split [$s toupper ABC321STPpJqZZr0] ""]] ""]
regsub -all (.)\\1+ $x \\1 x
set i 36
while {[incr i -1]} {set j -1
while {$i+[incr j]<36} {set y [$s range $a $j [expr $i+$j]]
regsub $y $x [$s index $y 0]-[$s index $y end],\  x}}
while {[regsub -all {(\w)(\w)} $x {\1, \2} x]} {}
puts $x

Tcl 8.0.5, 340 (356 Bytes)

Das Basteln mit dem renameBefehl brachte einige unterhaltsame Tricks! Ich habe sie in einem anderen Thread dokumentiert .

rename rename &
& set =
& regsub R
& string S
& while W
= a ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
= x [lsort [split [S toupper ABC321STPpJqZZr0] ""]]
R -all {(.) \1+| } $x \\1 x
= i 36
W {[incr i -1]} {= j -1
W {$i+[incr j]<36} {= y [S range $a $j [expr $i+$j]]
R $y $x [S index $y 0]-[S index $y end],\  x}}
W {[R -all {(\w)(\w)} $x {\1, \2} x]} {}
puts $x

Tcl 8.0.5, 332 (348 Byte) [Instabil - hängt von $ PATH ab]

info script ""
set tcl_interactive 1
set a ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
set x [lso [sp [st toupper ABC321STPpJqZZr0] ""]]
regs -all {(.) \1+| } $x \\1 x
set i 36
wh {[inc i -1]} {set j -1
wh {$i+[inc j]<36} {set y [st range $a $j [exp $i+$j]]
regs $y $x [st index $y 0]-[st index $y end],\  x}}
wh {[regs {(\w)(\w)} $x {\1, \2} x]} {}
pu $x

Dank an @JohannesKuhn für den interaktiven Trick .

Andrew Cheong
quelle
1
Manchmal können Sie das Ersetzen whilevon Bytes durch timeKonstrukte sparen . codegolf.stackexchange.com/a/126236/29325
sergiol