挑战:按字符数计算的最短代码,用于检测和删除字符串中的重复字符.删除包括重复字符的所有实例(因此,如果您找到3个n,则所有三个必须去),并且需要保留原始字符顺序.
示例输入1:
nbHHkRvrXbvkn示例输出1:
RrX
示例输入2:
nbHHkRbvnrXbvkn示例输出2:
RrX
(第二个示例删除三次出现的字母;某些解决方案未能解释此问题)
(这是基于我的另一个问题,我需要以最快的方式在C#中执行此操作,但我认为它可以在各种语言中实现良好的Code Golf.)
Fra*_*ack 38
一个字符,即程序框图中的蓝色常量" 1 ".我发誓,输入是复制和粘贴;-)
http://i25.tinypic.com/hvc4mp.png
http://i26.tinypic.com/5pnas.png
Wil*_*ell 26
perl的21个字符,31个调用,36个键击(计数移位和最终返回):
perl -pe's/$1//gwhile/(.).*\1/'
Run Code Online (Sandbox Code Playgroud)
Jer*_*ten 19
统治者说,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岁
Ale*_*lec 18
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'库中的标准动词也会两次.
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.
这个方法使用的方法与我原来的答案完全不同.有趣的是,在写完之后再看另一个答案时,我看到方法非常相似.咖啡馆在我面前提出这种方法的积分.
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字节.
这是我原来的答案.正如评论中所说,它不太好用......
#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字节.
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)
new string(input.GroupBy(c => c).Where(g => g.Count() == 1).ToArray());
Run Code Online (Sandbox Code Playgroud)
71个字符
<?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字节.
作为动态功能(18个字符)
{(1+=/¨(???¨?))/?}
Run Code Online (Sandbox Code Playgroud)
假设输入是变量x(16个字符)的行:
(1+=/¨(x??¨x))/x
Run Code Online (Sandbox Code Playgroud)
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个字符.
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)
#include未处理<stdio.h>(成本为18个字符),使得返回类型gets被解释为int并切断一半的地址位)..
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)
)
.`{\{=}+,,(!}+,
+-------------------------------------------------------------------------+
|| | | | | | | | | | | | | | | |
|0 10 20 30 40 50 60 70 |
| |
+-------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)