Code Golf:字符串中的重复字符删除

Ale*_*lex 30 code-golf

挑战:按字符数计算的最短代码,用于检测和删除字符串中的重复字符.删除包括重复字符的所有实例(因此,如果您找到3个n,则所有三个必须去),并且需要保留原始字符顺序.

示例输入1:
nbHHkRvrXbvkn

示例输出1:
RrX


示例输入2:
nbHHkRbvnrXbvkn

示例输出2:
RrX

(第二个示例删除三次出现的字母;某些解决方案未能解释此问题)

(这是基于我的另一个问题,我需要以最快的方式在C#中执行此操作,但我认为它可以在各种语言中实现良好的Code Golf.)

Fra*_*ack 38

LabVIEW 7.1

一个字符,即程序框图中的蓝色常量" 1 ".我发誓,输入是复制和粘贴;-)

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

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

  • 嗯 - 保存时生成的vi究竟有多大?;) (5认同)
  • +1,因为流程图元素不算作字符. (3认同)

Wil*_*ell 26

Perl的

perl的21个字符,31个调用,36个键击(计数移位和最终返回):

perl -pe's/$1//gwhile/(.).*\1/'
Run Code Online (Sandbox Code Playgroud)

  • 该死的,我不知道Perl会让你逃脱/// gwhile`.那有点荒谬. (5认同)

Jer*_*ten 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]}
Run Code Online (Sandbox Code Playgroud)

...... Nakilon的35岁

  • 像统治者:) (54认同)

Ale*_*lec 18

APL

23个字符:

(((1+?x)-(?x)?x)=x?x)/x
Run Code Online (Sandbox Code Playgroud)

我是一名APL新手(昨天学会了),所以请善待 - 这当然不是最有效的方式.我很惭愧我没有打败Perl.

然后,也许它说了一些事情,当新手在APL中解决这个问题的最自然的方式仍然比任何语言中的任何其他解决方案更简洁.


rec*_*ive 15

蟒蛇:

s=raw_input()
print filter(lambda c:s.count(c)<2,s)
Run Code Online (Sandbox Code Playgroud)

这是一个完整的工作程序,可以读取和写入控制台.可以从命令行直接使用单行版本

python -c 's=raw_input();print filter(lambda c:s.count(c)<2,s)'
Run Code Online (Sandbox Code Playgroud)


MPe*_*ier 14

J(16 12个字符)

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

例:

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

它只需要默认执行括号.如果放入动词,实际代码本身将是14个字符.

肯定有更明智的方法可以做到这一点.

编辑:更聪明的方式:

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

12个字符,如果设置为动词,则只有10个字符.我仍然讨厌这样一个事实:它通过列表两次,一次计数(#/.)而另一次返回uniques(nub或〜.),但即使是nubcount,'misc'库中的标准动词也会两次.

  • 用12个字符做的另一种方法是`(] -.-.@〜:#])`,其优点是只能通过列表一次.它只是从列表中复制nubsieve的"not",然后从列表中删除这些元素. (2认同)

Mar*_*off 12

哈斯克尔

在Haskell中执行此操作肯定有更短的方法,但是:

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

忽略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
Run Code Online (Sandbox Code Playgroud)

或者我们可以这样敲掉一个角色:

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

$ echo "nbHHkRvrXbvkn" | runghc tmp2.hs
RrX

$ wc -c tmp2.hs
53 tmp2.hs
Run Code Online (Sandbox Code Playgroud)

它在所有 stdin上运行,而不是逐行运行,但这似乎是可接受的IMO.


str*_*ger 9

C89(106个字符)

这个方法使用的方法与我原来的答案完全不同.有趣的是,在写完之后再看另一个答案时,我看到方法非常相似.咖啡馆在我面前提出这种方法的积分.

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);}
Run Code Online (Sandbox Code Playgroud)

在一行上,它是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);}
Run Code Online (Sandbox Code Playgroud)

在两行上,它是17 + 1 + 78 + 77 = 173字节.

  • +1使用其中一种较难的语言 (2认同)

Dyk*_*kam 8

C#

65个字符:

new String(h.Where(x=>h.IndexOf(x)==h.LastIndexOf(x)).ToArray());
Run Code Online (Sandbox Code Playgroud)

67个重新分配的字符:

h=new String(h.Where(x=>h.IndexOf(x)==h.LastIndexOf(x)).ToArray());
Run Code Online (Sandbox Code Playgroud)


Bry*_*tts 7

C#

new string(input.GroupBy(c => c).Where(g => g.Count() == 1).ToArray());
Run Code Online (Sandbox Code Playgroud)

71个字符

  • System.String实现IEnumerable <char>,因此它具有GroupBy方法.IDE为字符串上的扩展方法做了一个例外,并没有显示它们,但是它们编译并运行得很好. (5认同)

str*_*ger 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')));
Run Code Online (Sandbox Code Playgroud)

在一行上,它是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;})));
Run Code Online (Sandbox Code Playgroud)

那是5 + 1 + 66 + 59 = 131字节.


dav*_*ieb 6

另一个APL解决方案

作为动态功能(18个字符)

{(1+=/¨(???¨?))/?}
Run Code Online (Sandbox Code Playgroud)

假设输入是变量x(16个字符)的行:

(1+=/¨(x??¨x))/x
Run Code Online (Sandbox Code Playgroud)


BP.*_*BP. 5

VB.NET

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

当然,VB不是尝试保存字符的最佳语言,但该行的出现是98个字符.


Eri*_*ver 5

电源外壳

61个字符.结果在哪里$s="nbHHkRvrXbvkn"$a结果.

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

功能完备的参数化脚本:

param($s)
$h=@{}
($c=[char[]]$s)|%{$h[$_]++}
$c|%{if($h[$_]-eq1){$a+=$_}}
$a
Run Code Online (Sandbox Code Playgroud)


ken*_*ytm 5

C:83 89 93 99 101 人物

  • O(n 2)时间.
  • 限于999个字符.
  • 仅适用于32位模式(由于#include未处理<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);}
Run Code Online (Sandbox Code Playgroud)

(这个类似的82 -chars版本通过命令行输入:

main(char*c,char**S){for(c=*++S;*c;c++)strchr(*S,*c)-strrchr(*S,*c)||putchar(*c);}
Run Code Online (Sandbox Code Playgroud)

)


Joh*_*ooy 5

Golfscript(sym) - 15

  .`{\{=}+,,(!}+,
+-------------------------------------------------------------------------+
||    |    |    |    |    |    |    |    |    |    |    |    |    |    |  |
|0         10        20        30        40        50        60        70 |
|                                                                         |
+-------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)