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

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 для одного лайнера. Очень умное использование различных методов; Это действительно великолепно.
Даниеро
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 и, вероятно, все равно будет уничтожен.

GGGG
источник
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));
    }
}
Hand-E-Food
источник
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;}}
warrenm
источник
Можете ли вы добавить небольшое объяснение?
Джастин
Перебирайте строку, накапливая количество экземпляров каждого буквенно-цифрового символа. Затем выполните итерацию по всем буквенно-цифровым символам в алфавитном порядке, записав начало каждого компактного диапазона и, если необходимо, тире, за которым следует конец диапазона. Если это не первый написанный диапазон, добавьте разделитель запятых. Код должен быть встроен в функцию main () с включенными соответствующими заголовками (stdio, string, ctypes), поэтому я немного обманул.
Warrenm
2

GolfScript 57 54 52

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

Попробуй это здесь .

Код сначала заглавная:

{.95>32*-}%

Затем получает уникальные символы и сохраняет их в переменной:

.|:x

Затем мы получаем символы, чьи прямые предшественники отсутствуют в строке (так что они являются начальной частью диапазона):

..{)}%&-x

Мы также получаем концы диапазонов с x..{)}%&-.

Теперь фактически формируем диапазоны, объединяя списки, сортируя и разбивая на группы по 2:

+$2/

Остальное - просто форматирование, используя *как строковое соединение.

Бен Райх
источник
1
В выходных данные диапазоны должны быть разделены
символами
1
Также .95>{32-}{}if-> .95>32*-сохраняет 5 символов.
Говард
@ Ховард Отлично! Я знал, что эта часть была неоптимальной.
Бен Райх
1
@Chron Исправлена ​​проблема с пространством!
Бен Райх
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
источник
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)
ChristopheD
источник
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
draegtun
источник
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