文字列内の一意の文字を見つけることは非常に一般的なユースケースのようであるため、この質問に思いつきました。しかし、それらを取り除きたい場合はどうでしょうか?
入力には小文字のアルファベットのみが含まれます。aからzの文字のみが使用されます。入力長は1〜1000文字です。
例:
入力:helloworld
出力:llool
目的:最短のコード
が優先言語:TIOBE言語の上位20のいずれか
文字列内の一意の文字を見つけることは非常に一般的なユースケースのようであるため、この質問に思いつきました。しかし、それらを取り除きたい場合はどうでしょうか?
入力には小文字のアルファベットのみが含まれます。aからzの文字のみが使用されます。入力長は1〜1000文字です。
例:
入力:helloworld
出力:llool
目的:最短のコード
が優先言語:TIOBE言語の上位20のいずれか
回答:
s/./$&x(s!$&!$&!g>1)/eg
使用法:
> perl -pe 's/./$&x(s!$&!$&!g>1)/eg'
helloworld
llool
最初はネガティブな先読みとネガティブな後読みでこれができると思っていましたが、ネガティブな後読みは固定長でなければならないことがわかりました。そこで、代わりにネストされた正規表現を使用しました。おかげでは暴徒のための$&
ヒント。
-CDS
オプション
$1
と$&
、括弧のペアが2つなくなる可能性があります。
:;{.;?);>?)},
GolfScriptはトップ20の1つではありませんが、GolfScriptのないコードゴルフ...(自分で実行してください)
以前のバージョン:(スクリプトを実行)
1/:;{;\-,;,(<},
:;
?あなたは意図的に初心者を混乱させようとしていますよね?;)
)
でした-それはそれからそれをスマイリーにするでしょう:)
。残念ながら、数字1を削除する方法さえ見つけられませんでした(GolfScript初心者向けの注意:;
コード内x
の文字を(または他の文字や数字-またはスクリプトで使用されていない文字)に置き換えることができます)。この特殊なケースで;
は単なる変数名であり、「ポップアンド破棄」という意味はありません。GolfScriptでは、ほとんどすべてのトークンが変数であり、事前定義されたシンボルを使用すると、スクリプトを部外者にとってさらに読みにくくすることができます;-)。)
:a{]a.@--,(},
:x{{=}+x\,,(},
Might not qualify to win, but it's useful to have a yardstick.
gets.chars{|c|$><<c if$_.count(c)>1}
s
and use $_
for the second appearance (the space before is then dispensable).
I didn't expect it to be so short.
2.7: a=raw_input();print filter(lambda x:a.count(x)>1,a)
3.0: a=input();print''.join(i for i in a if a.count(x)>1)
raw_input()
: store input as a string (input()
= eval(raw_input())
)
(Python 3.0: input()
has been turned into raw_input()
)
filter(lambda x:a.count(x)>1,a)
:
Filter through all characters within a
if they are found in a
more than once (a.count(x)>1
).
input()
rather than raw_input()
. Although you have to add one character for a closing bracket, since print
is a function in python 3.
''.join(...)
Granted this is not part of the TIOBE list, but it's fun (-:
<<<$s sed 's/./&\n/g'|head -c -1|sort|uniq -c|sed -n 's/^ *1 (.*)/\1/p'|tr -d '\n'|sed 's:^:s/[:; s:$:]//g\n:'|sed -f - <(<<<$s)
De-golfed version:
s=helloworld
<<< $s sed 's/./&\n/g' \
| head -c -1 \
| sort \
| uniq -c \
| sed -n 's/^ *1 (.*)/\1/p' \
| tr -d '\n' \
| sed 's:^:s/[:; s:$:]//g\n:' \
| sed -f - <(<<< $s)
The first sed converts input into one character per line. The second sed finds characters that only occur once. Third sed writes a sed script that deletes unique characters. The last sed executes the generated script.
⊇.oḅlⁿ1∧
Function submission. Technically noncompeting because the question has a limitation on what langauges are allowed to compete (however, several other answers have already ignored the restriction).
⊇.oḅlⁿ1∧
⊇ Find {the longest possible} subset of the input
o {for which after} sorting it,
ḅ and dividing the sorted input into blocks of identical elements,
lⁿ1 the length of a resulting block is never 1
. ∧ Output the subset in question.
Here's another (few chars longer) alternative in Python:
a=raw_input();print''.join(c for c in a if a.count(c)>1)
If you accept output as a list (e.g. ['l', 'l', 'o', 'o', 'l']
), then we could boil it down to 49 characters:
a=raw_input();print[c for c in a if a.count(c)>1]
>1
is a good idea! May I incorporate that into my solution?
@x=split//,<>;$s{$_}++for@x;for(@x){print if($s{$_}>1)}
Reads from stdin.
Uses ExtLib's ExtString.String
open ExtString.String
let f s=let g c=fold_left(fun a d->a+Obj.magic(d=c))0 s in replace_chars(fun c->if g c=1 then""else of_char c)s
Non-golfed version
open ExtString.String
let f s =
let g c =
fold_left
(fun a c' -> a + Obj.magic (c' = c))
0
s
in replace_chars
(fun c ->
if g c = 1
then ""
else of_char c)
s
The function g
returns the number of occurences of c in the string s. The function f
replaces all chars either by the empty string or the string containing the char depending on the number of occurences. Edit: I shortened the code by 6 characters by abusing the internal representation of bools :-)
Oh, and ocaml is 0 on the TIOBE index ;-)
while($x<strlen($s)){$c=$s[$x];echo substr_count($s,$c)>1?$c:'';$x++;}
with asumption $s = 'helloworld'.
s->{for(char c=96;++c<123;s=s.matches(".*"+c+".*"+c+".*")?s:s.replace(c+"",""));return s;}
Explanation:
s->{ // Method with String as both parameter and return-type
for(char c=96;++c<123; // Loop over the lowercase alphabet
s=s.matches(".*"+c+".*"+c+".*")?
// If the String contains the character more than once
s // Keep the String as is
: // Else (only contains it once):
s.replace(c+"","")); // Remove this character from the String
return s;} // Return the modified String
"$args"-replace"[^$($args|% t*y|group|?{$_.Count-1}|% n*)]"
Less golfed:
$repeatedСhars=$args|% toCharArray|group|?{$_.Count-1}|% name
"$args"-replace"[^$repeatedСhars]"
Note: $repeatedChars
is an array. By default, a Powershell joins array elements by space char while convert the array to string. So, the regexp contains spaces (In this example, [^l o]
). Spaces do not affect the result because the input string contains letters only.
Anonymous tacit prefix function.
∊⊢⊆⍨1<⍧⍨
⍧⍨
count-in selfie (count occurrences of argument elements in the argument itself)
1<
Boolean mask where one is less than that
⊢⊆⍨
partition the argument by that mask (beginning a new partition on 1s and removing on 0s)
∊
ϵnlist (flatten)
s=>[...s].filter(c=>s.match(c+'.*'+c)).join``
a=utf8ToInt(scan(,''));intToUtf8(a[!a%in%names(table(a)[table(a)<2])])
A poor attempt, even from a TIOBE top 20 language. I know something can be done about the second half, but at the moment, any golfs escape me.
Input as a string, output as a character array.
s=>[...s].filter(x=>s.split(x)[2])
map
: tio.run/##BcExDoAgDADAvzgYOtjBHT9CTCSICqmUWKL8vt5l/…
p=>[...p].map((v,i,a)=>a.filter(f=>f==v).length).reduce((a,c,i)=>c>1?a+=p[i]:a,[])
.join``
instead of .join("")
.
Code
implode('',array_intersect(str_split($text),array_flip(array_filter(array_count_values(str_split($text)),function($x){return $x>=2;}))));
Normal Code
$text = 'helloworld';
$filter = array_filter(array_count_values(str_split($text)), function($x){return $x>=2;});
$output = implode('',array_intersect(str_split($text),array_flip($filter)));
echo $output;
PHP - 83 78
<?for($a=$argv[1];$i<strlen($a);$r[$a[$i++]]++)foreach($ras$k=>$c)if($c>1)echo$k
Improved version:
<?for($s=$argv[1];$x<strlen($s);$c=$s[$x++]) echo substr_count($s,$c)>1?$c:'';
Of course this needs notices to be turned off
Edit: Improvement inspired by @hengky mulyono
I am so bad at codegolf :)
string s;cin>>s;string w{s}; auto l=remove_if(begin(s),end(s),[&w](auto&s){return count(begin(w),end(w),s)==1;});s.erase(l,end(s));cout<<s;
ungolfed:
#include <algorithm>
#include <string>
#include <iostream>
int main() {
using namespace std;
string s;
cin >> s;
const string w{s};
auto l = remove_if(begin(s), end(s), [&w](auto& s) {
return count(begin(w), end(w), s) == 1;
});
s.erase(l, end(s));
cout << s;
return 0;
}