コンマで区切られた範囲のソートされたリストへの英数字の文字列


12

ソートされていない英数字の文字列が与えられた場合、例えば

ABC321STPpJqZZr0

出力A「」文字範囲ので区切らリストは、(ケースを無視して重複を削除、ASCII値でソートすなわち大文字と数字のみ出力)は、たとえば、

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

ルール

  • プログラムの長さは、通常どおり基本スコアです。
  • 上記の例をプログラム内で初期化(ハードコード)する必要がありますが、プログラムの長さからその例の長さを割り引くことができます。たとえばchar* s="ABC321STPpJqZZr0";16文字を割り引くことができます。

ボーナス(+50バウンティ)

  • これは今日の同僚が実際に直面した問題であり、Tcl 8.0.5(古いバージョンであり、最新のTclビルトインの多くを欠いている)で書く必要があるため、最短のTcl 8.0を書いた人に50ポイントを授与します.5ソリューション、Tcl 8.0.5に少なくとも2つの有効な提出がある場合。

@FezVrasta-私は意図的に", "スペースを含めるように書きましたが、あなたの編集を残して、このコメントがその指示として役立つようにすることができます。
アンドリューチョン14

なぜ意図的にGolfScriptを含めるのですか?Befungeなどの他の言語を許可しないのはなぜですか?
ジャスティン

すべてが公正なゲームであると言えます。それらのほとんどを非常に簡単に確認することはできません。
アンドリューチョン14

では、それはCode-Golfタグですか?
VisioN 14

1
@Chron-良いキャッチ。私の場合はABですが、すでに多くの提出物があるので、両方の方法を許可しましょう。
アンドリューチョン14

回答:


5

ルビー、87-16 = 71

編集: 2文字の範囲が正しく表示されるように、いくつかの文字を追加する必要がありました。また、Zで終わる範囲のバグを修正する?[代わりに使用?Zします。

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

ここで Ideoneの実行を確認できます


+1ワンライナー用。さまざまな方法の非常に巧妙な使用。これは本当に素晴らしいです。
ダニエロ14

1
gsub(/[]/i)tr(''.upcase)2文字より短いことに注意してください。さらに、scan(/.+/)-> splitは5を節約し$><<puts別の1つを節約します。
ハワード14

@Howardすばらしい提案、ありがとう!
ポール・プレスティッジ14

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。
アンドリューチョン14

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

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

簡単な説明を追加できますか?
ジャスティン14

文字列を反復処理し、各英数字のインスタンスの数を累積します。次に、すべての英数字をアルファベット順に反復処理し、各コンパクト範囲の先頭と、必要に応じてダッシュの後に範囲の末尾を書き出します。これが書き込まれた最初の範囲でない場合は、コンマスペース区切り文字を追加します。コードは、適切なヘッダー(stdio、string、ctypes)が含まれたmain()関数に埋め込まれる必要があるので、私はそこを少しkindしました。
ウォーレン14

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文字を保存します。
ハワード14

@Howardすばらしい!その部分が最適ではないことは知っていました。
ベン・ライヒ

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.