쉼표로 구분 된 범위의 정렬 된 목록에 대한 영숫자 문자열


12

정렬되지 않은 영숫자 문자열이 주어진 경우 ( 예 :

ABC321STPpJqZZr0

","로 구분 된 문자 범위의 목록을 ASCII 값으로 정렬하여 대소 문자를 무시하고 중복을 제거합니다 ( 예 : 대문자 및 숫자 만 출력). 예 :

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

규칙

  • 평소와 같이 프로그램의 길이는 기본 점수입니다.
  • 프로그램 내에서 위의 예제를 초기화 (하드 코드)해야하지만 프로그램 길이에서 해당 예제의 길이를 할인 할 수 있습니다. 들어char* s="ABC321STPpJqZZr0"; 16 자 할인, 다른 11자는 프로그램 길이로 계산됩니다.

보너스 (+50 현상금)

  • 이것이 오늘날 동료가 직면 한 실제 문제였으며 Tcl 8.0.5 (최신 버전, 최신 Tcl 내장 기능이 부족함)로 작성해야하므로 가장 짧은 Tcl 8.0을 작성하는 사람에게 50 점을 부여합니다. .5 Tcl 8.0.5에 유효한 제출이 2 회 이상있는 경우 해결책.

@FezVrasta-의도적으로 ", "공백을 포함하도록 작성 했지만 편집 내용을 그대로 두고이 의견을 해당 표시로 사용할 수 있습니다.
Andrew Cheong

GolfScript를 의도적으로 포함하는 이유는 무엇입니까? Befunge와 같은 다른 언어를 허용하지 않는 이유는 무엇입니까?
Justin

우리는 모두 공정한 게임이라고 말할 수 있습니다. 나는 그들 대부분을 아주 쉽게 확인할 수 없을 것입니다.
Andrew Cheong

그렇다면 Code-Golf 태그입니까?
VisioN

1
@Chron-잘 잡습니다. 내 경우에는 AB이지만 이미 많은 제출이 있었으므로 두 가지 방법을 모두 허용합시다.
Andrew Cheong

답변:


5

루비, 87-16 = 71

편집 : 두 문자 범위가 올바르게 표시되도록 일부 문자를 추가해야했습니다. 또한 Z로 끝나는 범위의 버그를 수정하는 ?[대신 사용 합니다 ?Z.

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

여기서 Ideone이 실행되는 것을 볼 수 있습니다 .


1 라이너의 경우 +1 다양한 방법의 매우 영리한 사용; 정말 훌륭합니다.
daniero

1
gsub(/[]/i)보다 짧은 tr(''.upcase)2 개 문자로. 또한, scan(/.+/)-> split와 5를 저장 $><<하는 대신 puts또 다른 하나.
Howard

@Howard 위대한 제안, 감사합니다!
Paul Prestidge

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

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 년 C

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

작은 설명을 추가 할 수 있습니까?
Justin

각 영숫자 문자의 인스턴스 수를 누적하여 문자열을 반복합니다. 그런 다음 알파벳 순서로 모든 영숫자 문자를 반복하여 각 컴팩트 범위의 시작과 해당하는 경우 대시와 범위의 끝을 기록합니다. 이것이 기록 된 첫 번째 범위가 아닌 경우 쉼표 공백 구분 기호를 추가하십시오. 코드는 적절한 헤더 (stdio, string, ctypes)가 포함 된 main () 함수에 포함되어야하므로 일종의 속임수입니다.
warrenm

2

GolfScript 57 54 52

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

여기서 사용해보십시오 .

코드는 먼저 모든 것을 대문자로 표시합니다.

{.95>32*-}%

그런 다음 고유 한 문자를 가져 와서 변수에 저장합니다.

.|:x

그런 다음 직접 선행 작업이 문자열에없는 문자를 얻습니다 (범위의 시작 부분이 됨).

..{)}%&-x

와 마찬가지로 범위의 끝을 얻습니다 x..{)}%&-.

이제 실제로 목록을 연결하고 정렬하고 2 개의 그룹으로 나누면 범위가 형성됩니다.

+$2/

나머지는 *문자열 조인으로 사용하여 서식을 지정 합니다.


1
출력에서 범위는 단순히 '가 아닌', '로 구분되어야합니다.
Paul Prestidge

1
또한 .95>{32-}{}if-> .95>32*-는 5자를 저장합니다.
Howard

@ 하워드 그레이트! 나는 그 부분이 차선 책임을 알고 있었다.
Ben Reich

1
@Chron 공간 문제를 해결했습니다!
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

파이썬 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.