Apakah n dan n ^ 3 memiliki set digit yang sama?


52

Diberi angka n (0 <= n <= 2642245), periksa apakah n dan n 3 memiliki set digit yang sama, dan berikan nilai yang benar atau salah.

Sebagai contoh, mari kita periksa angka 100.

100 3 adalah 1000000.

Set digit dalam 100 adalah {0, 1}.

Set digit dalam 1000000 adalah {0, 1}.

Karena itu, 100 harus memberikan nilai kebenaran.

Uji kasus

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

Ingat, ini adalah , jadi kode dengan byte paling sedikit menang.

OEIS A029795


28
Usulan uji kasus: 106239
Dennis

8
Kasus uji: 2103869 -> True. Ini (atau yang lebih besar) diperlukan untuk menguji bahasa dengan longtipe data.
mbomb007

5
Sayang sekali maksnya terlalu besar untuk bahasa tanpa tipe integer 64 bit.
edc65

17
Saya pikir Anda harus secara eksplisit tentang basis ... dalam biner itu agak setengah menyenangkan :-D
The Vee

7
@ ZoltánSchmidt 106.239 adalah yang terkecil bilangan bulat positif n sehingga - 1199090390129919 - tidak mengandung semua angka dari n . Beberapa jawaban hanya memeriksa apakah n berisi semua digit dan karenanya mendapatkan hasil yang salah untuk 106239 .
Dennis

Jawaban:


28

Python 3, 36 32 byte

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

Saya pikir ini hanya berfungsi di Python 3.5 dan yang lebih baru. Empat byte telah hilang, berkat Copper.


8
Dalam python 2 Anda dapat menggunakan backtics sebagai jalan pintas untuk repr (), menghemat 6 byte. set(`x`)
DenDenDo

9
@DenDenDo Setiap input lebih besar dari 2097152( sys.maxint**(1/3.)) dan kurang dari itu sys.maxint+1akan kembali Falsejika Anda menggunakan repr(). repl.it/EXs2/1 . Rindu memiliki Ldi akhir.
mbomb007

9
Belum diuji, tetapi Anda mungkin bisa melakukannya lambda x:{*str(x)}=={*str(x**3)}dengan Python 3.5+.
Tembaga

1
@ BenHoyt Ini lebih ringkas daripada menggunakan print (...) dan input (). Menjadikannya fungsi lebih pendek daripada membuat program penuh.
0WJYxW9FMN

1
Karena pertanyaannya mengatakan mengembalikan nilai yang benar atau salah sudah cukup, Anda dapat menggantinya ==dengan ^. Dua set yang sama mengarah ke {}yang salah.
RemcoGerlich

19

05AB1E , 6 byte

05AB1E menggunakan pengkodean CP-1252 .

3mê¹êQ

Cobalah online!

Penjelasan

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

1
@PuzomorCroatia: 05AB1E menggunakan pengkodean CP-1252 , jadi semua karakter ini masing-masing 1 byte. Sangat umum untuk bermain golf menggunakan halaman kode dengan karakter yang lebih dapat dicetak daripada UTF-8 atau sebagai alternatif membuat halaman kode mereka sendiri.
Emigna

7
Terima kasih atas jawabannya. Sayangnya, ketika mencoba mengedit komentar saya, saya menghapusnya. Hanya untuk memperjelas semua hal, saya bertanya tentang pengkodean karakter dalam bahasa kode golf
Puzomor Croatia

14

C, 73 byte

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

Membuat set melalui bit. Pengembalian 0untuk set yang sama, apa pun untuk set yang berbeda.

Tidak Disatukan:

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

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

Kode ungolfed tidak ada 1 <<saat mengatur bit dengan k |= 1 << i % 10. Solusi hebat!
1Darco1

1
Saya menggunakan ide bitmap ini untuk membuat fungsi kode mesin 39 byte x86-64 :)
Peter Cordes

Apakah kita diizinkan untuk menganggapnya benar 0? Saya kira strcmpbekerja seperti itu, jadi sepertinya masuk akal dalam C.
Peter Cordes

1
Ini hanya berfungsi untuk seluruh rentang input yang diperlukan oleh pertanyaan jika intlebih besar dari 64-bit. (Bahkan 64-bit yang ditandatangani tidak cukup, tetapi 64-bit yang tidak ditandatangani adalah). Jadi tidak ada implementasi nyata dari C yang saya tahu di mana ini memenuhi persyaratan pertanyaan. (Itu berfungsi dengan benar unsigned long long, atau hanya unsigned longdalam implementasi di mana itu adalah tipe 64-bit). GNU C mendefinisikan __int128_tpada mesin 64-bit (tanpa header) ...
Peter Cordes

8

Perl, 31 + 2 ( -plbendera) = 25 21 18 34 33 byte

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

Menggunakan:

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

Keluaran: 1\natau 0\n.

Terima kasih kepada @Dada selama 3 byte, Gabriel Benamy untuk 1 byte, & @Zaid untuk laporan bug.


1
Jawaban bagus! Anda masih dapat menyimpan beberapa (3) byte:perl -pe '$_=$_**3!~/[^$_]/'
Dada

@Zaid Thanx. Tetap.
Denis Ibaev

Sekarang ini menghasilkan false untuk 10:(
Zaid

@Zaid Yap. -lbendera dibutuhkan.
Denis Ibaev

2
Ubah &&ke *untuk menyimpan byte
Gabriel Benamy

7

Mathematica, 34 byte

f=Union@*IntegerDigits;f@#==f[#^3]&

Implementasi langsung (fungsi tanpa nama dari satu argumen integer).


7

Jelly , 8 byte

,3*\D‘ṬE

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

,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

CJam, 8 byte

l_~3#s^!

Suite uji.

Penjelasan

l   e# Read input.
_~  e# Duplicate and evaluate.
3#  e# Raise to third power.
s   e# Convert back to string.
^   e# Symmetric set difference. Gives an empty list iff the two sets
    e# are equal.
!   e# Logical NOT.

6

JavaScript ES6, 55 51 byte

Terima kasih untuk Downgoat selama 3 byte! Anda dapat menyimpan satu byte dengan mengonversi ke ES7 dan menggunakan n**3alih-alih n*n*n.

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

Cukup sederhana.


mengerikan bahwa tidak ada cara yang lebih baik untuk membandingkan set untuk kesetaraan
njzk2

1
@ njzk2 Yah, saya akan mengatakan tragedi yang lebih besar adalah itu ==tidak bekerja bahkan pada array.
Conor O'Brien

Anda dapat menyimpan byte dengan mengubah n*n*nke n**3, tapi saya kira itu mungkin ES7 dan bukan ES6.
Robert Hickman

1
@Downgoat Terima kasih, itu mengilhami saya untuk menyimpan beberapa byte lagi!
Conor O'Brien

3
Ini gagal untuk 2103869, dan masalahnya secara eksplisit membutuhkan solusi untuk menyelesaikannya 2642245.
user5090812

6

C #, 241 208 205 201 193 233 222 220 212 203 177 159 byte (109 alternatif)

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;};

Lambda's harus secara khusus menggunakan ulongtipe:

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

Terima kasih kepada @Corak dan @Dennis_E karena telah menyimpan beberapa byte, dan @TimmyD untuk menemukan masalah dengan solusi asli saya. Terima kasih kepada @SaxxonPike untuk menunjukkan masalah ulong / long / desimal / etc (yang sebenarnya juga menyelamatkan saya beberapa byte).


Ada juga solusi 109 byte menggunakan HashSets, mirip dengan jawaban Java di sini, tapi saya akan tetap berpegang pada solusi asli saya untuk skor saya.

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

Anda dapat memeriksa p<0bukan p==1?
Yytsi

@ TuukkaX Akan melakukan itu, tapi cara saya menentukan set sekarang menggunakan array yang sama bilangan bulat, menambah indeks yang sesuai untuk kedua string, sehingga nilai 0 atau 2 tidak apa-apa, tetapi jika ada 1, itu harus kembali salah.
Yodle

Hemat sangat sedikit dengan mengekstraksi kreasi dan mengisi array ke dalam lambda terpisah: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

Anda dapat mengganti int.Parse(c+"")denganc-'0'
Dennis_E

Kasing uji gagal 2103869. Saya mengalami masalah yang sama. (Nevermind, saya tahu mengapa. Saya menggunakan longpengganti ulongdan test case ini menggunakan MSB.)
SaxxonPike

6

Java 8, 154 karakter

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

Disebut seperti ini:

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));
}

Output:

true
true
true
true
true
false
false

Jawaban yang sangat Java 8-y, menggunakan lambda serta stream termasuk beberapa konversi angka-ke-string.

Sayangnya kita perlu menggunakan BigInteger.pow(3)alih-alih Math.pow(a,3)karena Math.pow menggunakan ganda yang tidak tepat, yang mengembalikan nilai yang salah dengan angka besar (dimulai dengan 2103869).


Hal static Y yitu adalah sintaks inisialisasi yang aneh, apakah itu ditugaskan secara otomatis y.nkarena antarmuka memiliki tepat satu anggota?
kucing

Saya percaya begitu, ya. Sejujurnya saya baru ke Jawa 8 karena tempat kerja saya masih di 7, tapi itulah yang saya rasakan untuk bekerja.
Hypino

Kompiler secara otomatis menambahkan @FunctionalInterfaceanotasi (antarmuka dengan hanya satu metode, lihat javadoc) yang membuat lambdas berfungsi sebagai ganti instantiasi jenis anonim yang biasa.
1Darco1

Ini pada dasarnya sama dengan 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()); } }dan staticpengubah hanya ada untuk memungkinkan panggilan y.n(int)dari metode utama statis.
1Darco1

1
Nevermind, baca saja posting meta tentang ini dan tampaknya komunitas setuju. Saya kira saya bisa melihat mengapa. Saya akan memperbarui.
Hypino

6

PESTA, 69, 59 byte

MEMPERBARUI

Cara lain yang bagus untuk melakukan ini di bash adalah dengan menggunakan tr (62 byte, tetapi mungkin bisa diperas sedikit lagi)

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

EDIT: Beberapa lagi optimasi (Thx! @Manatwork)

Golf

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

Uji

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 - untuk sukses (kode keluar) 1 - untuk kegagalan (kode keluar)


Saya khawatir teori dasarnya salah di sini. Coba T <<< 11. Akan mengatakan set digit sama hanya karena 11 ** 3 == 1331 berisi digit yang tidak ada dalam angka asli dua kali.
manatwork

Yap, Anda benar, sudah pasti! Terima kasih !
zeppelin

Oke, tapi sekarang beberapa ruang tambahan tersisa di kode. Tidak yakin mengapa Anda menambahkan -wsecara eksplisit ke fold. Jika uniqdigunakan tanpa opsi, sort -ubisa menggantinya. Dan memberi makan panggilan S 2 dengan-string di sini. Dan saya pikir tidak perlu mengutip formula yang diteruskan bc.
manatwork

@manatwork, thx, saya telah memperbaiki argumen flip, menghapus spasi, dan membuat argumen diff kedua menggunakan di sini-doc. Sekarang saya juga menyalurkan argumen pertama ke dalam diff , dan telah menghilangkan tanda kutip berlebihan di sekitar ekspresi bc . > uniq digunakan tanpa opsi, sort -u dapat menggantinya. Itu hanya sisa-sisa dari versi sebelumnya (adalah uniq -u )). Terima kasih !
zeppelin

1
@zeppelin: Anda bisa menggunakan dan cmpbukannya diffmenyimpan 1 byte.
Ipor Sircer

6

fungsi kode mesin x86-64, 40 byte.

Atau 37 byte jika 0 vs non-nol diizinkan sebagai "benar", seperti strcmp.

Berkat jawaban Karl Napf C untuk ide bitmap, yang x86 dapat lakukan dengan sangat efisien dengan BTS .

Fungsi tanda tangan _Bool cube_digits_same(uint64_t n);:, menggunakan ABI Sistem x86-64. ( ndalam RDI, nilai pengembalian boolean (0 atau 1) dalam AL).

_Booldidefinisikan oleh ISO C11, dan biasanya digunakan oleh #include <stdbool.h>untuk mendefinisikan booldengan semantik yang sama dengan C ++ bool.

Potensi penghematan:

  • 3 byte: Mengembalikan kondisi terbalik (bukan nol jika ada perbedaan). Atau dari inline asm: mengembalikan kondisi bendera (yang dimungkinkan dengan gcc6)
  • 1 byte: Jika kita bisa mengalahkan EBX (melakukan hal itu akan memberikan fungsi ini konvensi panggilan non-standar). (bisa melakukannya dari inline asm)
  • 1 byte: instruksi RET (dari inline asm)

Semua ini dimungkinkan jika ini adalah fragmen inline-asm alih-alih fungsi, yang akan membuatnya 35 byte untuk inline-asm .

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.

LOOP sepertinya merupakan cara terkecil untuk mengulang sekali. Saya juga melihat hanya mengulangi loop (tanpa awalan REX, dan register bitmap yang berbeda), tapi itu sedikit lebih besar. Saya juga mencoba menggunakan PUSH RSI, dan menggunakan test spl, 0xf/ jzuntuk loop sekali (karena ABI mensyaratkan bahwa RSP adalah 16B disejajarkan sebelum CALL, jadi satu dorongan menyelaraskannya, dan satu lagi menyelaraskannya lagi). Tidak ada test r32, imm8pengkodean, jadi cara terkecil adalah dengan instruksi TEST 4B (termasuk awalan REX) untuk menguji hanya byte rendah RSP terhadap imm8. Ukurannya sama dengan LEA + LOOP, tetapi dengan instruksi PUSH / POP tambahan diperlukan.

Diuji untuk semua n dalam rentang tes, vs implementasi C steadybox (karena menggunakan algoritma yang berbeda). Dalam dua kasus hasil berbeda yang saya lihat, kode saya benar dan steadybox salah. Saya pikir kode saya benar untuk semua 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);
    }
}

Satu-satunya garis yang dicetak memiliki c = 1 asm = 0: false-positif untuk algoritma C.

Juga diuji terhadap uint64_tversi implementasi Karl C dari algoritma yang sama, dan hasilnya cocok untuk semua input.


Kode golf dalam kode mesin ? Itu penguasaan sejati!
chx

@ chx: Ini benar-benar dalam bahasa assembly, mengoptimalkan ukuran kode. Saya tidak menulis hex byte secara langsung, saya hanya tahu (atau memeriksa) ukuran masing-masing instruksi. (Apa yang saya posting adalah dari perakitan dengan yasm dan kemudian berjalan objdump -drwC -Mintelpada file objek, dan menyalin komentar). Ini adalah bahasa tempat mengoptimalkan ukuran kode sebenarnya berguna dalam kehidupan nyata. (Tetapi meskipun demikian, hanya dalam kasus-kasus yang jarang seperti bootloader atau demo. Biasanya itu hanya layak menyimpan ukuran kode ketika tidak merusak kinerja dalam kasus yang sudah di-cache, tetapi kemudian berguna untuk menghindari decode bottlenecks + cache misses)
Peter Cordes

@ chx: tapi ya, bermain golf di asm memang membuatku merasa seperti seorang badass, terima kasih sudah memperhatikan :) Lihat jawaban saya yang lain, di sini dan di SO :)
Peter Cordes

Saya adalah topi yang sangat tua dalam perakitan (1987, Z80 adalah yang pertama) tetapi saya tidak akan pernah berpikir untuk masuk ke dalam kode golf dengan itu. Saya akan berpikir tidak mungkin.
chx

@ chx: Saya hanya bermain golf sesekali, biasanya hanya ketika saya melihatnya di Hot Network Questions yang terlihat masuk akal untuk asm. Biasanya barang dengan angka, bukan string. Namun, beberapa orang melakukan golf di ASM. Saya tidak berpikir untuk melakukannya sendiri sampai saya melihat jawaban golf kode mesin orang lain. Mungkin ini yang memberi saya petunjuk bahwa Anda dapat menghitung byte kode mesin alih-alih karakter sumber asm untuk jawaban asm. anatolyg telah memposting beberapa, termasuk pada pertanyaan ini.
Peter Cordes

5

Haskell, 47 byte

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

Sangat lambat. Tes dengan c<-['0'..'9'].

Menguji setiap karakter untuk dimasukkan dalam representasi string n, dan membuat daftar yang disertakan. Apakah demikian untuk n^3dan memeriksa apakah daftar itu sama.


Apakah Haskell tidak menetapkan literal, atau fungsi yang mengembalikan elemen unik dari daftar?
kucing

2
@ kucing No. Haskell memiliki nub(mendapatkan elemen unik) dan sort, tetapi keduanya membutuhkan impor yang panjang import Data.List. Meski begitu, ia datang sangat dekat pada 48 byte: import Data.List;q=sort.nub.show;f n=q n==q(n^3).
xnor

Mengapa harus menyortir ...?
kucing

1
@cat nubmenjaga ketertiban dengan penampilan pertama, yaitu nub [3,1,3,2,1,2] == [3,1,2]. Itu tidak mengkonversi ke tipe yang ditetapkan (tidak ada), tetapi memberikan daftar.
xnor

Oh, saya tidak pernah menyadari bahwa Haskell tidak memiliki tipe pengumpulan primitif yang tidak teratur, masuk akal
kucing

5

Dyalog APL , 10 byte

⍕≡⍕∪(⍕*∘3)

⍕≡ adalah representasi teks argumen yang identik dengan

⍕∪ penyatuan representasi teks argumen dan

(⍕*∘3) representasi teks dari argumen dadu?

TryAPL online!

Catatan: Untuk angka besar, atur ⎕PP←34 ⋄ ⎕FR←1287(34 digit signifikan, float 128 bit)


1
Anda berasumsi bahwa angka unik dalam n ^ 3 tidak boleh lebih kecil dari angka dalam n?
ngn

Bisakah Anda membuktikan keberadaan contoh tandingan?
Adám

1
106239, lihat komentar di bagian atas
ngn


5

Java 7, 185 178 karakter

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(""))));}

Panggil sebagai:

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));
}

Keluaran:

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

(Saya tidak pernah yakin apakah saya harus menghitung impor dan definisi metode juga ... Saya sudah pernah melihat kedua cara. Kode itu sendiri hanya akan panjang 141 byte.)


Impor / usings memang merupakan bagian dari byte-count. Anda dapat menghapusnya static .
Kevin Cruijssen

Oke terima kasih. Dihapus static.
QBrute

4

Jelly , 8 byte

*3ṢQ⁼ṢQ$

Cobalah online!

Penjelasan:

       $    # 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'

Ini tidak berfungsi dengan input 100 .
Dennis

Saya mengerti mengapa tidak, tetapi mengapa ini tidak berhasil ?
DJMcMayhem

1
Karena Jelly benar-benar diuraikan dari kiri ke kanan, tanpa diutamakan operator. *3ṢQ⁼ṢQ$berfungsi sebagaimana dimaksud, karena dengan cepat $mengelompokkan dua atom di sebelah kirinya menjadi rantai monadik.
Dennis

4

Pyth, 10 byte

Karena kita tidak memiliki cukup variasi dengan jawaban Pyth, mari kita tambahkan bukan hanya satu, tetapi dua lagi! Keduanya 10 byte, dan telah diuji dengan 106239sebagai sampel input (yang beberapa jawaban lainnya gagal).

!s.++Q,`**

Penjelasan:

!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?

Coba jawaban pertama menggunakan test suite online.

Jawaban kedua:

qFmS{`d,**

Penjelasan:

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?)

Coba jawaban kedua menggunakan test suite online.


4

Kotlin: 46/88/96 byte

Pertanyaannya tidak menentukan dari mana input berasal, jadi inilah 3 sumber input yang biasa.


Fungsi: 46 byte

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

main () menggunakan argumen program pertama: 88 byte

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


main () menggunakan input standar: 96 byte

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


1
Selamat datang di PPCG! Input / output ditentukan secara implisit karena kode-golf . Anda dapat melihat standar konsensus komunitas di sini . Hitungan fungsi Anda harus memadai.
AdmBorkBork

4

Haskell, 54 52 byte

Terima kasih @Laikoni karena menyimpan dua byte.

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

1
Mendeklarasikan a%b=all(elem a)bsebagai fungsi dan kemudian memanggil dengan b%a&&a%bharus menyimpan dua byte.
Laikoni

4

JavaScript (ES6), 44 byte

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

Port jawaban @ KarlNapf yang sangat baik. ES7 menyimpan byte melalui n**3. Hanya berfungsi hingga 208063 karena ketepatan numerik JavaScript terbatas; jika Anda hanya membutuhkannya hingga 1290, Anda dapat menyimpan byte lain.


4

Perl 6 , 22 byte

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

Diperluas:

{ # 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
  )
}

Perbedaan Set Symmetric 「⊖」 operator mengembalikan Set kosong jika kedua belah pihak Set setara (secara otomatis mengubah daftar menjadi Set). Pada saat itu satu-satunya yang tersisa untuk dilakukan adalah membalikkannya secara logis.


Anda dapat mengganti $_dengan hanya.
Jo King

4

C ++, 82 byte

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;}

Fungsi t (a) mengembalikan jawabannya. Menggunakan int sebagai set. Dicetak dengan baik:

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;
}

Anda harus memasukkan #include<set>dan using namespace std;dalam kode golf dan hitungan byte
cat

@cat #include<set>bukannyaalgorithm
Karl Napf

@ KarlNapf oh, saya pikir semua kontainer stdlib dapat diakses melalui algoritma - menunjukkan apa yang saya ketahui tentang C ++ :)
cat

Sepertinya saya variabel lokal ke fungsi "c" tidak diinisialisasi tetapi digunakan c | = 1 ...
RosLuP

4

R, 65 79 70 byte

Diambil ndari stdin, split ndan n^3menjadi digit tunggal, dan membandingkan dua set. Menggunakan gmppaket untuk menangani bilangan bulat besar (terima kasih kepada Billywob karena telah menunjukkan kekurangan itu). Sekarang digunakan substringuntuk memotong ndan n^3, terima kasih kepada @MickyT untuk sarannya. (Versi sebelumnya digunakan scandan gsubdengan cara hacky.)

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

Sayangnya ini tidak akan berfungsi (untuk ukuran besar n) kecuali jika Anda menggunakan semacam paket BigInt. Lihat ?.Machinedetail pada bilangan bulat terbesar dan float dll. Untuk melihat perbandingan ini, misalnya 2600001^3dalam R ke wolframalpha
Billywob

Saya tidak pernah harus menggunakannya sendiri tetapi sepertinya gmppaket tersebut dapat menyelesaikan masalah ini.
Billywob

Ah, tangkapan yang bagus! Saya telah memperbarui jawabannya, sekarang digunakan gmp::as.bigz()untuk menangani bilangan bulat besar.
rturnbull

Anda dapat menggunakan fakta pengubahan substring ke karakter untuk membagi nomor, misalnyas=substring;setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e4,p),s(n^3,p,p))
MickyT

@MickyT Saran fantastis! Saya tidak tahu substringbisa digunakan seperti itu (saya hanya pernah menggunakan substr). Jawaban telah diedit untuk memasukkan saran Anda sekarang.
rturnbull

4

C ++ 14, 93 byte

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);}

Port jawaban C saya , berfungsi untuk angka besar (panggilan dengan Lakhiran).


3

Haskell, 47 byte

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

Contoh penggunaan: f 102343-> False.

Menggunakan set dari Data.Setmodul. Fungsi helper smengubah angka menjadi representasi string dan daripada membuat seperangkat karakter.


Tidak bisakah Anda menyimpan byte di sini menggunakan s$n^3?

@ ais523: Tidak, karena ini diterjemahkan (s n==s) (n^3)yang memberikan kesalahan tipe.
nimi

3

Brachylog , 11 byte

doI,?:3^doI

Cobalah online!

Terima kasih kepada @DestructibleWatermelon karena menunjukkan masalah dengan jawaban asli saya.

Penjelasan

(?)doI,           I is the Input sorted with no duplicates
       ?:3^       Compute Input^3
           doI    Input^3 sorted with no duplicates is I

Saya suka kucing yang tersenyum dalam hal ini: 3
QBrute

3

PowerShell v2 +, 94 93 byte

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

(Baris baru untuk kejelasan, tidak termasuk dalam bytecount)

Baris pertama didefinisikan fsebagai filter(mirip-ish cukup untuk fungsi untuk tujuan kita di sini untuk tidak masuk ke spesifik) yang mengambil input $ndan melakukan hal berikut:

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

Baris kedua mengambil input $args, melakukan fdi atasnya, dan memeriksa apakah itu -eqakan fdilakukan pada $xpotong dadu. Perhatikan [bigint]pemeran eksplisit , yang diperlukan kalau tidak kita akan mendapatkan hasilnya kembali dalam notasi ilmiah, yang jelas tidak akan berhasil.

Hasil Boolean ditinggalkan di jalur pipa, dan hasilnya tersirat.

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

Menyimpan satu byte berkat @ConnorLSW


Anda dapat menggunakan "$n"[0..99]alih-alih [char[]]"$n"menyimpan satu byte, karena jumlah terbesar yang harus Anda tangani hanya sekitar 20 karakter.
colsw

@ConnorLSW Ada trik pengindeksan lagi. Saya perlu mengingatnya.
AdmBorkBork

selama Anda dijamin akan menggunakan kurang dari 100 karakter itu adalah cukup mudah menyimpan daripada char[]konversi normal , sisa kode Anda sebaik yang saya bisa mendapatkannya, jika ada cara singkat untuk membandingkan array, Anda bisa gunakan sesuatu seperti ("$n"[0..99]|group).Nameuntuk menghemat banyak tetapi comparetidak persis cepat dan mudah untuk golf.
colsw

Itulah yang saya dapatkan untuk menyelesaikannya tanpa melihat jawabannya ... Cukup banyak jawaban yang sama ;-). Tetapi Anda melewatkan beberapa optimasi yang sangat jelas ;-)
Joey

3

Groovy, 35 51 karakter / byte

Saya sedih tidak melihat Groovy dimasukkan, jadi inilah upaya 51 byte asli saya:

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

Ditulis ulang sebagai penutupan anonim 35-byte dan dengan **untuk eksponensial, terima kasih kepada manatwork:

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

Beberapa test case untuk fungsi aslinya:

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

Sebuah penutupan bernama cbisa disebut seperti ini: println c.call(107624). Penutupan 35 byte anonim dapat disebut seperti ini:println ({"$it".toSet()=="${it**3}".toSet()}(107624))

Output:

true
true
true
true
true
false
false

Harap dicatat: Saya mengetahui bahwa sesuatu seperti golf kode ada sekarang, jadi semoga saya benar!


Halo Rado, dan Selamat Datang di PPCG! Ini adalah jawaban pertama yang bagus, +1!
NoOneIsHere

Saya berhasil memerasnya lebih jauh ke 47 karakter / byte dengan menggunakan penutupan, tetapi tidak dapat mengedit jawaban saya sebelumnya karena baru di sini, jadi ini dia:def c={"$it".toSet()=="${it.power(3)}".toSet()}
Rado

1
Fungsi anonim dapat diterima. Dan gunakan** operator untuk eksponensial.
manatwork

Terima kasih @NoOneIsHere! Juga, memanggil penutupan untuk kasus uji akan melibatkan penggantian x(107624)denganc.call(107624)
Rado

@Manatwork terima kasih! Menggunakan penutupan anonim dan **membawanya ke indah 35 karakter / byte:{"$it".toSet()=="${it**3}".toSet()}
Rado

2

Ruby, 48 byte

->n{(f=->x{x.to_s.chars.uniq.sort})[n]==f[n**3]}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.