30

課題: String 内の重複する文字を検出して削除する、文字数による最短のコード。削除には、重複した文字のすべてのインスタンスが含まれ(したがって、3 つの n が見つかった場合は、3 つすべてを削除する必要があります)、元の文字の順序を保持する必要があります。

入力例 1:
nbHHkRvrXbvkn

出力例 1:
RrX


入力例 2:
nbHHkRbvnrXbvkn

出力例 2:
RrX

(2 番目の例では、3 回出現する文字を削除します。一部のソリューションでは、これを説明できませんでした)

(これは、C# でこれを行うための最速の方法が必要だったという私の他の質問に基づいていますが、言語間で優れたコード ゴルフになると思います。)

4

48 に答える 48

38

LabVIEW7.1

1文字で、ブロック図の青い定数 ' 1 ' です。入力はコピー アンド ペーストでした ;-)

http://i25.tinypic.com/hvc4mp.png

http://i26.tinypic.com/5pnas.png

于 2009-08-31T20:14:43.580 に答える
26

パール

21 文字の perl、31 の呼び出し、合計 36 のキーストローク (シフトと最後のリターンをカウント):

perl -pe's/$1//gwhile/(.).*\1/'
于 2009-08-28T00:16:10.277 に答える
19

ルビー — 61 53 51 56 35

定規によると61文字。(別のコードゴルフのアイデアを教えてください...)

  puts ((i=gets.split(''))-i.select{|c|i.to_s.count(c)<2}).join
+-------------------------------------------------------------------------+
||    |    |    |    |    |    |    |    |    |    |    |    |    |    |  |
|0         10        20        30        40        50        60        70 |
|                                                                         |
+-------------------------------------------------------------------------+
  gets.chars{|c|$><<c[$_.count(c)-1]}

... 35 バイ ナキロン

于 2009-08-28T07:20:33.613 に答える
15

パイソン:

s=raw_input()
print filter(lambda c:s.count(c)<2,s)

これは、コンソールから読み書きする、完全に機能するプログラムです。ワンライナー版はコマンドラインから直接使用可能

python -c 's=raw_input();print filter(lambda c:s.count(c)<2,s)'
于 2009-08-28T00:14:31.087 に答える
14

J ( 16 12 文字)

(~.{~[:I.1=#/.~)

例:

(~.{~[:I.1=#/.~) 'nbHHkRvrXbvkn'
    RrX

かっこを暗黙のうちに実行するだけで済みます。動詞に入れると、実際のコード自体は 14 文字になります。

これを行うためのよりスマートな方法は確かにあります。

編集:問題のよりスマートな方法:

(~.#~1=#/.~) 'nbHHkRvrXbvkn'
    RrX

12 文字、動詞で設定した場合は 10 文字のみ。1 回目はカウント (#/.) し、もう 1 回目は一意のもの (nub または ~.) を返しますが、「misc」ライブラリの標準動詞である nubcount でさえ、2 回実行します。

于 2010-02-10T15:45:19.530 に答える
12

ハスケル

Haskell でこれを行うためのより短い方法は確かにありますが、次のとおりです。

Prelude Data.List> let h y=[x|x<-y,(<2).length$filter(==x)y]
Prelude Data.List> h "nbHHkRvrXbvkn"
"RrX"

let は GHCi での関数宣言にのみ必要なので無視すると、h y=[x|x<-y,(<2).length$filter(==x)y]37 文字の があります (これは の現在の「コア」Python を結び付けますが"".join(c for c in s if s.count(c)<2)、いずれにせよ事実上同じコードです)。

それからプログラム全体を作成したい場合は、

h y=[x|x<-y,(<2).length$filter(==x)y]
main=interact h

$ echo "nbHHkRvrXbvkn" | runghc tmp.hs
RrX

$ wc -c tmp.hs
54 tmp.hs

または、この方法で 1 つの文字を削除できます。

main=interact(\y->[x|x<-y,(<2).length$filter(==x)y])

$ echo "nbHHkRvrXbvkn" | runghc tmp2.hs
RrX

$ wc -c tmp2.hs
53 tmp2.hs

行ごとではなく、すべての標準入力で動作しますが、それは許容できるIMOのようです。

于 2009-08-28T02:03:35.200 に答える
9

C89 (106 文字)

これは、元の回答とはまったく異なる方法を使用しています。興味深いことに、それを書いてから別の答えを見た後、方法が非常に似ていることがわかりました。私の前にこの方法を思いついた caf の功績。

b[256];l;x;main(c){while((c=getchar())>=0)b[c]=b[c]?1:--l;
for(;x-->l;)for(c=256;c;)b[--c]-x?0:putchar(c);}

1 行で 58+48 = 106 バイトです。

C89 (173 文字)

これが私の最初の答えでした。コメントで述べたように、うまく機能しません...

#include<stdio.h>
main(l,s){char*b,*d;for(b=l=s=0;l==s;s+=fread(b+s,1,9,stdin))b=realloc(b,l+=9)
;d=b;for(l=0;l<s;++d)if(!memchr(b,*d,l)&!memchr(d+1,*d,s-l++-1))putchar(*d);}

2 行で、 17+1+78+77 = 173 バイトです。

于 2009-08-28T00:31:16.560 に答える
8

C#

65 キャラクター:

new String(h.Where(x=>h.IndexOf(x)==h.LastIndexOf(x)).ToArray());

再割り当てを伴う 67 文字:

h=new String(h.Where(x=>h.IndexOf(x)==h.LastIndexOf(x)).ToArray());
于 2009-08-28T06:54:45.087 に答える
7

C#

new string(input.GroupBy(c => c).Where(g => g.Count() == 1).ToArray());

71文字

于 2009-08-28T00:11:27.123 に答える
6

PHP (136 文字)

<?PHP
function q($x){return $x<2;}echo implode(array_keys(array_filter(
array_count_values(str_split(stream_get_contents(STDIN))),'q')));

1 行で 5+1+65+65 = 136 バイトです。PHP 5.3 を使用すると、関数を匿名にすることで数バイトを節約できますが、今はテストできません。おそらく次のようなものです:

<?PHP
echo implode(array_keys(array_filter(array_count_values(str_split(
stream_get_contents(STDIN))),function($x){return $x<2;})));

それは 5+1+66+59 = 131 バイトです。

于 2009-08-28T22:44:20.530 に答える
6

another APL solution

As a dynamic function (18 charachters)

{(1+=/¨(ω∘∊¨ω))/ω}

line assuming that input is in variable x (16 characters):

(1+=/¨(x∘∊¨x))/x
于 2009-09-17T10:56:57.973 に答える
5

パワーシェル

61文字。結果はどこ$s="nbHHkRvrXbvkn"にありますか$a

$h=@{}
($c=[char[]]$s)|%{$h[$_]++}
$c|%{if($h[$_]-eq1){$a+=$_}}

完全に機能するパラメーター化されたスクリプト:

param($s)
$h=@{}
($c=[char[]]$s)|%{$h[$_]++}
$c|%{if($h[$_]-eq1){$a+=$_}}
$a
于 2009-08-28T07:44:07.717 に答える
5

子:8389 93 99 101文字

  • O(n 2 ) 時間。
  • 999 文字に制限されています。
  • 32 ビット モードでのみ機能します (not #include-ing <stdio.h>(18 文字のコスト)getsとして解釈される戻り値の型を作成しint、アドレス ビットの半分を切り取るため)。
  • わかりやすい「警告: このプログラムは gets() を使用していますが、これは安全ではありません。」Mac で。

.

main(){char s[999],*c=gets(s);for(;*c;c++)strchr(s,*c)-strrchr(s,*c)||putchar(*c);}

(そして、この同様の82 -chars バージョンは、コマンド ライン経由で入力を受け取ります。

main(char*c,char**S){for(c=*++S;*c;c++)strchr(*S,*c)-strrchr(*S,*c)||putchar(*c);}

)

于 2010-02-10T14:43:36.613 に答える
5

VB.NET

For Each c In s : s = IIf(s.LastIndexOf(c) <> s.IndexOf(c), s.Replace(CStr(c), Nothing), s) : Next

確かに、VB は文字を節約しようとするのに最適な言語ではありませんが、行は 98 文字になります。

于 2009-08-28T02:02:30.333 に答える
5

ゴルフスクリプト(sym) - 15

  .`{\{=}+,,(!}+,
+-------------------------------------------------------------------------+
||    |    |    |    |    |    |    |    |    |    |    |    |    |    |  |
|0         10        20        30        40        50        60        70 |
|                                                                         |
+-------------------------------------------------------------------------+
于 2010-02-11T22:26:13.163 に答える
4

ハスケル

(マーク・ルシャコフの努力から数文字をノックアウトしただけで、彼のコメントとして投稿されたほうがいいです)

h y=[x|x<-y,[_]<-[filter(==x)y]]

これは Haskell のイディオムとして優れていますが、Haskeller 以外の人にとっては、これよりも従うのが難しいかもしれません。

h y=[z|x<-y,[z]<-[filter(==x)y]]

ハイエナなどの説明を追加するために編集します。

Mark のバージョンを理解していると仮定して、変更点についてだけ説明します。マークの表現:

(<2).length $ filter (==x) y

フィルタyを使用して要素のリストを取得し、そのリスト== xの長さを見つけて、それが 2 未満であることを確認します。(実際には長さが 1 でなければなりませんが、==1より長いです<2) 私のバージョン:

[z] <- [filter(==x)y]

同じフィルターを実行し、結果のリスト唯一の要素としてリストに入れます。現在、矢印 (セットの包含のように見えることを意味します!) は、「RHS リストのすべての要素に対して、その要素を順番に呼び出す[z]」ことを示しています。[z]は単一の要素を含むリストzであるため、要素 " filter(==x)y" は、要素が 1 つだけ含まれている場合にのみ " " と呼ぶことができます[z]。それ以外の場合は破棄され、 の値として使用されることはありませんz。したがって、z(リスト内包表記の左側に返される) は、長さ 1 のリストを返す正確|なです。xfilter

それは私の 2 番目のバージョンでした。私の最初のバージョンではx代わりに戻りますz- とにかく同じだからです - そして、「この値は使用されないので、コードを複雑にするつもりはありません」の Haskell シンボルである名前を変更zします_名前を付けることによって」。

于 2009-08-31T02:00:45.163 に答える
3

C

Cの完全なプログラム、141バイト(改行を数える)。

#include<stdio.h>
c,n[256],o,i=1;main(){for(;c-EOF;c=getchar())c-EOF?n[c]=n[c]?-1:o++:0;for(;i<o;i++)for(c=0;c<256;c++)n[c]-i?0:putchar(c);}
于 2009-08-28T06:03:34.330 に答える
3

C

(第1版:112文字、第2版:107文字)

k[256],o[100000],p,c;main(){while((c=getchar())!=-1)++k[o[p++]=c];for(c=0;c<p;c++)if(k[o[c]]==1)putchar(o[c]);}

それは

/* #include <stdio.h> */
/* int */ k[256], o[100000], p, c;
/* int */ main(/* void */) {
  while((c=getchar()) != -1/*EOF*/) {
    ++k[o[p++] = /*(unsigned char)*/c];
  }
  for(c=0; c<p; c++) {
    if(k[o[c]] == 1) {
      putchar(o[c]);
    }
  }
  /* return 0; */
}

getchar()はintを返し、putcharはintを受け入れるため、#includeは「安全に」削除できます。インクルードがないと、EOFが定義されないため、代わりに-1を使用しました(そしてcharを取得しました)。このプログラムは、100000文字未満の入力に対してのみ意図されたとおりに機能します。

バージョン2、strager107文字のおかげで

#ifdef NICE_LAYOUT
#include <stdio.h>

/* global variables are initialized to 0 */
int char_count[256];                          /* k in the other layout */
int char_order[999999];                       /* o ... */
int char_index;                               /* p  */

int main(int ch_n_loop, char **dummy)         /* c  */
                                              /* variable with 2 uses */
{

  (void)dummy; /* make warning about unused variable go away */

  while ((ch_n_loop = getchar()) >= 0) /* EOF is, by definition, negative */
  {
    ++char_count[ ( char_order[char_index++] = ch_n_loop ) ];
    /* assignment, and increment, inside the array index */
  }
  /* reuse ch_n_loop */
  for (ch_n_loop = 0; ch_n_loop < char_index; ch_n_loop++) {
    (char_count[char_order[ch_n_loop]] - 1) ? 0 : putchar(char_order[ch_n_loop]);
  }
  return 0;
}
#else
k[256],o[999999],p;main(c){while((c=getchar())>=0)++k[o[p++]=c];for(c=0;c<p;c++)k[o[c]]-1?0:putchar(o[c]);}
#endif
于 2009-08-29T16:06:54.747 に答える
3

スカラ

メソッド本体のみで 54 文字、(静的に型指定された) メソッド宣言で 66 文字:

def s(s:String)=(""/:s)((a,b)=>if(s.filter(c=>c==b).size>1)a else a+b)
于 2009-08-28T04:22:28.277 に答える
3

JavaScript 1.6

s.match(/(.)(?=.*\1)/g).map(function(m){s=s.replace(RegExp(m,'g'),'')})

以前に投稿された Javascript 1.8 ソリューションよりも短い (71 文字対 85 文字)

于 2010-01-26T19:41:26.323 に答える
3

TCL

123文字。もっと短くすることも可能かもしれませんが、私にはこれで十分です。

proc h {i {r {}}} {foreach c [split $i {}] {if {[llength [split $i $c]]==2} {set r $r$c}}
return $r}
puts [h [gets stdin]]
于 2009-08-28T03:03:07.620 に答える
3

JavaScript 1.8

s.split('').filter(function (o,i,a) a.filter(function(p) o===p).length <2 ).join('');

または、代わりに- python の例に似ています:

[s[c] for (c in s) if (s.split("").filter(function(p) s[c]===p).length <2)].join('');
于 2009-08-28T01:00:35.473 に答える
3

アセンブラ

WinXP DOS ボックス (cmd.exe) でテスト済み:

    xchg cx,bp
    std
    mov al,2
    rep stosb
    inc cl
l0: ; to save a byte, I've encoded the instruction to exit the program into the
    ; low byte of the offset in the following instruction:
    lea si,[di+01c3h] 
    push si
l1: mov dx,bp
    mov ah,6
    int 21h
    jz l2
    mov bl,al
    shr byte ptr [di+bx],cl
    jz l1
    inc si
    mov [si],bx
    jmp l1
l2: pop si
l3: inc si
    mov bl,[si]
    cmp bl,bh
    je l0+2
    cmp [di+bx],cl
    jne l3
    mov dl,bl
    mov ah,2
    int 21h
    jmp l3

53 バイトにアセンブルします。標準入力を読み取り、結果を標準出力に書き込みます。例:

 programname < input > output
于 2010-02-11T11:46:50.003 に答える
3

ルビー

63文字。

puts (t=gets.split(//)).map{|i|t.count(i)>1?nil:i}.compact.join
于 2009-08-28T03:50:52.770 に答える
2

Haskell ポイントフリー

import Data.List
import Control.Monad
import Control.Arrow
main=interact$liftM2(\\)nub$ap(\\)nub

プログラム全体で 97 文字ですが、実際の肉はわずか 23 文字です。あとは、関数をインポートして IO モナドに入れるだけです。モジュールがロードされたghciでは、それはただの

(liftM2(\\)nub$ap(\\)nub) "nbHHkRvrXbvkn"

さらに馬鹿げた無意味なスタイル (無意味なスタイル?) では:

main=interact$liftM2 ap liftM2 ap(\\)nub

関数自体は 26 文字ですが、少し長くなります。

于 2010-02-10T15:54:08.410 に答える
2

シェル/Coreutils、37 文字

fold -w1|sort|uniq -u|paste -s -d ''
于 2010-02-11T00:20:36.423 に答える
2

LilyPond、78 文字

z=#(ly:gulp-file"A")#(print(string-delete z(lambda(x)(>(string-count z x)1))))

使用法:$ cp input.in A; lilypond this.ly

于 2010-02-11T23:10:11.210 に答える
2

sed、41 文字

:;s/((.).*\2.*)\2/\1/;t;s/(.)(.*)\1/\2/;t

使用法:$ echo nbHHkRbvnrXbvkn | sed -r ':;s/((.).*\2.*)\2/\1/;t;s/(.)(.*)\1/\2/;t'

gnarf pyonによる寄稿あり;)。

于 2010-02-11T22:37:14.580 に答える
2

C# (53 文字)

s は入力文字列です。

new string(s.Where(c=>s.Count(h=>h==c)<2).ToArray());

または再割り当てを伴う 59:

var a=new string(s.Where(c=>s.Count(h=>h==c)<2).ToArray());
于 2010-02-10T15:06:52.427 に答える
2

PHP

118 文字の実際のコード (および PHP ブロックタグ用の 6 文字):

<?php
$s=trim(fgets(STDIN));$x='';while(strlen($s)){$t=str_replace($s[0],'',substr($s,1),$c);$x.=$c?'':$s[0];$s=$t;}echo$x;
于 2009-08-31T21:09:34.500 に答える
1

C - 118 文字を使用

この答えは、どの文字列の長さでも機能するため、良いと思います。

main(int s,char *a[]){int i=0,j,c,d;while(s=c=a[1][i]){j=0;while(d=a[1][j])if(i!=j++)if(c==d)s=0;s&&putchar(c);i++;}}

変数の型定義を削除することで、105 まで下げることができます (新しい C の勝者だと思います:P) が、私のコンパイラはそれでエラーをスローしています!

皆さんはどう思いますか?

于 2010-02-02T02:36:36.730 に答える
1

D2 (テンプレート): 195197 199+ 17 キャラクター

template F(alias s,int c,int i){static if(s>"")enum F=F!(s[1..$],c,i-(s[0]==c));else enum F=i?s:s~c;}template M(alias s,alias t=s){static if(s>"")enum M=F!(t,s[0],1)~M!(s[1..$],t);else enum M=s;}

拡張:

template F(alias s,int c,int i){
    static if(s>"")
        enum F=F!(s[1..$],c,i-(s[0]==c));
    else
        enum F=i?s:s~c;
}
template M(alias s,alias t=s){
    static if(s>"")
        enum M=F!(t,s[0],1)~M!(s[1..$],t);
    else
        enum M=s;
}

pragma(msg,M!"nbHHkRvrXbvkn");
于 2010-02-10T14:23:10.483 に答える
1

ルア、91文字

i,s=1,...s:gsub('.',function(c)if s:find(c,i)then s=s:gsub(c,'')else i=i+1 end end)print(s)
于 2010-11-18T11:37:21.667 に答える
1

多幸感

かなり冗長な言語の 165 文字。

object c=getc(0),r={},b=r
while c>0 do
if find(c,r)then b&=c end if
r&=c
c=getc(0)
end while
for i=1 to length(r)do
if find(r[i],b)=0 then puts(1,r[i])end if
end for
于 2009-08-31T15:44:36.233 に答える
0

ルア、97文字

i=...repeat c=i:match("(.).-%1")i=c and i:gsub(c:gsub("(%W)","%%%1"),"")or i until not c print(i)
于 2010-02-10T22:40:12.180 に答える
0

Dプログラミング言語バージョン2、68文字:

auto f(S)(S s){return array(filter!((a){return s.count(a)<2;})(s));}
于 2010-02-10T23:00:39.390 に答える
0

Python、50文字(SHINKiROU 67文字版に基づく)

f=lambda s:''.join([c for c in s if s.count(c)<2])
于 2010-10-02T16:29:28.020 に答える
0

F#、94 文字

let f(a:string)=new string(Seq.toArray(Seq.filter(fun(c:char)->a.IndexOf c=a.LastIndexOf c)a))
printfn "%s" (f "nbHHkRvrXbvkn")
于 2010-08-31T00:23:30.100 に答える
0

ASL: 23

args1[;{},,\=/+1=]""z P

ASL は、私が作成した Golfscript にインスパイアされたスクリプト言語です。

于 2011-02-05T15:56:11.097 に答える
0

F#、リストを使用する非コード ゴルフ バージョン:

リストを使用した 16 行:

let rec removefromlist v l = 
    match l with 
    | h::t -> 
        let (res, removed) = removefromlist v t
        if h = v then (res, true)
        else (h::res, removed)
    | [] -> ([], false)
let rec removedups unique tail = 
    match tail with
    | h::t -> 
        let (u_res, u_removed) = removefromlist h unique
        let (t_res, t_removed) = removefromlist h t
        if (t_removed || u_removed) then removedups u_res t_res
        else h::removedups u_res t_res
    | [] -> []
removedups [] (Array.toList("nbHHkRvrXbvkn".ToCharArray()));;

F# - 185 文字- リストのないより簡潔なバージョン:

let s = "nbHHkRvrXbvkn"
let n c (s:string)=
    let mutable i = 0
    for x in 0..s.Length-1 do
        if s.[x]=c then i<-i+1
    i
String.collect (fun c -> if n c s>1 then "" else c.ToString()) s
于 2010-02-12T10:34:36.767 に答える
0

OCaml、93 文字(wc -c)。

open String
let f s=let r=ref""in iter(fun c->if not(contains!r c)then r:=!r^(make 1 c))s;!r
于 2010-08-30T14:09:57.013 に答える
0

GW-BASIC - 117 文字

1INPUT I$:FOR I=1 TO LEN(I$):S$=MID$(I$,I,1):C=0
2P=INSTR(P+1,I$,S$):C=C-(P>0):IF P GOTO 2
3IF C=1 THEN ?S$;
4NEXT
于 2010-03-11T06:34:08.113 に答える
0
#!/usr/bin/python

# Python, 67 characters, in a giant generator.
f=lambda s:''.join([c for c in s if len([d for d in s if d==c])<2])

string = "nbHHkRvrXbvkn"
print f(string) => "RrX"
于 2010-08-30T23:11:44.797 に答える
-2

私は元の答えを見つけることができませんでしたが、Jon Skeet の答えの精神で:

ストリップ:

RSP

このプログラムの意味は次のとおりです。標準入力から文字列を読み取り (R)、重複する文字をすべて取り除き (S)、結果を stdout に出力します (P)。

于 2009-08-28T00:32:38.137 に答える