Рядок буквено-цифрових символів у відсортованому списку розділених комами діапазонів


12

Дано рядок несортованих буквено-цифрових символів, наприклад

ABC321STPpJqZZr0

вивести "" "розділений список діапазонів символів, відсортований за значенням ASCII, ігноруючи регістр та видалення дублікатів ( тобто виведення лише великих і малих символів), наприклад

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

Правила

  • Тривалість вашої програми - це ваш базовий бал, як завжди.
  • Ви повинні ініціалізувати (жорстко) в наведеному вище приклад у вашій програмі, але ви можете знецінити довжину цього прикладу з вашої довжини програми, наприклад , для char* s="ABC321STPpJqZZr0";вас може знецінити 16 символів, решта 11 символів рахункових до вашої довжині програми.

Бонус (+50 баунті)

  • Оскільки це було справжньою проблемою, з якою сьогодні зіткнувся мій колега, який потребує написання у Tcl 8.0.5 (стародавня версія, у якій відсутня багато останніх вбудованих Tcl), я надам 50 балів тому, хто пише найкоротший Tcl 8.0 .5 рішення, якщо в Tcl 8.0.5 є щонайменше 2 дійсних подання.

@FezVrasta - Я навмисно писав, ", "щоб включити пробіл, але ми можемо залишити вашу редакцію, і цей коментар буде слугувати цим показником.
Ендрю Чонг

Чому навмисно включати GolfScript? Чому б не дозволити інші мови, наприклад, Befunge?
Джастін

Можна сказати, що все - чесна гра. Я просто не зможу дуже легко перевірити більшість з них.
Ендрю Чонг

Так це тег Code-Golf тоді?
VisioN

1
@Chron - Хороший улов. AB в моєму випадку, але оскільки вже було багато подань, давайте дозволити обидва способи.
Ендрю Чонг

Відповіді:


5

Рубі, 87-16 = 71

РЕДАКТУВАННЯ: Довелося додати деякі символи, щоб двоканальний діапазон відображався правильно. Також використовуючи ?[замість того, ?Zщоб виправити помилку із діапазонами, що закінчуються на Z.

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

Ви можете побачити Ideone працювати тут .


+1 Для однолінійного. Дуже розумне використання різних методів; Це справді геніально.
daniero

1
Зауважте, що gsub(/[]/i)вона коротша, ніж tr(''.upcase)на 2 символи. Більше того, scan(/.+/)-> splitзберігає 5, а $><<замість putsіншого.
Говард

@Howard Чудові пропозиції, дякую!
Пол Престиждж

2

Юлія, 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, і, ймовірно, все одно буде роздавлений.


1
Все одно, дякую! Обмеження Ideone.com було лише для того, щоб я міг його перевірити, але, мабуть, я можу довіряти цілісності гольфістів і усунути це правило. +1, все одно.
Ендрю Чонг

2

C #, 221 байт

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

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

Чи можете ви додати невелике пояснення?
Джастін

Ітерація над рядком, накопичуючи кількість примірників кожного буквено-цифрового символу. Потім перейдіть по всіх буквено-цифрових символах в алфавітному порядку, виписавши початок кожного компактного діапазону і, якщо потрібно, штрих, що йде за кінцем діапазону. Якщо це не перший діапазон, який було записано, додайте роздільник пробілу комами. Код повинен бути вбудований у функцію main () з відповідними заголовками (stdio, string, ctypes), тому я якось там обдурив.
Варренм

2

GolfScript 57 54 52

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

Спробуйте тут .

Код спочатку використовує великі літери:

{.95>32*-}%

Потім отримує унікальні символи та зберігає їх у змінній:

.|:x

Потім ми отримуємо символи, чиї прямі попередники не в рядку (так що вони є початковою частиною діапазону):

..{)}%&-x

Аналогічно отримуємо кінці діапазонів x..{)}%&-.

Тепер фактично формуйте діапазони, об'єднуючи списки, сортуючи та розбиваючи на 2 групи:

+$2/

Решта - просто форматування, використовуючи *як об'єднання рядків.


1
У вихідних даних , діапазони повинні бути розділені «" і не тільки ","
Пол Prestidge

1
Також .95>{32-}{}if-> .95>32*-зберігає 5 символів.
Говард

@Howard Great! Я знав, що частина була неоптимальною.
Бен Рейх

1
@Chron Виправлено простір!
Бен Рейх


1

Python 2.x, 304 - 16 = 288

Це, безумовно, можна пограти далі, всі коментарі вітаються!

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

Ребол (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

Нескорочена версія:

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 знаків]

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

Використання

{.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"
Вихідні дані
"0-3,A-C,J,P-T,Z"

Існує область збереження символів, я спробую якийсь інший метод і опублікую його.


0

Tcl 8.0.5, 344 (360 байт)

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 байт)

Мистецтво з renameкомандою дало кілька цікавих хитрощів! Я задокументував їх в іншій темі .

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 байт) [Нестабільний - залежить від $ PATH]

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

Кредит @JohannesKuhn для інтерактивного трюку .


1
Іноді ви можете зберегти байт замінити whileна timeконструктів. codegolf.stackexchange.com/a/126236/29325
sergiol
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.