nとn ^ 3は同じ数字のセットを持っていますか?


52

数値n(0 <= n <= 2642245)が与えられた場合、nn 3が同じ数字のセットを持っているかどうかを確認し、それに応じて真偽値を出力します。

たとえば、100という数字を確認しましょう。

100 3は1000000です。

100の数字のセットは{0、1}です。

1000000の数字のセットは{0、1}です。

したがって、100は真実の値を与える必要があります。

テストケース

0 -> True
1 -> True
10 -> True
107624 -> True
251894 -> True
251895 -> False
102343 -> False

これはであるため、バイト数が最も少ないコードが優先されることに注意してください。

OEIS A029795


28
テストケースの提案:106239
Dennis

8
テストケース:2103869 -> True。これ(またはより大きなもの)は、longデータ型を持つ言語をテストするために必要です。
mbomb007

5
残念なことに、64ビット整数型のない言語では最大値が大きすぎます。
edc65

17
ベースについて明示する必要があると思います...バイナリでは、それはちょっと楽しいです:-D
The Vee

7
ZoltánSchmidt@ 106239最小の正の整数であるNよう - 1199090390129919は -のすべての数字が含まれていないNを。一部の回答では、nn³のすべての数字が含まれていて、106239の結果が間違っているかどうかのみをチェックしていました
デニス

回答:


28

Pythonの3、36の、32バイト

lambda x:{*str(x)}=={*str(x**3)}

これはPython 3.5以降でのみ機能すると思います。カッパーのおかげで、4バイトがなくなっています。


8
Python 2では、backticsをrepr()のショートカットとして使用して、6バイトを節約できます。set(`x`)
-DenDenDo

9
@DenDenDo 2097152sys.maxint**(1/3.))より大きく、より小さい入力sys.maxint+1False、を使用すると返されますrepr()repl.it/EXs2/1。ロングはL最後にあります。
mbomb007

9
未テストですが、おそらくlambda x:{*str(x)}=={*str(x**3)}Python 3.5+で実行できます。

1
@BenHoyt print(...)とinput()を使用するよりも簡潔です。関数にすることは、完全なプログラムを作成することよりも短いです。
0WJYxW9FMN

1
質問がtruthyまたはfalsy値を返すことは十分にあると言うので、あなたは置き換えることができます==によって^。2つの等しいセット{}は、虚偽の結果につながります。
-RemcoGerlich

19

05AB1E、6バイト

05AB1EはCP-1252エンコードを使用します。

3mê¹êQ

オンラインでお試しください!

説明

3m       # input^3
  ê      # sorted with duplicates removed
     Q   # is equal to
   ¹ê    # input sorted with duplicates removed

1
@PuzomorCroatia:05AB1EはCP-1252エンコーディングを使用するため、これらの文字はすべて1バイトです。ゴルフ言語では、UTF-8よりも印刷可能な文字が多いコードページを使用するか、独自のコードページを作成するのが一般的です。
エミグナ

7
答えてくれてありがとう。残念ながら、コメントを編集しようとしていたときに削除しました。わかりやすくするために、コードゴルフ言語の文字のエンコードについて質問しました
Puzomor Croatia

14

C、73バイト

k;b(i){k=0;while(i)k|=1<<i%10,i/=10;return k;}f(n){return b(n)-b(n*n*n);}

ビットを介してセットを作成します。0同じセットに対して返されますが、異なるセットに対しては何でも返します。

ゴルフをしていない:

k;
b(i){
  k=0;
  while(i)
    k|=1<<i%10,
    i/=10;
  return k;
}

f(n){
  return b(n)-b(n*n*n);
}

を使用し1 <<てビットを設定するときに、未使用のコードが欠落していますk |= 1 << i % 10。素晴らしい解決策!
1Darco1

1
このビットマップのアイデアを使用して、39バイトのx86-64マシンコード関数を作成しました :)
Peter Cordes

私たちは0真実だとみなすことができますか?私は推測するstrcmpことはC.に合理的なようですので、作品そのように
ピーター・コルド

1
これはint、64ビットよりも大きい場合、質問で必要な入力の範囲全体でのみ機能します。(署名された64ビットでも十分ではありませんが、署名されていない64ビットで十分です)。したがって、質問の要件を満たす場所を知っているCの実際の実装はありません。(それは、で正しく動作するunsigned long longunsigned long、64ビットタイプの実装でのみ動作します)。GNU C定義__int128_t(任意ヘッダなし)64ビットマシン上で...
ピーターコルド

8

Perl、31 + 2(-plフラグ)= 25 21 18 34 33バイト

$_=($==$_**3)!~/[^$_]/*!/[^$=]/

を使用して:

perl -ple '$_=($==$_**3)!~/[^$_]/*!/[^$=]/' <<< 251894

出力:1\nまたは0\n

3バイトの@ Dada、1バイトのGabriel Benamy、バグレポートの@Zaidに感謝します。


1
素敵な答え!まだ数バイトを保存できます:perl -pe '$_=$_**3!~/[^$_]/'
ダダ

@Zaid Thanx。一定。
デニスイバエフ

10:(
Zaid

@Zaidうん。-lフラグが必要です。
デニスイバエフ

2
&&をa *に変更してバイトを保存します
ガブリエルベナミー


7

ゼリー、8 バイト

,3*\D‘ṬE

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

,3*\D‘ṬE  Main link. Argument: n

,3        Pair; yield [n, 3].
  *\      Cumulative reduce by exponentation. Yields [n, n³].
    D     Decimal; yield the digit arrays of n and n³.
     ‘    Increment, mapping 0 ... 9 to 1 ... 10.
      Ṭ   Untruth (vectorizes); map digit array [a, b, c, ...] to the smallest
          of zeroes with ones at indices a, b, c, ...
       E  Test the results for equality.


6

JavaScriptのES6、55の 51バイト

3バイトのDowngoatに感謝します!ES7に変換してのn**3代わりにを使用すると、バイトを保存できますn*n*n

n=>(f=s=>[...new Set(s+[])].sort()+[])(n)==f(n*n*n)

簡単です。


セットの等価性を比較する良い方法がないのはひどいです
-njzk2

1
@ njzk2まあ、私はより大きな悲劇は、==配列上でも動作しないことだと思います。
コナーオブライエン

に変更するn*n*nことn**3でバイトを保存できますが、ES6ではなくES7である可能性があります。
ロバートヒックマン

1
@Downgoatおかげで、さらにバイトを節約することができました!
コナーオブライエン

3
これは失敗し2103869、問題は明示的に解決するために解決策を必要とし2642245ます。
user5090812

6

C位、241 208 205 201 193 233 222 220 212 203 177 159バイト(109の代替)

I=>{x=s=>{var a=new int[10];foreach(var h in s+"")a[h-'0']++;return a;};var i=x(I);var j=x(I*I*I);for(var k=0;k<10;)if(i[k]>0^j[k++]>0)return 0>1;return 1>0;};

ラムダは具体的にulong型を使用する必要があります。

System.Func<ulong, bool> b; // = I=>{...};
System.Func<ulong, int[]> x; // inner lambda

いくつかのバイトを保存してくれた@Corakと@Dennis_E、そして私の元のソリューションで問題を見つけてくれた@TimmyDに感謝します。@ long / long / decimal / etcの問題を指摘してくれた@SaxxonPikeに感謝します(実際に数バイトも節約されました)。


HashSetsを使用する109バイトのソリューションもあります。これは、Javaの回答と似ていますが、スコアについては元のソリューションに固執します。

using System.Collections.Generic;I=>{return new HashSet<char>(I+"").SetEquals(new HashSet<char>(I*I*I+""));};

p<0代わりに確認できますp==1か?
Yytsi

@TuukkaXそれはできただろうが、私がセットを決定する方法は、整数の同じ配列を使用して、両方の文字列の適切なインデックスをインクリメントするので、0または2の値は大丈夫ですが、もしあれば1 falseを返す必要があります。
Yodle

配列の作成と充填を別のラムダに抽出することで、ほとんど節約できませんn=>{Func<string,int[]>x=s=>{var a=new int[10];foreach(var c in s)a[int.Parse(c+"")]++;return a;};var i=x(n);var j=x((long)Math.Pow(int.Parse(n),3)+"");for(var k=0;k<10;)if(i[k]>0^j[k++]>0)return 0>1;return 1>0;};
。– Corak

あなたは置き換えることができint.Parse(c+"")c-'0'
Dennis_E

テストケース2103869に失敗します。同じ問題に遭遇しました。(理由はわかりません。long代わりにを使用し、ulongこのテストケースではMSBを使用します。)
SaxxonPike

6

Java 8、154文字

a->java.util.Arrays.equals((a+"").chars().distinct().sorted().toArray(),(new java.math.BigInteger(a+"").pow(3)+"").chars().distinct().sorted().toArray());

このように呼び出されます:

interface Y {
    boolean n(int x);
}

static Y y = a->java.util.Arrays.equals((a+"").chars().distinct().sorted().toArray(),(new java.math.BigInteger(a+"").pow(3)+"").chars().distinct().sorted().toArray());

public static void main(String[] args) {
    System.out.println(y.n(0));
    System.out.println(y.n(1));
    System.out.println(y.n(10));
    System.out.println(y.n(107624));
    System.out.println(y.n(251894));
    System.out.println(y.n(251895));
    System.out.println(y.n(102343));
}

出力:

true
true
true
true
true
false
false

ラムダといくつかの派手な数字から文字列への変換を含むストリームを使用した、非常にJava 8-yの回答。

残念ながら、Math.powが非正確なdouble を使用するBigInteger.pow(3)代わりに使用する必要がありますMath.pow(a,3)。このdoubleは、()で始まる大きな数値で不正な値を返します2103869


そのstatic Y yことは奇妙な初期化構文ですがy.n、インターフェイスには厳密に1つのメンバーがあるため、自動割り当てされますか?

はい、そう信じています。正直に言うと、私の職場はまだ7なので、Java 8に慣れていないのですが、それがJava 8の働き方だと思います。
ヒピノ

コンパイラ@FunctionalInterfaceは、通常の匿名型のインスタンス化の代わりにラムダを機能させる注釈(1つのメソッドのみを持つインターフェース、javadocを参照)を自動的に追加します。
1Darco1

これは本質的に同等でY y = new Y() { @Override public boolean n(int x) { return Arrays.equals((a+"").chars().distinct().sorted().toArray(),(new BigInteger(a+"").pow(3)+"").chars().distinct().sorted().toArray()); } }あり、static修飾子はy.n(int)静的mainメソッドからの呼び出しを許可するためにのみ存在します。
1Darco1

1
これについてはメタ投稿を読んでください。コミュニティは同意しているようです。理由がわかると思います。更新します。
ヒピノ

6

BASH、 69、59バイト

更新

bashでこれを行う別の良い方法は、tr(62バイトですが、おそらくもう少し絞ることができます)を使用することです

T() { m=`bc<<<$1^3`;[ -z "`tr -d $m <<<$1;tr -d $1 <<<$m`" ];}

編集:さらにいくつかの最適化(Thx!@manatwork)

ゴルフ

T() { S(){ fold -1|sort -u;};bc<<<$1^3|S|diff - <(S<<<$1);}

テスト

TEST() {
 T $1 >/dev/null; echo $?
}

TEST 0
0
TEST 1
0
TEST 11
1
TEST 10
0
TEST 107624
0
TEST 251894
0
TEST 251895
1
TEST 102343
1
TEST 106239
1

0-成功の場合(終了コード)1-失敗の場合(終了コード)


ここで基本理論が完全に間違っているのではないかと思います。試してくださいT <<< 11。11 ** 3 == 1331に元の数に存在しない数字が2回含まれているという理由だけで、数字セットが同じであると言うでしょう。
マナトワーク

うん、あなたは正しい、修正されました!ありがとうございました !
ツェッペリン

わかりましたが、コードに余分なスペースが残っています。を-w明示的にに追加した理由がわかりませんfolduniqオプションなしで使用する場合は、sort -u置き換えることができます。そして、2番目のS呼び出しにhere-stringをフィードします。そして、私はに渡された式を引用する必要はないと思いますbc
マナトワーク

@ manatwork、thx、fold引数を修正し、スペースを削除し、2番目のdiff引数でhere-docを使用するようにしました。また、最初の引数をdiffにパイプし、bc式の余分な引用符を削除しました。> uniqはオプションなしで使用されます。sort-uはそれを置き換えることができます。これは、以前のバージョンの残りです(uniq -uでした)。ありがとうございました !
ツェッペリン

1
@zeppelin:cmp代わりにdiff1バイトを使用して保存できます。
イポルサーサー16年

6

x86-64マシンコード関数、40バイト。

または、strcmpのように「真」として0対非ゼロが許可されている場合は37バイト。

ビットマップのアイデアに対するKarl NapfのCの回答のおかげで、x86はBTSで非常に効率的に実行できます。

関数シグネチャ:_Bool cube_digits_same(uint64_t n);、x86-64 System V ABIを使用。(nRDIでは、ALのブール戻り値(0または1))。

_BoolISO C11で定義されており、通常はC ++と同じセマンティクスで#include <stdbool.h>定義するために使用されます。boolbool

潜在的な節約:

  • 3バイト:逆条件を返します(違いがある場合はゼロ以外)。またはインラインasmから:フラグ条件を返します(gcc6で可能)
  • 1バイト:EBXを上書きできる場合(そうすると、この関数に非標準の呼び出し規則が与えられます)。(インラインasmから実行できます)
  • 1バイト:RET命令(インラインasmから)

これが関数ではなくインラインasmフラグメントである場合、これらはすべて可能です。これにより、inline-asmで35バイトになります

0000000000000000 <cube_digits_same>:
   0:   89 f8           mov    eax,edi
   2:   48 f7 e7        mul    rdi          # can't avoid a REX prefix: 2642245^2 doesn't fit in 32 bits
   5:   48 f7 e7        mul    rdi          # rax = n^3, rdx=0
   8:   44 8d 52 0a     lea    r10d,[rdx+0xa]  # EBX would save a REX prefix, but it's call-preserved in this ABI.
   c:   8d 4a 02        lea    ecx,[rdx+0x2]

000000000000000f <cube_digits_same.repeat>:
   f:   31 f6           xor    esi,esi

0000000000000011 <cube_digits_same.cube_digits>:
  11:   31 d2           xor    edx,edx
  13:   49 f7 f2        div    r10         ; rax = quotient.  rdx=LSB digit
  16:   0f ab d6        bts    esi,edx     ; esi |= 1<<edx
  19:   48 85 c0        test   rax,rax     ; Can't skip the REX: (2^16 * 10)^3 / 10 has all-zero in the low 32.
  1c:   75 f3           jne    11 <cube_digits_same.cube_digits>

                                         ; 1st iter:                 2nd iter:                both:
  1e:   96              xchg   esi,eax   ; eax=n^3 bitmap            eax=n bitmap             esi=0
  1f:   97              xchg   edi,eax   ; edi=n^3 bitmap, eax=n     edi=n bmp, eax=n^3 bmp
  20:   e2 ed           loop   f <cube_digits_same.repeat>

  22:   39 f8           cmp    eax,edi
  24:   0f 94 d0        sete   al
                  ;; The ABI says it's legal to leave garbage in the high bytes of RAX for narrow return values
                  ;; so leaving the high 2 bits of the bitmap in AH is fine.
  27:   c3              ret    
0x28: end of function.

ループは、1回繰り返す最小の方法のようです。また、ループの繰り返し(REXプレフィックスなし、異なるビットマップレジスタなし)を検討しましたが、それはわずかに大きくなります。また、PUSH RSIを使用し、test spl, 0xf/ jzを使用して1回ループしました(ABIではRSPがCALLの前に16Bアラインされる必要があるため、1回押すとアラインし、もう1つはミスアラインします)。test r32, imm8エンコードがないため、最小の方法は4B TEST命令(REXプレフィックスを含む)を使用して、imm8に対してRSPの下位バイトのみをテストすることでした。LEA + LOOPと同じサイズですが、追加のPUSH / POP命令が必要です。

テスト範囲内のすべてのnに対してテスト済み、対ステディボックスのC実装(異なるアルゴリズムを使用しているため)。私が見た結果が異なる2つのケースでは、コードは正しく、steadyboxのコードは間違っていました。私のコードはすべてのnに対して正しいと思います。

_Bool cube_digits_same(unsigned long long n);

#include <stdio.h>
#include <stdbool.h>
int main()
{
    for(unsigned n=0 ; n<= 2642245 ; n++) {
        bool c = f(n);
        bool asm_result = cube_digits_same(n);
        if (c!=asm_result)
            printf("%u problem: c=%d asm=%d\n", n, (int)c, (int)asm_result);
    }
}

印刷される唯一の行には、c = 1 asm = 0:Cアルゴリズムの偽陽性があります。

またuint64_t、同じアルゴリズムのカールのC実装のバージョンに対してテストされ、結果はすべての入力に一致します。


マシンコードでゴルフをコーディングしますか?それは真のマスタリーです!
chx

@chx:それは本当にアセンブリ言語であり、コードサイズを最適化します。16進バイトを直接書き込むのではなく、各命令のサイズを知っている(または確認する)だけです。(私が投稿したのは、yasmでアセンブルしてからobjdump -drwC -Mintelオブジェクトファイルで実行し、コメントをコピーすることです)。これは、コードサイズの最適化が実際に実際に役立つ言語です。(しかし、それでも、ブートローダーやデモのようなまれなケースでのみ。通常、既にキャッシュされているケースでパフォーマンスを損なわない場合にのみコードサイズを節約する価値がありますが、デコードボトルネック+キャッシュミスを回避するのに役立ちます)
Peter Cordes

@chx:しかし、はい、ASMでのゴルフは、私は:)気付いてくれてありがとう、私の他の答えは、こことSO上:)を参照してください、ワルような気分にさせるん
ピーター・コルド

私はアセンブリの非常に古い帽子です(1987年、Z80が最初でした)が、それでコードゴルフに入ることを考えたことがありませんでした。私は不可能だと思っていただろう。
-chx

@chx:たまにしかゴルフをしません。通常、Hot Network Questionsでasmに相応しいと思われるゴルフを見たときだけです。通常、文字列ではなく数字を使用します。ただし、他の少数の人々はasmでゴルフをしています。他の人のマシンコードのゴルフの答えを見るまで、自分でそうすることを考えていませんでした。されている場合があります。この1あなたはマシンコードではなく、ASMの答えをASMソース文字のバイト数えることができるという事実のために私をclued。anatolygは、この質問を含むいくつかを投稿しています。
ピーターコーデス

5

Haskell、47バイト

n%p=[c|c<-['0'..],elem c$show$n^p]
f n=n%1==n%3

非常に遅い。でテストしc<-['0'..'9']ます。

の文字列表現に含まれているすべての文字をテストし、含まれている文字nのリストを作成します。n^3リストが等しいかどうかについても同様にチェックします。


Haskellにはセットリテラルや、リストから一意の要素を返す関数はありませんか?

2
@catいいえ。Haskellにはnub(一意の要素を取得する)とsortがありますが、両方とも長いインポートが必要ですimport Data.List。それでも、48バイトで非常に近くなります:import Data.List;q=sort.nub.show;f n=q n==q(n^3)
xnor

なぜソートする必要があるのですか...?

1
@catはnub最初の出現順を保持しnub [3,1,3,2,1,2] == [3,1,2]ます。セット型には変換されず(なし)、リストが提供されます。
xnor

ああ、私はHaskellは理にかなっているプリミティブ順不同コレクション型、持っていません実現したことがない

5

Dyalog APL、10 バイト

⍕≡⍕∪(⍕*∘3)

⍕≡ 引数のテキスト表現は次と同じです

⍕∪ 引数のテキスト表現の結合

(⍕*∘3) キューブ化された引数のテキスト表現?

TryAPLオンライン!

注:大きな数値の場合、設定⎕PP←34 ⋄ ⎕FR←1287(有効数字34、浮動小数点数128)


1
あなたは、n ^ 3の一意の数字がnの数字より少なくてはいけないと仮定していますか?
ngn

反例の存在を証明できますか?
アダム

1
106239、上部のコメントを参照
-ngn


5

Java 7、185 178文字

import java.util.*;
boolean a(int n){return new HashSet(Arrays.asList((n+"").split(""))).equals(new HashSet(Arrays.asList((new java.math.BigInteger(n+"").pow(3)+"").split(""))));}

として電話をかける:

public static void main(String [] args) {
    System.out.println(0 + " -> " + a(0));
    System.out.println(1 + " -> " + a(1));
    System.out.println(10 + " -> " + a(10));
    System.out.println(107624 + " -> " + a(107624));
    System.out.println(2103869 + " -> " + a(2103869));
    System.out.println(251894 + " -> " + a(251894));
    System.out.println(251895 + " -> " + a(251895));
    System.out.println(102343 + " -> " + a(102343));
    System.out.println(106239 + " -> " + a(106239));
}

出力:

0 -> true
1 -> true
10 -> true
107624 -> true
2103869 -> true
251894 -> true
251895 -> false
102343 -> false
106239 -> false

(インポートとメソッド定義もカウントする必要があるかどうかはわかりません。どちらの方法も見ました。コード自体の長さはたった141バイトです。)


実際、インポート/使用はバイトカウントの一部です。static ただし、削除できます。
ケビンCruijssen

よろしくお願いします。を削除しましたstatic
QBrute

4

ゼリー、8バイト

*3ṢQ⁼ṢQ$

オンラインでお試しください!

説明:

       $    # As a monadic (single argument) link:
    ⁼       # Return true if the following are equal
     ṢQ     # The unique sorted elements of 'n'
  ṢQ        # and The unique sorted elements
*3          # of 'n^3'

これは入力100では機能しません。
デニス

私はそれがない理由を理解するが、なぜしないこの作品
DJMcMayhem

1
Jellyは厳密に左から右に解析されるため、演算子の優先順位はありません。*3ṢQ⁼ṢQ$クイック$は、左側の2つの原子をモナドチェーンにグループ化するため、意図したとおりに機能します。
デニス

4

Pyth、10バイト

Pythの答えには十分な多様性がないため、1つではなく、さらに2つ追加しましょう。どちらも10バイトであり106239、サンプル入力としてテストされています(他のいくつかの答えは失敗しました)。

!s.++Q,`**

説明:

!s.++Q,`**QQQQ   Implicit input filling
        **QQQ    Q ^ 3
       `         repr(Q^3)
      ,      Q   [repr(Q^3),Q]
    +Q           [Q,repr(Q^3),Q]
  .+             Deltas ([Digits in Q but not in Q^3, digits in Q^3 but not in Q])
!s               Are both empty?

オンラインテストスイートを使用して最初の回答をお試しください。

2番目の答え:

qFmS{`d,**

説明:

qFmS{`d,**QQQQ   Implicit input filling
        **QQQ    Q ^ 3
       ,     Q   [Q^3, Q]
  m              map over each element d of [Q^3, Q]:
     `d           the element's string representation
    {             with duplicates removed
   S              and sorted
qF               Fold over equality (are the two the same?)

オンラインテストスイートを使用して2番目の答えを試してください。


4

Kotlin:46/88/96バイト

質問は、入力がどこから来たのかを特定しないので、ここに通常の3つの入力ソースがあります。


機能:46バイト

fun f(i:Long)="$i".toSet()=="${i*i*i}".toSet()

main()最初のプログラム引数を使用:88バイト

fun main(a:Array<String>){val i=a[0].toLong();println("$i".toSet()=="${i*i*i}".toSet())}


標準入力を使用するmain():96バイト

fun main(a:Array<String>){val i=readLine()!!.toLong();println("$i".toSet()=="${i*i*i}".toSet())}


1
PPCGへようこそ!code-golfのため、入出力は暗黙的に指定されます。こちらでコミュニティの合意基準をご覧いただけます。関数数は十分なはずです。
AdmBorkBork

4

Haskell、54 52バイト

@Laikoniに2バイトの保存をありがとう。

(%)=all.flip elem
k n|[a,b]<-show<$>[n,n^3]=b%a&&a%b

1
a%b=all(elem a)bを関数として宣言してからwith b%a&&a%bを呼び出すと、2バイト節約されます。
ライコニ

4

JavaScript(ES6)、44バイト

g=n=>n<1?0:g(n/10)|1<<n%10
n=>g(n)==g(n*n*n)

@KarlNapfの優れたC回答のポート。ES7はを介してバイトを保存しますn**3。JavaScriptの数値精度が制限されているため、最大208063までしか機能しません。最大1290までしか機能しない場合は、別のバイトを保存できます。


4

Perl 6、22バイト

{!(.comb$_³.comb)}

拡張:

{ # bare block lambda with implicit parameter 「$_」
  !(
    .comb # get a list of the graphemes ( digits )

     # Symmetric Set difference

    $_³.comb # cube and get a list of the graphemes
  )
}

対称差集合は、 「⊖」オペレータは空の戻りセットの双方が同等のセット(自動的に設定にリストをオン)である場合。その時点で残っているのは、論理的に反転することだけです。


あなたは$_ちょうどで置き換えることができます.
ジョーキング

4

C ++、82バイト

t(int a){int b=a*a*a,c,d;while(a|b)c|=1<<a%10,a/=10,d|=1<<b%10,b/=10;return c==d;}

関数t(a)は答えを返します。intをセットとして使用します。きれいに印刷:

t(int a)
{
    int b = a*a*a, c, d;
    while(a|b) c|=1 << a%10, a/=10, d|=1 << b%10, b/=10;
    return c==d;
}

あなたは含める必要があり#include<set>using namespace std;golfedコードとバイト数に

@cat #include<set>の代わりにalgorithm
カールNAPF

@KarlNapfああ、私はすべてのstdlibコンテナがアルゴリズムを通してアクセス可能であると思った-私はC ++について知っていることを示しています:)
cat

= 1 ... |ローカル変数関数の「C」が初期化されていないように思えるが、使用されるC
RosLuP

4

R、65 79 70バイト

取りnSTDIN、分割からnn^3一桁にし、2つのセットを比較します。gmpパッケージを使用して大きな整数を処理します(その欠点を指摘してくれたBillywobに感謝します)。今使ってsubstringカットアップするnn^3、提案のための@MickyTに感謝。(以前のバージョンを使用scanし、gsubハックのように)。

s=substring
setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e2,p),s(n^3,p,p))

残念ながら、n何らかのBigIntパッケージを使用しない限り、これは機能しません(大規模な場合)。参照してください。?.Machineこの比較例を参照するにはなどの最大の整数と浮動小数点数の詳細について2600001^3にRでのwolframalpha
Billywob

自分で使用する必要はありませんでしたが、gmpパッケージでこの問題を解決できるようです。
ビリーウォブ

ああ、いいキャッチ!私は答えを更新しましたgmp::as.bigz()。現在は大きな整数を処理するために使用しています。
rturnbull

あなたは、例えば数、分割する文字に変換するサブストリングという事実を利用することができs=substring;setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e4,p),s(n^3,p,p))
MickyT

@MickyT素晴らしい提案!私はsubstringそのように使用できるとは知りませんでした(私は今まで使用したことがありませんsubstr)。回答は編集され、提案が組み込まれました。
rturnbull

4

C ++ 14、93バイト

int b(auto i){int k=0;while(i)k|=1<<i%10,i/=10;return k;}int f(auto n){return b(n)-b(n*n*n);}

私のC回答のポートは、大きな数字(Lサフィックス付きの呼び出し)で動作します。


3

Haskell、47バイト

import Data.Set
s=fromList.show
f n=s n==s(n^3)

使用例:f 102343- > False

Data.Setモジュールのセットを使用します。ヘルパー関数sは、数字を文字列表現に変換し、文字からセットを作成します。


を使用してここにバイトを保存できませんs$n^3か?

@ ais523:いいえ、変換する(s n==s) (n^3)と型エラーが発生するためです。
nimi


3

PowerShell v2 +、94 93バイト

filter f($n){-join("$n"[0..99]|sort|select -u)}
(f($x=$args[0]))-eq(f("[bigint]$x*$x*$x"|iex))

(明確にするために改行、バイトカウントには含まれません)

最初の行はffilter入力を受け取り$n、次のことを行う(ここでは目的に合った機能に十分似ている)として定義します。

filter f($n){-join("$n"[0..99]|sort|select -u)}
       f($n)                                    # Input
                   "$n"                         # Cast as string
                       [0..99]                  # Index as char-array
                              |sort             # Sorted alphabetically
                                   |select -u   # Only select the -Unique elements
             -join(                          )  # Join those back together into a string
                                                 # Implicit return

2行目は入力を受け取り$argsfそれ-eqf実行し、$xキューブで実行するのが適切かどうかを確認します。明示的な[bigint]キャストに注意してください。そうしないと、科学表記法で結果が返されますが、これは明らかに機能しません。

ブール結果はパイプラインに残り、出力は暗黙的です。

PS C:\Tools\Scripts\golfing> 0,1,10,107624,251894,251895,102343,106239,2103869|%{"$_ --> "+(.\do-n-n3-same-digits.ps1 $_)}
0 --> True
1 --> True
10 --> True
107624 --> True
251894 --> True
251895 --> False
102343 --> False
106239 --> False
2103869 --> True

@ConnorLSWのおかげで1バイト節約


"$n"[0..99]代わりに使用[char[]]"$n"して1バイトを節約できます。処理する必要がある最大数は長さが約20文字しかないためです。
コルス

@ConnorLSW再びインデックス作成のトリックがあります。それを覚えておく必要があります。
-AdmBorkBork

100文字未満を使用することが保証されている限り、通常のchar[]変換よりも簡単に十分に保存できます。残りのコードは、配列を比較する簡単な方法があれば、私が得ることができる限り良いです("$n"[0..99]|group).Name負荷を節約するようなものを使用しますがcompare、ゴルフは正確で迅速かつ簡単ではありません。
colsw

それは答えを見ずに解決するために私が得るものです... ほぼ同じ答え ;-)。しかし、あなたはいくつかの非常に明白な最適化を見逃しました;-)
ジョーイ

3

Groovy、35 51文字/バイト

Groovyが含まれていないのが残念だったので、51バイトのオリジナルの試みを以下に示します。

def x(def n){"$n".toSet()=="${n.power(3)}".toSet()}

**マナトワークのおかげで、35バイトの匿名クロージャーとして、べき乗のために書き直されました。

{"$it".toSet()=="${it**3}".toSet()}

元の関数のいくつかのテストケース:

println x(0)
println x(1)
println x(10)
println x(107624)
println x(251894)
println x(251895)
println x(102343)

名前付きクロージャーcは次のように呼び出すことができますprintln c.call(107624)。匿名の35バイトのクロージャーは、次のように呼び出すことができます。println ({"$it".toSet()=="${it**3}".toSet()}(107624))

出力:

true
true
true
true
true
false
false

ご注意:コードゴルフのようなものが今あることを知ったので、うまくいけばうまくいきました!


こんにちはラドー、PPCGへようこそ!これは素晴らしい最初の答えです、+ 1!
-NoOneIsHere

私は47文字にしても、さらにそれを絞るために管理/クロージャを使って、バイト、しかしによりここに新しいものに私の以前の回答を編集することはできませんので、ここにある:def c={"$it".toSet()=="${it.power(3)}".toSet()}
ラドー

1
匿名関数は受け入れ可能です。そして**、べき乗に演算子を使用します。
マナトワーク

ありがとう@NoOneIsHere!また、テストケースのためのクロージャを呼び出すと交換する伴うだろうx(107624)c.call(107624)
ラドー

@manatworkありがとうございます!匿名のクロージャを使用して**:美しい35個の文字にそれをダウンさせます/バイト{"$it".toSet()=="${it**3}".toSet()}
ラドー

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