Stack Overflowで削除された質問は、素晴らしいゴルフ教材になる場合があります。
入力として非負の整数を取り、その数値の基数10表現のすべての数字が一意である場合にtrueを返す関数を作成します。例:
48778584 -> false
17308459 -> true
文字数には関数のみが含まれます。
CまたはC ++で回答することを選択した場合:マクロなし、未定義の動作なし。実装定義の動作とコンパイラの警告は問題ありません。
Stack Overflowで削除された質問は、素晴らしいゴルフ教材になる場合があります。
入力として非負の整数を取り、その数値の基数10表現のすべての数字が一意である場合にtrueを返す関数を作成します。例:
48778584 -> false
17308459 -> true
文字数には関数のみが含まれます。
CまたはC ++で回答することを選択した場合:マクロなし、未定義の動作なし。実装定義の動作とコンパイラの警告は問題ありません。
回答:
{`..&=}
`
-引数を文字列化する..
-2回クローン&
-それ自体と交差(重複を削除)=
-平等を確認してください。関数に名前を付ける必要がある場合(109文字):
{`..&=}:a
プログラムで十分な場合(54文字):
..&=
lambda n:10**len(set(`n`))>n
バックティックは文字列表現を取ります。セットに変換すると重複が削除され、すべてのd桁の数字よりも大きいが(d + 1)桁の数字がない10 ^ dと比較して長さが短くなるかどうかが確認されます。
古いコード:
lambda n:len(set(`n`))==len(`n`)
n
にi
f=lambda _:len(`_`)==len(set(`_`))
lambda n:max(map('n'.count,'n'))<2
(一重引用符はバッククォートです)が、2文字長くなります。
e? AtsAuqA
Rebmuの「マッシング」トリックは、大文字と小文字を区別しないため、文字が一緒に実行されることです。ケース移行時がヒットに、次のトークンに分割されます。CamelCaseのようなものの代わりにトランジションを使用することにより、キャピタルランで開始する独自の選択は、「単語のセット」が作成されることを意味します。(セットワードは、シンボリックプログラミングの他の目的に使用できますが、既定では割り当てとして評価されます)。
したがって、これは次のことを「アンマッシュ」します。
e? a: ts a uq a
代替ケースの一連の実行を開始すると、新しい実行を開始しない限り、そのトリックを使用して最初の後にセットワードを取得することはできないため、スペースが必要です。だからe?AtsAuqA
あなたを得たでしょうe? a ts a uq a
...割り当てんでした。
(注:特に正当な理由ではないかもしれませんが、文字数が等しい場合、スペースがなくなるようにソリューションを再考する傾向があります。括弧、括弧、および文字列は暗黙的に記号を終了するので...しばしば公平ですこれの機会の数。)
いずれにせよ、Rebolにマップされたとき、それは短縮されます:
equal? a: to-string a unique a
評価順序の要点を把握するために、いくつかの括弧を使用します。
equal? (a: (to-string a)) (unique a)
したがって、接頭辞等値演算子は2つの引数に適用されます。1つ目a
は、文字列バージョン自体の代入結果、2つ目は、unique
その文字列に対して実行され。uniqueは、渡したのと同じ順序で要素を返します...たとえば、「31214」の一意は「3124」です。
以下で実行します:
>> rebmu/args "e? AtsAuqA" 17308459
== true
いくつかの統計とデバッグ情報もあります。
>> rebmu/args/stats/debug "e? AtsAuqA" 48778584
Original Rebmu string was: 10 characters.
Rebmu as mushed Rebol block molds to: 10 characters.
Unmushed Rebmu molds to: 15 characters.
Executing: [e? a: ts a uq a]
== false
名前付き/再利用可能な関数を定義する必要があるという要件がある場合、aという名前のパラメーターを暗黙的にとる「A関数」を作成できますa|
。(B関数は、Aで作成され、b|
Aという名前のパラメーターを取り、次にBという名前のパラメーターを取ります)。そのため、さらに5文字が追加されます...関数「f」を呼び出すとしましょう
Fa|[e? AtsAugA]
Reb moo
いましたが、今ではそれが他の何かなのRebum mew
かReb mew
どうかはわかりません。
Fa|[e? AtsAugA]
ましたFalse? SomeGibberish
s
本当に衰退し[
ますか?
REBmu
おそらくもっと良いと思います。いずれにせよ、ひげはきついです。あなたが支払うものを手に入れると思います。
47/10 3/5 106/47 3599/54272 53/61 2881/27136 2479/13568 2077/6784 1943/3392 1541/1696 1273/848 1139/424 871/212 737/106 469/53 142/3953 67/71 5/67 1/147 1/363 1/507 1/867 1/1083 1/1587 1/2523 1/2883 1/4107 1/5547 1/7 1/11 1/13 1/17 1/19 1/23 1/29 1/31 1/37 1/43
除算を使用して、各桁の出現回数をカウントします。レジスタ2にnを入れてレジスタ5を1に設定して呼び出すと、レジスタ3に出力が与えられます(falseの場合は0、trueの場合は1)。また、プログラムの残りの部分で71を超えるレジスタのみを使用するようにしてください。
編集25/12/14:それは7か月が経ち、それからStack Snippetsを手に入れたので、ここでコードをテストします(ここで私のより良いインタープリターを使用して)。
var ITERS_PER_SEC=1E5;var TIMEOUT_MILLISECS=5E3;var ERROR_INPUT="Invalid input";var ERROR_PARSE="Parse error: ";var ERROR_TIMEOUT="Timeout";var ERROR_INTERRUPT="Interrupted by user";var running,instructions,registers,timeout,start_time,iterations;function clear_output(){document.getElementById("output").value="";document.getElementById("stderr").innerHTML=""};function stop(){running=false;document.getElementById("run").disabled=false;document.getElementById("stop").disabled=true;document.getElementById("clear").disabled=false}function interrupt(){error(ERROR_INTERRUPT)}function error(msg){document.getElementById("stderr").innerHTML=msg;stop()}function factorise(n){var factorisation={};var divisor=2;while(n>1){if(n%divisor==0){var power=0;while(n%divisor==0){n/=divisor;power+=1}if(power!=0)factorisation[divisor]=power}divisor+=1}return factorisation};function fact_accumulate(fact1,fact2){for(var reg in fact2)if(reg in fact1)fact1[reg]+=fact2[reg];else fact1[reg]=fact2[reg];return fact1};function exp_to_fact(expression){expression=expression.trim().split(/\s*\*\s*/);var factorisation={};for(var i=0;i<expression.length;++i){var term=expression[i].trim().split(/\s*\^\s*/);if(term.length>2)throw"error";term[0]=parseInt(term[0]);if(isNaN(term[0]))throw"error";if(term.length==2){term[1]=parseInt(term[1]);if(isNaN(term[1]))throw"error";}if(term[0]<=1)continue;var fact_term=factorise(term[0]);if(term.length==2)for(var reg in fact_term)fact_term[reg]*=term[1];factorisation=fact_accumulate(factorisation,fact_term)}return factorisation}function to_instruction(n,d){instruction=[];divisor=2;while(n>1||d>1){if(n%divisor==0||d%divisor==0){reg_offset=0;while(n%divisor==0){reg_offset+=1;n/=divisor}while(d%divisor==0){reg_offset-=1;d/=divisor}if(reg_offset!=0)instruction.push(Array(divisor,reg_offset))}divisor+=1}return instruction};function run(){clear_output();document.getElementById("run").disabled=true;document.getElementById("stop").disabled=false;document.getElementById("clear").disabled=true;timeout=document.getElementById("timeout").checked;var code=document.getElementById("code").value;var input=document.getElementById("input").value;instructions=[];code=code.trim().split(/[\s,]+/);for(i=0;i<code.length;++i){fraction=code[i];split_fraction=fraction.split("/");if(split_fraction.length!=2){error(ERROR_PARSE+fraction);return}numerator=parseInt(split_fraction[0]);denominator=parseInt(split_fraction[1]);if(isNaN(numerator)||isNaN(denominator)){error(ERROR_PARSE+fraction);return}instructions.push(to_instruction(numerator,denominator))}try{registers=exp_to_fact(input)}catch(err){error(ERROR_INPUT);return}running=true;iterations=0;start_time=Date.now();fractran_iter(1)};function regs_to_string(regs){reg_list=Object.keys(regs);reg_list.sort(function(a,b){return a-b});out_str=[];for(var i=0;i<reg_list.length;++i)if(regs[reg_list[i]]!=0)out_str.push(reg_list[i]+"^"+regs[reg_list[i]]);out_str=out_str.join(" * ");if(out_str=="")out_str="1";return out_str};function fractran_iter(niters){if(!running){stop();return}var iter_start_time=Date.now();for(var i=0;i<niters;++i){program_complete=true;for(var instr_ptr=0;instr_ptr<instructions.length;++instr_ptr){instruction=instructions[instr_ptr];perform_instr=true;for(var j=0;j<instruction.length;++j){var reg=instruction[j][0];var offset=instruction[j][1];if(registers[reg]==undefined)registers[reg]=0;if(offset<0&®isters[reg]<-offset){perform_instr=false;break}}if(perform_instr){for(var j=0;j<instruction.length;++j){var reg=instruction[j][0];var offset=instruction[j][1];registers[reg]+=offset}program_complete=false;break}}if(program_complete){document.getElementById("output").value+=regs_to_string(registers);stop();return}iterations++;if(timeout&&Date.now()-start_time>TIMEOUT_MILLISECS){error(ERROR_TIMEOUT);return}}setTimeout(function(){fractran_iter(ITERS_PER_SEC*(Date.now()-iter_start_time)/1E3)},0)};
<div style="font-size:12px;font-family:Verdana, Geneva, sans-serif;"><div style="float:left; width:50%;">Code:<br><textarea id="code" rows="4" style="overflow:scroll;overflow-x:hidden;width:90%;">47/10 3/5 106/47 3599/54272 53/61 2881/27136 2479/13568 2077/6784 1943/3392 1541/1696 1273/848 1139/424 871/212 737/106 469/53 142/3953 67/71 5/67 1/147 1/363 1/507 1/867 1/1083 1/1587 1/2523 1/2883 1/4107 1/5547 1/7 1/11 1/13 1/17 1/19 1/23 1/29 1/31 1/37 1/43</textarea><br>Input:<br><textarea id="input" rows="2" style="overflow:scroll;overflow-x:hidden;width:90%;">2^142857 * 5</textarea><p>Timeout:<input id="timeout" type="checkbox" checked="true"></input></p></div><div style="float:left; width:50%;">Output:<br><textarea id="output" rows="6" style="overflow:scroll;width:90%;"></textarea><p><input id="run" type="button" value="Run" onclick="run()"></input><input id="stop" type="button" value="Stop" onclick="interrupt()" disabled="true"></input><input id="clear" type="button" value="Clear" onclick="clear_output()"></input> <span id="stderr" style="color:red"></span></p></div></div>
142857
別の番号に置き換えます。出力は3^1
trueの1 = 3^0
場合、falseの場合になります。数値が大きい場合はしばらく時間がかかります(これは FRACTRAN ...です)。
私にとって最初のゴルフ...
入力として非負の整数を取る関数を書く
bool f(int i){return(i+"").Distinct().SequenceEqual(i+"");}
に変換する
さあ ...uint
ことint
で別の文字を取り除くことができますが、私はむしろ逆方向よりも文字通りにタスクを取ります。
i => (i + "").Distinct().SequenceEqual(i + "");
+""
電話することを完全に忘れていましたToString()
。
私は勝てないので、効率のために行きます。
機能コード:
int u(uint32_t d){short s=0,f;while(d){f=1<<d%10;if(s&f)return 0;s|=f;d/=10;}return 1;}
(関数に名前が必要な場合は27。)
Unequal@@IntegerDigits@#&
編集:ベリサリウスのおかげで8文字を保存しました!
Unequal @@ IntegerDigits@# &
できると思います
≠
が隣接していない要素を比較するとは思わなかった)。おかげで、これは大幅に短縮されました!
Unequal@@IntegerDigits@#&
25文字です。
function(n)!grepl("(.).*\\1",n,,T)
文字列に変換して分割します。カウントマイナス1のテーブルに変換し、和と否定
アレックスによる最も一般的な番号の回答とヒューによる提案に触発されました。
@plannapusのおかげでカップルが保存されました@Gregorからもう1人
@ J.Doeのおかげで、今では素晴らしい正規表現の良さがあります。これは、文字列内の他の場所でそれ自体と一致する番号で単一の文字を探します。grepl
コマンドが返され、その論理を返します。Perlスタイルの正規表現はTrueに設定されます。
paste0
代わりにtoString
を使用して文字列に変換し、2文字を保存することもできます。
paste
代わりにpaste0
を使用して、もう1つのキャラクターを保存できます。
テストする値が可変であると仮定しますb
(これを関数にすることができることは知っていますが、Jが混乱する方法については手がかりがありません。これに関する助けはありがたいです)ありがとうMarinus!
(-:~.)@":
すべての重複が削除された番号の文字列担当者の長さが、通常の文字列担当者の長さと同じかどうかを確認します。
(-:~.)@":
。
有益なコメントをありがとうございました!あなたのコメントは答えに組み込まれています。
### Version 70 chars
f=function(x)!any(duplicated(strsplit(as.character(x),split="")[[1]]))
### Version 60 chars
f=function(x)all(table(strsplit(as.character(x),"")[[1]])<2)
### Version 53 chars
f=function(x)all(table(strsplit(paste(x),"")[[1]])<2)
### Version 52 chars
f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)
f(48778584)
f(17308459)
strsplit
なぜc(x,"")
?を使用してxを文字に強制しないのかという結果の最初の要素をすでに取得しているので、f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)
1文字短くなります:)
(22 21関数に名前が必要な場合)
Max@DigitCount@#<2&
または
Max@DigitCount@#|1&
どこ| [Esc] divides [Esc]として入力します
f={s="$it" as List;s==s.unique(!1)}
次を使用してテストしました:
println f(args[0].toInteger())
0>1
は短いです。
!1
代わりに使用します。
前回の回答から完全に区別します。
*/@~:@":
f=function(x)!sum(duplicated((x%%10^(i<-1:nchar(x)))%/%10^(i-1)))
整数の除算とモジュロを使用して数字を区切り、それらが重複しているかどうかを確認します。
使用法:
> f(48778584)
[1] FALSE
> f(17308459)
[1] TRUE
または、@ MickyTが示唆したように、63文字の場合:
f=function(x)!anyDuplicated((x%%10^(i<-1:nchar(x)))%/%10^(i-1))
anyDuplicated
なく、sum
そしてduplicated
2以上のために
f;a(x){for(f=0;x;x/=10)f+=1<<x%10*3;return!(f&920350134);}
ロールオーバーする前に、最大7桁の同じ数字の集計を保持できます。
テストプログラム内(8進数の定数でどのように動作するかを簡単に確認できます)
a(x){int f=0;for(;x;x/=10)f+=1<<x%10*3;return!(f&06666666666);}
main(){
scanf("%d",&r);
printf("%o\n",a(r));}
2のべき乗が便利な場合は、次のように定数を計算できます。 f&(1<<30)/7*6
int main(int)
あなたの答えに...
Befungeには機能がないため、これは非競合的な回答です。
~:1g1`j@1\1p3j@.1
1
数字の桁がすべて一意である場合にaを出力します。それ以外の場合は、終了します。
This works by accessing a cell in the Funge space whose x
coordinate is the ASCII value of the character inputted (takes input character by character) and whose y
coordinate is 1
. If the digit has not been seen before, the value of the cell is 32
(space character). If that is so, I set the value to 1.
As a bonus, this works for non-numbers as well.
{.comb.uniq==.comb}
.comb
splits a string into characters (for example, 42.comb
gives "4", "2"
). .uniq
removes all non-unique characters. .comb
characters in string (originally I used .chars
, but .comb
is shorter). ==
converts lists into number of elements in it, and compares the numbers. When .
is used without object before, $_
which is default function parameter is assumed. {}
are function literals.
This is no where near winning, but I'll post it anyway just to show an alternative approach.
c;i;a[99];main(){while(~(c=getchar()))a[c]++;for(;i<99;)a[i++]>1&&puts("");}
Prints a new line if false, prints nothing if true.
int main(int, char **)
or int main(void)
. int main(int)
is not valid.
main()
is ok then?
main(void)
(when used in definition, in declaration it declares a function with unknown parameter list).
f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
!
instead of -z
with test
- Thanks DigitalTrauma`CODE`
instead of $(CODE)
- Thanks DigitalTraumafold -1
instead of grep -o .
1 - Thanks DigitalTrauma.If POSIX compliance is not important echo PARAM |
can be replaced by <<<PARAM
, reducing the functions length to 37:
f()([ ! `egrep '([0-9]).*\1'<<<$1` ])
Usage:
$ if f 48778584; then echo true; else echo false; fi
false
$ if f 17308459; then echo true; else echo false; fi
true
1 The fold -N
notation is deprecated in some versions of fold
.
f()(! [ `fold -1<<<$1|sort|uniq -d` ])
down to 38 by my count
test
croaks on it when uniq -d
returns more than one line. So the shortest non-POSIX version is 40 characters. I know about the [ !
notation, but I am suprised that ! [
also works, do you know why that is?
removed ^ and $ as @n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ suggested
boolean u(int n){return !(n+"").matches(".*(.).*\\1.*");}
boolean u(int n){return !(n+"").matches("^.*(.).*\\1.*$");}
Use for loop to save a few charachers and use int as a boolean array.
Use & instead of && to save 1 character (It turns out that java allows it).
boolean u(int n){for(int x=0;n>0&(x>>n%10&1)==0;n/=10)x|=1<<n%10;return n==0;}
boolean u(int n){int[] p=new int[]{2,3,5,7,11,13,17,19,32,29};double a=9001312320D;while(n>0){a/=p[n%10];n/=10;}return (long)a==a;}
with comments:
boolean unique(int n){
int[] p=new int[]{2,3,5,7,11,13,17,19,32,29};//list of 10 first primes
double a=9001312320D;//10 first primes multiplied
while(n>0){
a/=p[n%10];//divide by (n%10+1)th prime
n/=10;//divide n by 10, next digit
}
return (long)a==a;//if a is integer then n has all digits unique
}
And answer that is technically correct (character count includes only the function, not global variables), but I think it's cheating, 29 characters:
boolean u(int i){return m[i];}
m[] is boolean array that contains correct answers for all 32-bit integers.
"^.*(.).*\\1.*$"
You can drop ^
and $
. They are implied by matches()
return!
in the shortest answer, you can get to 56 bytes.