タイプuniqchars!


41

印刷可能なASCII文字で構成される文字列を指定すると、元の順序で一意の文字で構成される出力が生成さます。つまり、出力は入力と同じですが、以前に現れた文字が削除される点が異なります。

配列内の一意の要素を見つけるための組み込みunique関数は使用できません(たとえば、MATLABにはそれを行う関数があります)。アイデアは、手動で行うことです。

詳細:

  • 関数またはプログラムのいずれかが許可されます。
  • 入力と出力は、関数の引数、stdin / stdout(関数の場合でも)、またはそれらの組み合わせの形式にすることができます。
  • stdinまたはstdoutが使用される場合、文字列は単なるcharsシーケンスとして理解されます。関数の引数を使用する場合、選択したプログラミング言語が文字列の定義に使用する引用符または同等の記号で文字のシーケンスを囲む必要があります。
  • 出力は、入力の一意の文字のみを含む文字列である必要があります。したがって、余分な改行、スペースなどはありません。唯一の例外は、出力が標準出力に表示される場合、ほとんどの表示機能は末尾を追加します\n(次に来る文字列から文字列を分離するため)。したがって、stdoutでは1つの末尾\nを使用できます。
  • 可能であれば、他の人があなたのコードを試すことができるように、オンラインのインタプリタ/コンパイラへのリンクを投稿してください。

これはコードゴルフであるため、バイト単位の最短コードが優先されます。

stdinとstdoutを想定したいくつかの

  1. 入力文字列:

    Type unique chars!
    

    出力文字列:

    Type uniqchars!
    
  2. 入力文字列

    "I think it's dark and it looks like rain", you said
    

    出力文字列

    "I think'sdarloe,yu
    
  3. 入力文字列

    3.1415926535897932384626433832795
    

    出力文字列

    3.14592687
    

5
再確認してください:no builtinsルールは、セットオブジェクトが許可されないことを意味しますか?
Sp3000

@ Sp3000 Setオブジェクトが許可されます。独自の要素を提供する関数またはメソッド(存在する場合)を使用しないでください。また、入力/出力は、tobjectを設定するのではなく、文字列にする必要があります
ルイスメンドー

@ Sp3000セット関数が使用されない場合、バイト数を半分に減らすことがより面白くなると思いますか?または、チャレンジが設定されたらルールを変更しない方がよいでしょうか?
ルイスメンドー

5
現在、私の答えだけがセットを使用していると思います。あなたがそれを変更しても気にしません。ただし、そのようなボーナスが大きく変わるかどうかはよくわかりません。たとえば、CJamはセットなしで6バイト未満で実行できるとは思えません。また、一意の要素を検出する
ビルトインと

1
@ Sp3000はい、ぼやけた境界線です。セット関数を予想していませんでした。私は今のまま挑戦を残すと思います
ルイスメンドー

回答:


13

GolfScript、2バイト

.&

または、代わりに:

.|

これは少し前に、GolfScriptスレッドでのゴルフヒントに投稿しました。入力文字列(GolfScriptインタープリターによって自動的にスタックに配置され、ほとんどの方法で文字の配列のように動作する)を複製し、それ自体とセットの交差(&)またはユニオン(|)を取ることによって機能します。配列(または文字列)にセット演算子を適用すると、重複がすべて折りたたまれますが、要素の順序は保持されます。


23

CJam、3バイト

qL|

Setwiseまたは空のリストを持つ入力の。CJamのセット操作では、要素の順序が保持されます。

オンラインで試す


セットが許可されているため、これは有効であると考えていますが、よく
わかり

非常に賢い!CJamが最高の1つになることはわかっていましたが、3バイトしか期待していませんでした!
ルイスメンドー

19

C#6、18 + 67 = 85バイト

次のusingステートメントが必要です。

using System.Linq;

実際の方法:

string U(string s)=>string.Concat(s.Where((x,i)=>s.IndexOf(x)==i));

このメソッドは、C#6でサポートされているlambdaとして関数を定義することによりいくつかの文字を節約します。これは、C#pre-6での外観です(ただし、変更されません)。

string Unique(string input)
{
    return string.Concat(input.Where((x, i) => input.IndexOf(x) == i));
}

仕組み:文字列のWhereメソッドx、現在の要素をi表すラムダと、その要素のインデックスを表すラムダで呼び出します。IndexOfは常に渡されたcharの最初のインデックスを返します。したがってi、の最初のインデックスと等しくない場合x、それは重複するcharであり、含まれてはなりません。


3
正直なところ、C#がこれほど短いとは思わなかったでしょう。よくできました!
アレックスA.

うん 完全なプログラム(static void Mainなど)を提出する必要があると思います。
ティムウィ

3
@Timwiこのチャレンジは、「どちらの機能またはプログラムも許可されます」と述べています。
hvd

C#では、LINQを使用した短いアプローチも可能です。競合する回答を投稿しました。:)
hvd

@hvdいいね!+1
ProgramFOX

14

網膜、14バイト

+`((.).*)\2
$1

各行は個別のファイルに入れるか、-sフラグを使用して1つのファイルから読み取ることができます。

それを説明するために、この長くてシンプルなバージョンを使用します。

+`(.)(.*)\1
$1$2

最初の行は、一致する正規表現です(+`すべての置換が行われるまで実行を続ける構成文字列です)。正規表現は文字(Cと呼びます)を探し、その後に0個以上の任意の文字が続き、Cが続きます。括弧はキャプチャグループを示すため、一致をC($1)およびその間の文字()に置き換えます$2。 Cの重複を削除します。

たとえば、入力文字列がのunique場合、最初の実行はuniqu、with uおよびniqas $1および$2にそれぞれ一致します。その後で、元の入力にマッチした部分文字列を置き換えますuniq与え、uniqe


3
これを行う正規表現を探していました。こんなに短いとは知らなかった!+1
ETHproductions

13

Perl、21(20バイト+ -p

s/./!$h{$&}++&&$&/eg

使用法:

perl -pe 's/./!$h{$&}++&&$&/eg' <<< 'Type unique chars!'
Type uniqchars!

1
1バイトを否定$h{$&}し、3項演算子の代わりに論理ANDを使用して保存できますs/./!$h{$&}++&&$&/eg
。– kos

@kosあなたが私に尋ねたなら、私はあなたが100%これを試し1て、出力でsになったとあなたに言ったでしょうが、そうではありません!更新していただきありがとうございます!
ドムヘイスティングス

1
すでに賛成:)あなたが試してみたと思いますs/./$h{$&}++||$&/eg(私も最初はそのために落ちました)それは別の保存されたバイトだったので恥。
コス

11

マカロニ0.0.2、233バイト

set i read set f "" print map index i k v return label k set x _ set _ slice " " length index f e 1 1 set f concat f wrap x return label e set _ slice " " add _ multiply -1 x 1 1 return label v set _ unwrap slice i _ add 1 _ 1 return
  • 「ゴルフ対策」言語の作成:チェック
  • とにかくゴルフ:チェック

これは完全なプログラムで、STDINから入力し、STDOUTに出力します。

美的価値のためのラップバージョン:

set i read set f "" print map index i k v return label k set x _ set _ slice "
" length index f e 1 1 set f concat f wrap x return label e set _ slice " " add
_ multiply -1 x 1 1 return label v set _ unwrap slice i _ add 1 _ 1 return

そして、非常に「コメント化」されていないバージョン(マカロニにはコメントがありませんので、私はただ裸の文字列リテラルを使用します):

set input read                  "read line from STDIN, store in 'input' var"
set found ""                    "we need this for 'keep' below"
print map index input keep val  "find indeces to 'keep', map to values, print"
return

label keep
    "we're trying to determine which indeces in the string to keep. the special
     '_' variable is the current element in question, and it's also the value
     to be 'returned' (if the '_' variable is '0' or empty array after this
     label returns, the index of the element is *not* included in the output
     array; otherwise, it is"
    set x _ set _ slice
        " "
        length index found exists
        1
        1
    "now we're using 'index' again to determine whether our '_' value exists in
     the 'found' array, which is the list of letters already found. then we
     have to apply a boolean NOT, because we only want to keep values that do
     NOT exist in the 'found' array. we can 'invert' a boolean stored as an
     integer number 'b' (hence, 'length') with 'slice(' ', b, 1, 1)'--this is
     equivalent to ' '[0:1], i.e. a single-character string which is truthy, if
     'b' was falsy; otherwise, it results in an empty string if 'b' was truthy,
     which is falsy"
    set found concat found wrap x  "add the letter to the 'found' array"
return

label exists
    set _ slice
        " "
        add _ multiply -1 x
        1
        1
    "commentary on how this works: since 0 is falsy and every other number is
     truthy, we can simply subtract two values to determine whether they are
     *un*equal. then we apply a boolean NOT with the method described above"
return

label val
    set _ unwrap slice input _ add 1 _ 1  "basically 'input[_]'"
return

(これは最初の実際のマカロニプログラムです(実際に何かを行います)!\ o /)


5
•言語に面白くて適切な名前を付けます。チェック
ルイスメンドー

11

JavaScriptのES7、37の 33 25バイト

ES6 SetおよびES7 配列内包表記演算子を使用した非常に簡単なアプローチ:

s=>[...new Set(s)].join``

indexOfアプローチより22バイト少ない。少数のテストケースで作業しました。


の周囲forのスペースは不要であり、他のソリューションが行ったように匿名関数にすることもできますs=>[for(c of Set(s))c].join``。(淡い更新:100%確実ではありませんが、newキーワードも不要なようです。)
manatwork

匿名関数のルールがわからず、スペースを十分にキャッチしていました。
azz

なしコードをTranspiled newもたらしUncaught TypeError: Constructor Set requires 'new'Google Chromeで。
azz

私の無知を許してください。しかし、このフィルターはどの時点で一意の値をフィルターしますか?文字列を配列へのセットに変換し、値を結合して元の文字列に戻すように見えます。
パトリックロバーツ

@PatrickRobertsそれはセットへの変換です。定義により、セットにはdupluicatesを持っていない
edc65

8

C#6-18 + 46 = 64

using System.Linq;

その後

string f(string s)=>string.Concat(s.Union(s));

Enumerable.Union要素は元の順序で返される拡張メソッドを指定:

このメソッドによって返されるオブジェクトが列挙されると、Union はその順序で最初2番目を列挙し、まだ生成されていない各要素を生成します。

一意の値を見つけることを特に意図していない集合演算は、他の答えによって判断できるように見えます。


いいですね、私は考えていましたがstring u(string s)=>String.Join("",s.Distinct());、それはもう少し長くなります。
ジェミ

@germiありがとう。Distinct()既に使用している回答がありますが、Distinct()一意の値を見つけることを特に意図した方法であるため、このチャレンジでは許可されないため削除されました。
hvd

ああ右...そのビットを見落とした;)
germi

あるs => string.Concat(s.Union(s))有効?これはFunc<string, string>、引数としてaに渡されるデリゲートです。
タイラーStandishMan

@TylerStandishManもしそれが有効であれば、もっと多くの人がそれを利用することを期待します。そして、私はそれを見たことがありませんので、そうは思わないでしょう。しかし、おそらくそれは有効なはずです-これは、興味があるならMetaをチェックする価値があるように思えます。
hvd

7

JavaScript ES6、47バイト

f=s=>s.replace(/./g,(e,i)=>s.indexOf(e)<i?'':e)

以下のテストは、すべてのブラウザーで機能します。

f=function(s){
  return s.replace(/./g,function(e,i){
    return s.indexOf(e)<i?'':e
  })
}

run=function(){document.getElementById('output').innerHTML=f(document.getElementById('input').value)};document.getElementById('run').onclick=run;run()
<input type="text" id="input" value="Type unique chars!" /><button id="run">Run</button><br />
<pre id="output"></pre>


この<i?'':e部分は何をしますか?
DanTheMan

1
三項演算子です。文字の最初のインスタンスがe現在のindexの前にあるi場合、空の文字列を返し、文字を取り除きます。それが最初のインスタンスである場合、単に戻りe、変更は行われません。
-NinjaBearMonkey

7

MATLAB、23

 @(n)union(n,n,'stable')

ソートせずに出力する 'stable'メソッドを使用して、入力文字列の「結合を設定」します。

これが機能するのは unionは、マージ後に重複しない値のみを返すです。したがって、本質的にunion文字列自体を使用する場合、最初にのような文字列を生成し、Type unique chars!Type unique chars!次にソートせずにすべての重複を削除します。

必要ありませんunique:)


unique許可されていません、ごめんなさい!それは挑戦的な定義です
ルイスメンドー

それを逃した、気にしないでください。
トムカーペンター

Sp3000の答えに続いsetdiffて、'stable'オプションを提案できますか?
ルイスメンドー

1
いいね!はい、削除できdispます。文字列を返す関数があるため、許可されています
ルイスメンドー

1
intersectwith 'stable'を使用して、同じ効果を実現することもできます。私はそれを書くつもりでしたが、この答えを与えられて、それはもはやオリジナルではありません。
rayryeng-モニカの復元15年

7

> <>、16バイト

i:0(?;:::1g?!o1p

> <>には文字列がないため、コードボックスを使用します。> <>のドーナツ型の性質により、次のループが実行されます。

i         Read a char
:0(?;     Halt if EOF
:::       Push three copies of the char
1g        Get the value at (char, 1), which is 0 by default
?!o       Print the char if the value was nonzero
1p        Set the value at (char, 1) to char

これは、ASCII 0が存在する場合は機能しないため、入力には印刷可能なASCIIのみが含まれるという事実を使用することに注意してください。


1
.......これは素晴らしい。これを考えていたらよかったのに。私はこれにBefungeバージョンを回答に含めますが、プライマリとしてではありません。編集:考え直して、Befungeには無限のコードスペースがないため、これは機能しません。ダンギット!
エレンディアスターマン

@ El'endiaStarman ビームの答えも同じことをするので、残念ながら私が最初だったとは言えません:P
Sp3000

ああ、そう、あなたは正しいと思う。ただし、説明はより明確です。
エレンディアスターマン


5

要素22 19 18バイト

_'{"(3:~'![2:`];'}

入出力の例:hello world->helo wrd

これは、一度に1文字ずつ文字列を処理し、以前に見た文字を追跡することで機能します。

_'{"(3:~'![2:`];'}
_                        input line
 '                       use as conditional
  {              }       WHILE loop
   "                     retrieve string back from control (c-) stack
    (                    split to get the first character of (remaining) string
     3:                  a total of three copies of that character
       ~                 retrieve character's hash value
        '                put on c-stack
         !               negate, gives true if undef/empty string
          [   ]          FOR loop
           2:`           duplicate and output
               ;         store character into itself
                '        put remaining string on c-stack as looping condition


4

Python 3、44

r=''
for c in input():r+=c[c in r:]
print(r)

出力文字列を1 r文字ずつ作成します。c入力からの文字を含めますが、まだ表示されていない場合のみです。

Python 2は47で、4文字を失い、raw_input1を節約しprintます。


現在、コンセンサスはinput、Python 2で使用できるので、自分のバイトを1バイト短くすることができます。
mbomb007

4

APL、3

∊∪/

これにより、ベクトルの各要素間にユニオン(∪)が適用され、重複を削除する効果を持つ反復が取得されます。

tryapl.orgでテストする

古いもの:

~⍨\

これは、引数の各要素間に適用される〜(引数を逆にして、⍨を使用)を使用します。その結果、各要素について、既にリストにある場合は消去されます。


Nitpicking:「そして入出力は文字列でなければなりません」とLuisは言います。「Unione reduce」は、文字列ではなく、ネストされた配列を返します。O :-)
lstefano

あなたが正しい、修正するために先頭に∊を追加します。
モリスズッカ

3

Perl、54 27バイト

map{$h{$_}||=print}<>=~/./g
123456789012345678901234567

テスト:

$ echo Type unique chars! | perl -e 'map{$h{$_}||=print}<>=~/./g'
Type uniqchars!
$

1
print exists($h{$_})?"":$_$h{$_}||print
マナトワーク

SOはそこにunicode→charを挿入して、それを壊れた状態にしましたか?
スティーブ

1
文の修飾子を使用すると、あなたにいくつかを救うmanatworkの提案@とともに、バイト$h{$_}||=printや使用<>=~/./gだけでなく、いくつかのより多くの節約に役立つはず!
ドムヘイスティングス

1
いいえ、「変更する」という意味で挿入しました。
マナトワーク

1
に変更するmapと、節約も改善されます map{$h{$_}||=print}<>=~/./g
。– manatwork

3

PHP、72バイト 84バイト

<?foreach(str_split($argv[1])as$c)$a[$c]=0;echo join('',array_keys($a));

文字を連想配列のキーとして使用し、キーを出力します。配列要素の順序は常に挿入の順序です。

str_split提案してくれたIsmael Miguelに感謝します。


1
<?foreach(str_split($argv[1])as$c)$a[$c]=0;echo join('',array_keys($a));より短く、同じことをします。
イスマエルミゲル

より短いループが見つかりました:while($c=$argv[1][$i++*1])。これは全体を置き換えforeachます。他のすべては同じです
イスマエルミゲル

最初に似たようなことを試みましたが、「false」に強制される文字で停止するため、それを控えました"0"。入力として「abc0def」を試してください。
ファビアンシュメングラー

あなたはそれについて正しいです。Surellyには、2バイト以上のコストがかからない回避策があります。
イスマエルミゲル

3

Pyth、7バイト

soxzN{z

擬似コード:

z =入力

zの集合に対するNのzの順序別インデックスの合計。


3

ジュリア、45 42バイト

s->(N="";[i∈N?N:N=join([N,i])for i=s];N)

旧版:

s->(N={};for i=s i∈N||(N=[N,i])end;join(N))

コードは、新しい文字列を追加して新しい文字列を作成joinし、最後に適切な文字列にまとめます。新しいバージョンでは、配列内包を介して反復することで一部の文字が保存されます。また?:||(割り当てを囲む括弧が不要になるため)ではなく、を使用してバイトを保存します。

再帰と正規表現を使用した代替ソリューション、45バイト:

f=s->s!=(s=replace(s,r"(.).*\K\1",""))?f(s):s

ジュリア、17バイト

(代替バージョン)

s->join(union(s))

これはunion基本的に代わりに使用しますunique-私はこれを「本当の」答えとは見なしません。unique「使用しない」と解釈して、「要素」。


私は似たようなアイデアを持っていましたが、それほど簡潔ではありませんでした。よくやった!
アレックスA.

3

Java、78バイト

String f(char[]s){String t="";for(char c:s)t+=t.contains(c+"")?"":c;return t;}

すでに存在する文字の出力をチェックしている間の単純なループ。入力を受け入れますchar[]


3

C、96バイト

#include<stdio.h> 
int c,a[128];main(){while((c=getchar())-'\n')if(!a[c])a[c]=1,putchar(c);}

これは、ASCII文字番号でインデックス付けされた整数の配列を使用します。文字は、配列内のその場所がFALSEに設定されている場合にのみ印刷されます。新しい文字が見つかるたびに、配列内のその場所がTRUEに設定されます。これは、改行で終了する標準入力からテキスト行を取得します。非ASCII文字は無視されます。


ゴルフをしていない:

#include<stdio.h>
#include<stdbool.h>

int main(void)
{
  int i, c;
  int ascii[128];
  for (i = 0; i < 128; ++i) {
    ascii[i] = false;
  }
  while ((c = getchar()) != '\n') {
    if (ascii[c] == false) {
      ascii[c] = true;
      putchar(c);
    }
  }
  puts("\n");
  return(0);
}

3

C-58

たくさんのキャラクターを保存してくれた@hvdと@AShellyに感謝します。オリジナルよりもはるかに短くするために提案された複数の方法がありました。

// @hvd     - always copy to q but only increment q if not found
g(char*s,char*r){char*q=r;for(;*q=*s;q+=q==strchr(r,*s++));}

// @AShelly - keep a histogram of the usage of each character
h(char*s){int a[128]={0};for(;*s;s++)a[*s]++||putchar(*s);}

// @hvd     - modify in place
i(char*s){char*q=s,*p=s;for(;*q=*p;q+=q==strchr(s,*p++));}

// original version - requires -std=c99
void f(char*s,char*r){for(char*q=r;*s;s++)if(!strchr(r,*s))*q++=*s;}

ご覧のとおり、その場で変更するのが最も短いようです(これまでのところ!) gcc test.c

#include <stdlib.h> // calloc
#include <string.h> // strchr
#include <stdio.h>  // puts, putchar

// 000000111111111122222222223333333333444444444455555555556666666666
// 456789012345678901234567890123456789012345678901234567890123456789

// @hvd     - always copy to q but only increment q if not found
g(char*s,char*r){char*q=r;for(;*q=*s;q+=q==strchr(r,*s++));}

// @AShelly - keep a histogram of the usage of each character
h(char*s){int a[128]={0};for(;*s;s++)a[*s]++||putchar(*s);}

// @hvd     - modify in place
i(char*s){char*q=s,*p=s;for(;*q=*p;q+=q==strchr(s,*p++));}

/* original version - commented out because it requires -std=c99
void f(char*s,char*r){for(char*q=r;*s;s++)if(!strchr(r,*s))*q++=*s;}
*/

// The test program:
int main(int argc,char*argv[]){
  char *r=calloc(strlen(argv[1]),1); // make a variable to store the result
  g(argv[1],r);                      // call the function
  puts(r);                           // print the result

  h(argv[1]);                        // call the function which prints result
  puts("");                          // print a newline

  i(argv[1]);                        // call the function (modifies in place)
  puts(argv[1]);                     // print the result
}

すべての助けてくれてありがとう。私はそんなに短くするために与えられたすべてのアドバイスに感謝します!


さて、あなたのコードはすでにちょうど寛大なCコンパイラによって受け入れられていない有効なCであるため、:あなたは、宣言することができrint(と省略int)いくつかのバイトを保存するために:f(s,r)char*s;{...}。しかし、それはあなたのコードをchar*、と同じサイズのプラットフォームint、そしてもちろんコンパイラがあなたや私のものと同じくらい寛容なプラットフォームに制限します。
hvd

@hvdそれは悪です!私はそれを使用しないので、戻り値をデフォルトにしたいと思っていました。しかし、それは私が望んでいるよりも少し危険です。そこまで行くよりも準拠させるほうがいいと思います!ライト側に戻ってくれてありがとう。
ジェリージェレミア

あなたは置き換えることによって、1つの文字を保存することができif(x)yx?y:0
ugoren

以下に、配列パラメーターの代わりにstdoutに書き込む60文字の関数を示します f(char*s){int a[128]={0};for(;*s;s++)a[*s]++?0:putchar(*s);}
。– AShelly

に無条件にコピーでき*q、増分のみqの文字が以前登場した場合、より一緒にビットを詰めることができ、: void f(char*s,char*r){for(char*q=r;*q=*s;strchr(r,*s++)<q||q++);}(注strchr(r,*s++)<qので、常に明確に定義されているが、何のUBは、そこにありませんstrchr缶が戻らないNULLこのバージョンで。)戻り値の型を除き、 @AShellyのバージョンよりもさらに短いです。
hvd

2

ルビー、30 24文字

(23文字のコード+ 1文字のコマンドラインオプション。)

gsub(/./){$`[$&]?"":$&}

サンプル実行:

bash-4.3$ ruby -pe 'gsub(/./){$`[$&]?"":$&}' <<< 'hello world'
helo wrd

2

CJam、9

Lq{1$-+}/

これは文字列をセットに変換しませんが、ある種のセットの違いを実行して、文字列で文字が見つかったかどうかを判断します。オンラインで試す

説明:

L       push an empty array/string
q       read the input
{…}/    for each character in the input
  1$    copy the previous string
  -     subtract from the character (set difference),
         resulting in the character or empty string
  +     append the result to the string

別のバージョン、13バイト:

Lq{_2$#)!*+}/

これはセットに関連することは何もしません。オンラインで試す

説明:

L       push an empty array/string
q       read the input
{…}/    for each character in the input
  _     duplicate the character
  2$    copy the previous string
  #)    find the index of the character in the string and increment it
  !     negate, resulting in 0 if the character was in the string and 1 if not
  *     repeat the character that many times
  +     append the result to the string

2

TI-BASIC、49バイト

Input Str1
"sub(Str1,X,1→Y₁
Y₁(1
For(X,2,length(Str1
If not(inString(Ans,Y₁
Ans+Y₁
End
Ans

方程式変数は、保存するのに5バイトかかるため、ほとんど役に立ちませんY₁が、ここXでは文字列のth文字として役立ち、3バイトを節約します。TI-BASICの空の文字列に追加できないため、Str1の最初の文字で文字列を開始し、残りの文字列をループして、まだ検出されていないすべての文字を追加します。

prgmQ
?Why no empty st
rings? Because T
I...
Why noemptysrig?Bcau.

2

Matlab、46バイト

入力および出力として関数引数を使用した匿名関数を使用します。

@(s)eval('s(~any(triu(bsxfun(@eq,s,s''),1)))')

(これをOctaveオンラインインタープリターで動作させることはできませんでした。)

使用例:

>> @(s)eval('s(~any(triu(bsxfun(@eq,s,s''),1)))')
ans = 
    @(s)eval('s(~any(triu(bsxfun(@eq,s,s''),1)))')

>> ans('Type unique chars!')
ans =
Type uniqchars!

それも私のアイデアだったでしょう:)-あなたは,1withを必要としませんany
ジョナス

@ジョナスありがとう!それは括弧の混乱を見抜くのは難しいAlrhough、1のためであるtriu ではないため、(私は対角線を削除する必要があります)any
ルイス・Mendo

2

Befunge -93、124バイト

v
<v1p02-1
0_v#`g00: <0_@#+1::~p
 1>:1+10p2+0g-!#v_v
g `#v_10g0^       >:10g00
 ^0g 00$        <
 ^  >:,00g1+:00p1+:1+01-\0p

このオンライン通訳でテストしてください。


これは予想以上に困難でした。明日、誰かが私に望んでいるなら、より詳しい説明を投稿しますが、ここに私のコードが行うことの概要があります。

  • これまでに見た一意の文字は、最初の行に格納され、 2,0、右ます。これは、現在の文字が重複しているかどうかを確認するためにチェックされます。
  • これまで0,0に確認された一意の文字の数はに格納され、重複チェックループカウンターはに格納されます1,0ます。
  • ユニークなキャラクターが見られると、最初の行に保存され、印刷され、カウンターが 0,0が増加します。
  • 存在するスペース(ASCII 32)での読み取りに関する問題を回避するために、-1に対応する文字(実際には65536)を次の一意の文字の次のスロットに配置します。

2

PHP、 56 54

// 56 bytes
<?=join('',array_flip(array_flip(str_split($argv[1]))));

// 54 bytes
<?=join(!$a='array_flip',$a($a(str_split($argv[1]))));

fschmenglerさん@アウトエッジング答え使用してarray_flip二回-第二版は、変数メソッドを使用し、falseにそれを否定し、trueに文字列をキャストに依存して、その後、戻って第二のバイトのカップルを保存するための第一引数に空の文字列にそれをキャスト。安いです!


2

ハスケル、29バイト

ネスト可能な、変数名のないワンライナー:

foldr(\x->(x:).filter(x/=))[]

同じカウント、fトップレベル宣言として名付けられた関数に保存されます:

f(x:t)=x:f[y|y<-t,x/=y];f_=[]

気楽さの精神で私がやったことのないわずかに不正な最適化があることに注意してください。文字列に異なる入力および出力エンコーディングを使用することは、このチャレンジのルールによって技術的にまだ許可されています。string部分的に適用された教会のエンコード\f -> foldr f [] string :: (a -> [b] -> [b]) -> [b](関数によって提供される全単射の反対側)でany を表すことにより、($ (:))これは($ \x->(x:).filter(x/=))24文字にまで減少します。

24文字の応答を公式の応答として投稿することは避けましfoldr(\x->(x:).filter(x/=))[]"Type unique chars!"た。ゴルフソリューションが代わりに記述されるのに対して、上記のソリューションは上記のインタープリターで試すことができるためです。

($ \x->(x:).filter(x/=))$ foldr (\x fn f->f x (fn f)) (const []) "Type unique chars!"

より正気でないリテラル宣言の省略形として:

($ \x->(x:).filter(x/=))$ \f->f 'T'.($f)$ \f->f 'y'.($f)$ \f->f 'p'.($f)$ \f->f 'e'.($f)$ \f->f ' '.($f)$ \f->f 'u'.($f)$ \f->f 'n'.($f)$ \f->f 'i'.($f)$ \f->f 'q'.($f)$ \f->f 'u'.($f)$ \f->f 'e'.($f)$ \f->f ' '.($f)$ \f->f 'c'.($f)$ \f->f 'h'.($f)$ \f->f 'a'.($f)$ \f->f 'r'.($f)$ \f->f 's'.($f)$ \f->f '!'.($f)$ const[]

ただし、純粋な関数として表されるデータ構造の完全に有効なバージョンです。(もちろん、使用すること\f -> foldr f [] "Type unique chars!"もできますが、リストを使用して実際にデータを保存するため、おそらく不正です。したがって、そのフォルダ部分はおそらく24文字を超える「応答」関数に構成される必要があります。)

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