Virgülle ayrılmış aralıkların sıralı bir listesine alfasayısal karakter dizisi


12

Sıralanmamış alfasayısal karakterler dizesi verilir, ör.

ABC321STPpJqZZr0

ASCII değerine göre sıralanmış, büyük / küçük harfleri yok sayan ve yinelenenleri kaldıran ( yani yalnızca büyük harf ve sayısal karakterler çıktısı alan) bir "," ayrımlı karakter aralığı listesi , ör.

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

kurallar

  • Programınızın uzunluğu her zamanki gibi temel puanınızdır.
  • Yukarıdaki örneği programınız içinde başlatmanız (sabit kodlamanız) gerekir, ancak bu örneğin uzunluğunu program uzunluğunuzdan da azaltabilirsiniz, örneğinchar* s="ABC321STPpJqZZr0"; sizin için 16 karakter indirim yapabilirsiniz, diğer 11 karakter de program uzunluğunuzu sayar.

Bonus (+50 ödül)

  • Bu, bugün iş arkadaşımın karşılaştığı, Tcl 8.0.5'te yazılması gereken gerçek bir sorun olduğundan (en son Tcl yerleşiklerinin çoğundan yoksun olan eski bir sürüm), en kısa Tcl 8.0'ı kim yazarsa 50 puan vereceğim .5 çözümü, Tcl 8.0.5'te en az 2 geçerli başvuru varsa.

@FezVrasta - Kasıtlı ", "olarak alanı dahil etmek için yazdım , ancak düzenlemenizi bırakabilir ve bu yorumun bu gösterge olarak hizmet etmesine izin verebiliriz.
Andrew Cheong

Neden bilerek GolfScript'i dahil etmelisiniz? Neden Befunge gibi diğer dillere izin vermiyorsunuz?
Justin

Her şeyin adil bir oyun olduğunu söyleyebiliriz. Bunların çoğunu kolayca kontrol edemeyeceğim.
Andrew Cheong

O zaman bu bir Code-Golf etiketi mi?
VisioN

1
@Chron - İyi yakaladın. Benim durumumda, ancak zaten birçok başvuru olduğundan, her iki yöne de izin verelim.
Andrew Cheong

Yanıtlar:


5

Yakut, 87-16 = 71

EDIT: İki karakter aralıkları doğru görüntülenmesi için bazı karakterler eklemek zorunda kaldı. Ayrıca Z ile biten aralıkları olan bir hatayı düzeltmek ?[yerine kullanmak ?Z.

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

Ideone'in burada çalıştığını görebilirsiniz .


+1 Tek astar için. Çeşitli yöntemlerin çok akıllıca kullanılması; Bu gerçekten harika.
daniero

1
Bunun 2 karakterden gsub(/[]/i)daha kısa olduğunu unutmayın tr(''.upcase). Dahası, scan(/.+/)-> split5 $><<yerine putsbaşka bir tane yerine kaydeder .
Howard

@Howard Harika öneriler, teşekkürler!
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"

Ideone.com tarafından desteklenmemektedir ve muhtemelen yine de ezilecektir.


1
Yine de teşekkürler! Ideone.com kısıtlaması sadece bunu test edebilirdim ama sanırım golfçülerin bütünlüğüne güvenebilirim ve bu kuralı kaldırabilirim. Yine de +1.
Andrew Cheong

2

C #, 221 bayt

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));
    }
}

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

Küçük bir açıklama ekleyebilir misiniz?
Justin

Her alfasayısal karakterin birkaç örneğini toplayarak dizenin üzerinde yineleme yapın. Daha sonra, her alfasayısal karakterleri alfabetik sırayla yineleyin, her bir kompakt aralığın başlangıcını ve uygunsa aralığın sonunu bir tire ve ardından yazın. Bu ilk yazılan aralık değilse, virgül-boşluk ayırıcısını ekleyin. Kod dahil uygun başlıklar (stdio, dize, ctypes) ile bir main () işlevi gömülü olmalıdır, bu yüzden orada hile var.
warrenm

2

GolfScript 57 54 52

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

Burada deneyin .

Kod önce her şeyi büyük harflerle kullanır:

{.95>32*-}%

Ardından benzersiz karakterler alır ve bir değişkene kaydeder:

.|:x

Daha sonra, doğrudan öncülleri dizede olmayan karakterleri alırız (böylece bir aralığın başlangıç ​​kısmı olurlar):

..{)}%&-x

Benzer şekilde aralıkların sonlarını da alırız x..{)}%&-.

Şimdi listeleri birleştirerek, sıralayarak ve 2 kişilik gruplara ayırarak aralıkları oluşturun:

+$2/

Gerisi *dize birleştirme olarak kullanarak sadece biçimlendirme .


1
Çıktıda, aralıkların sadece 'değil', 'ile ayrılması gerekir
Paul Prestidge

1
Ayrıca .95>{32-}{}if-> .95>32*-5 karakter kaydeder.
Howard

@ Harika! Bu bölümün yetersiz olduğunu biliyordum.
Ben Reich

1
@Chron Alan sorunu düzeltildi!
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]}

1

Python 2.x, 304-16 = 288

Bu kesinlikle daha fazla golf olabilir, tüm yorumlar hoş geldiniz!

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)

1

Asi (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

Küçültülmemiş sürüm:

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

1

q [116 karakter]

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

kullanım

{.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"
Çıktı
"0-3,A-C,J,P-T,Z"

Karakter kaydetme kapsamı var, başka bir yöntem deneyeceğim ve göndereceğim.


0

Tcl 8.0.5, 344 (360 bayt)

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 bayt)

Komuta ile uğraşmak renamebazı eğlenceli hileler verdi! Onları başka bir evrede belgeledim .

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 bayt) [Kararsız - $ PATH'a bağlı]

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

Etkileşimli numara için @JohannesKuhn'a teşekkür ederiz .


1
Bazen yerine bayt kaydedebilirsiniz whiletarafından timeyapılardan. codegolf.stackexchange.com/a/126236/29325
sergiol
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.