N và n ^ 3 có cùng một bộ chữ số không?


52

Cho một số n (0 <= n <= 2642245), kiểm tra xem nn 3 có cùng một bộ chữ số hay không và đưa ra giá trị trung thực hoặc giá trị falsey tương ứng.

Ví dụ: hãy kiểm tra số 100.

100 3 là 1000000.

Tập hợp các chữ số trong 100 là {0, 1}.

Tập hợp các chữ số trong 1000000 là {0, 1}.

Do đó, 100 nên đưa ra một giá trị trung thực.

Các trường hợp thử nghiệm

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

Hãy nhớ rằng, đây là , vì vậy mã có ít byte nhất sẽ thắng.

OEIS A029795


28
Trường hợp thử nghiệm được đề xuất: 106239
Dennis

8
Trường hợp thử nghiệm : 2103869 -> True. Điều này (hoặc một ngôn ngữ lớn hơn) là cần thiết để kiểm tra ngôn ngữ với longkiểu dữ liệu.
mbomb007

5
Quá tệ, max quá lớn đối với ngôn ngữ không có loại số nguyên 64 bit.
edc65

17
Tôi nghĩ bạn nên rõ ràng về cơ sở ... trong nhị phân, đó là một nửa niềm vui :-D
The Vee

7
@ ZoltánSchmidt 106239 là số nguyên dương n nhỏ nhất sao cho - 1199090390129919 - không chứa tất cả các chữ số của n . Một số câu trả lời chỉ kiểm tra xem n có chứa tất cả các chữ số của hay không và do đó có kết quả sai cho 106239 .
Dennis

Câu trả lời:


28

Python 3, 36 32 byte

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

Tôi nghĩ rằng điều này chỉ hoạt động trong Python 3.5 trở lên. Bốn byte đã biến mất, nhờ có Copper.


8
Trong python 2, bạn có thể sử dụng backtics làm lối tắt cho repr (), tiết kiệm 6 byte. set(`x`)
DenDenDo

9
@DenDenDo Bất kỳ đầu vào nào lớn hơn 2097152( sys.maxint**(1/3.)) và ít hơn sys.maxint+1sẽ trở lại Falsenếu bạn sử dụng repr(). thay thế.it / EXs2 / 1 . Longs có một Lở cuối.
mbomb007

9
Chưa được kiểm tra, nhưng bạn có thể có thể làm lambda x:{*str(x)}=={*str(x**3)}trong Python 3.5+.
Đồng

1
@BenHoyt Nó ngắn gọn hơn so với sử dụng print (...) và input (). Làm cho nó một chức năng ngắn hơn so với làm một chương trình đầy đủ.
0WJYxW9FMN

1
Bởi vì câu hỏi nói trả về một giá trị trung thực hoặc giả là đủ, bạn có thể thay thế ==bằng ^. Hai bộ bằng nhau dẫn đến {}đó là giả.
RemcoGerlich

19

05AB1E , 6 byte

05AB1E sử dụng mã hóa CP-1252 .

3mê¹êQ

Hãy thử trực tuyến!

Giải trình

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

1
@PuzomorCicut: 05AB1E sử dụng mã hóa CP-1252 , vì vậy tất cả các ký tự này là 1 byte mỗi ký tự. Điều khá phổ biến đối với các ngôn ngữ chơi gôn là sử dụng các trang mã có nhiều ký tự có thể in hơn UTF-8 hoặc tạo ra trang mã của riêng họ.
Emigna

7
Cảm ơn câu trả lời. Thật không may, trong khi cố gắng chỉnh sửa bình luận của tôi, tôi đã xóa nó. Để làm cho mọi thứ rõ ràng với mọi người, tôi đã hỏi về việc mã hóa các ký tự bằng ngôn ngữ chơi gôn mã
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);}

Tạo tập hợp thông qua các bit. Trả về 0cho cùng một bộ, bất cứ điều gì khác cho các bộ khác nhau.

Ung dung:

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

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

Mã không mã hóa bị thiếu 1 <<khi thiết lập các bit với k |= 1 << i % 10. Giải pháp tuyệt vời!
1Darco1

1
Tôi đã sử dụng ý tưởng bitmap này để thực hiện chức năng mã máy 39 byte x86-64 :)
Peter Cordes

Chúng ta có được phép coi 0là sự thật không? Tôi đoán strcmphoạt động theo cách đó, vì vậy có vẻ hợp lý trong C.
Peter Cordes

1
Điều này chỉ hoạt động cho toàn bộ phạm vi đầu vào theo yêu cầu của câu hỏi nếu intlớn hơn 64 bit. (Ngay cả 64 bit đã ký là không đủ, nhưng 64 bit không dấu là). Vì vậy, không có triển khai thực sự nào của C mà tôi biết nơi này đáp ứng yêu cầu của câu hỏi. (Nó hoạt động chính xác với unsigned long long, hoặc chỉ unsigned longtrong các triển khai trong đó là loại 64 bit). GNU C định nghĩa __int128_ttrên các máy 64 bit (không có bất kỳ tiêu đề nào) ...
Peter Cordes

8

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

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

Sử dụng:

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

Đầu ra: 1\nhoặc 0\n.

Thanx đến @Dada cho 3 byte, Gabriel Benamy cho 1 byte và @Zaid cho các báo cáo lỗi.


1
Câu trả lời tốt đẹp! Bạn vẫn có thể lưu một vài (3) byte:perl -pe '$_=$_**3!~/[^$_]/'
Dada

@ Trả tiền Thanx. Đã sửa.
Denis Ibaev

Bây giờ nó ra sai cho 10:(
Zaid

@ Trả lời Yep. -lcờ cần thiết.
Denis Ibaev

2
Thay đổi &&thành a *để lưu một byte
Gabriel Benamy

7

Toán học, 34 byte

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

Thực hiện trực tiếp (hàm không tên của một đối số nguyên).


7

Thạch , 8 byte

,3*\D‘ṬE

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

,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^!

Bộ thử nghiệm.

Giải trình

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

Cảm ơn Downgoat cho 3 byte! Bạn có thể lưu một byte bằng cách chuyển đổi sang ES7 và sử dụng n**3thay vì n*n*n.

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

Đủ đơn giản.


Thật tệ khi không có cách nào tốt hơn để so sánh các bộ tương đương
njzk2

1
@ njzk2 Chà, tôi muốn nói rằng thảm kịch lớn hơn là ==nó không hoạt động ngay cả trên mảng.
Conor O'Brien

Bạn có thể lưu một byte bằng cách thay đổi n*n*nthành n**3, nhưng tôi đoán đó có thể là ES7 chứ không phải ES6.
Robert Hickman

1
@Downgoat Cảm ơn, điều đó đã truyền cảm hứng cho tôi để tiết kiệm thêm một số byte!
Conor O'Brien

3
Điều này không thành công 2103869và vấn đề rõ ràng đòi hỏi các giải pháp để giải quyết 2642245.
dùng5090812

6

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

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

Các lambda phải đặc biệt sử dụng ulongloại:

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

Cảm ơn @Corak và @Dennis_E vì đã lưu một số byte và @TimmyD vì đã tìm ra vấn đề với giải pháp ban đầu của tôi. Cảm ơn @SaxxonPike đã chỉ ra vấn đề ulong / long / binary / etc (thực sự cũng giúp tôi tiết kiệm được một số byte).


Ngoài ra còn có một giải pháp 109 byte sử dụng HashSets, tương tự như các câu trả lời Java ở đây, nhưng tôi sẽ sử dụng giải pháp ban đầu cho điểm số của mình.

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

Bạn có thể kiểm tra p<0thay vì p==1?
Yytsi

@TuukkaX Sẽ làm điều đó, nhưng cách tôi xác định các bộ hiện đang sử dụng cùng một mảng số nguyên, tăng chỉ số thích hợp cho cả hai chuỗi, vì vậy giá trị 0 hoặc 2 là ổn, nhưng nếu có thì 1, nó sẽ trả về false.
Yodle

Tiết kiệm rất ít bằng cách trích xuất việc tạo và điền các mảng vào một lambda riêng biệt: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

Bạn có thể thay thế int.Parse(c+"")bằngc-'0'
Dennis_E

Trường hợp thử nghiệm thất bại 2103869. Tôi gặp vấn đề tương tự. (Nevermind, tôi đã tìm hiểu lý do tại sao. Tôi đã sử dụng longthay thế ulongvà trường hợp thử nghiệm này sử dụng MSB.)
SaxxonPike

6

Java 8, 154 ký tự

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

Được gọi như thế này:

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

Đầu ra:

true
true
true
true
true
false
false

Câu trả lời 8-y rất Java, sử dụng lambda cũng như các luồng bao gồm một số chuyển đổi từ chuỗi sang chuỗi ưa thích.

Thật không may, chúng ta cần sử dụng BigInteger.pow(3)thay vì Math.pow(a,3)do Math.pow sử dụng các phép nhân đôi không chính xác, trả về các giá trị không chính xác với số lượng lớn (bắt đầu bằng 2103869).


Đó static Y ylà một cú pháp khởi tạo kỳ lạ, nó có tự động gán cho y.nvì giao diện có chính xác một thành viên không?
con mèo

Tôi tin là như vậy, vâng. Thành thật mà nói, tôi là người mới sử dụng Java 8 vì nơi làm việc của tôi vẫn ở trên 7, nhưng đó là cách tôi cảm nhận nó hoạt động.
Hypino

Trình biên dịch tự động thêm @FunctionalInterfacechú thích (giao diện chỉ có một phương thức, xem javadoc), điều này làm cho lambdas hoạt động thay vì khởi tạo kiểu ẩn danh thông thường.
1Darco1

Điều này về cơ bản là bằng 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()); } }và công cụ staticsửa đổi chỉ ở đó để cho phép gọi y.n(int)từ phương thức chính tĩnh.
1Darco1

1
Nevermind, chỉ cần đọc bài viết meta về điều này và có vẻ như cộng đồng đồng ý. Tôi cho rằng tôi có thể thấy tại sao. Tôi sẽ cập nhật.
Hypino

6

BASH 69, 59 byte

CẬP NHẬT

Một cách hay khác để làm điều này trong bash là sử dụng tr (62 byte, nhưng có thể có thể được nén thêm một chút)

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

EDIT: Một số tối ưu hóa khác (Thx! @Manatwork)

Chơi gôn

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

Kiểm tra

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 - cho thành công (mã thoát) 1 - cho thất bại (mã thoát)


Tôi sợ lý thuyết cơ bản là hoàn toàn sai ở đây. Hãy thử T <<< 11. Sẽ nói rằng các bộ chữ số giống nhau chỉ vì 11 ** 3 == 1331 chứa các chữ số không có trong số gốc hai lần.
manatwork

Đúng, bạn đã đúng, đã sửa! Cảm ơn bạn !
zeppelin

Ok, nhưng bây giờ một số không gian thêm còn lại trong mã. Không chắc chắn tại sao bạn thêm -wrõ ràng vào fold. Nếu uniqđược sử dụng mà không có tùy chọn, sort -ucó thể thay thế nó. Và cung cấp cuộc gọi S thứ 2 với chuỗi ở đây. Và tôi nghĩ rằng không cần phải trích dẫn công thức được truyền cho bc.
manatwork

@manatwork, thx, Tôi đã sửa đối số gấp, xóa khoảng trắng và làm cho đối số khác thứ hai sử dụng tài liệu ở đây. Bây giờ tôi cũng chuyển đối số đầu tiên thành diff và đã loại bỏ các trích dẫn thừa từ biểu thức bc . > uniq được sử dụng mà không có tùy chọn, sort -u có thể thay thế nó. Đó chỉ là tàn dư của phiên bản trước (là uniq -u )). Cảm ơn bạn !
zeppelin

1
@zeppelin: bạn có thể sử dụng cmpthay vì diffvà lưu 1 byte.
Ipor Sircer

6

Chức năng mã máy x86-64, 40 byte.

Hoặc 37 byte nếu 0 so với khác không được phép là "trung thực", như strcmp.

Nhờ câu trả lời C của Karl Napf cho ý tưởng bitmap, x86 có thể thực hiện rất hiệu quả với BTS .

Chữ ký chức năng : _Bool cube_digits_same(uint64_t n);, sử dụng x86-64 System V ABI. ( ntrong RDI, giá trị trả về boolean (0 hoặc 1) trong AL).

_Boolđược định nghĩa bởi ISO C11 và thường được sử dụng #include <stdbool.h>để định nghĩa boolvới cùng một ngữ nghĩa như C ++ bool.

Tiết kiệm tiềm năng:

  • 3 byte: Trả về điều kiện nghịch đảo (khác không nếu có sự khác biệt). Hoặc từ mã asm nội tuyến: trả về một điều kiện cờ (có thể với gcc6)
  • 1 byte: Nếu chúng ta có thể ghi đè EBX (làm như vậy sẽ cung cấp cho hàm này một quy ước gọi không chuẩn). (có thể làm điều đó từ asm nội tuyến)
  • 1 byte: lệnh RET (từ mã asm nội tuyến)

Tất cả những điều này đều có thể nếu đây là một đoạn nội tuyến thay vì một hàm, điều này sẽ tạo ra 35 byte cho nội tuyến-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 dường như là cách nhỏ nhất để lặp lại một lần. Tôi cũng đã xem xét chỉ lặp lại vòng lặp (không có tiền tố REX và một thanh ghi bitmap khác), nhưng nó lớn hơn một chút. Tôi cũng đã thử sử dụng PUSH RSI và sử dụng test spl, 0xf/ jzđể lặp một lần (vì ABI yêu cầu RSP được căn chỉnh 16B trước CALL, do đó, một lần đẩy sẽ căn chỉnh nó và một lần nữa điều chỉnh lại nó). Không có test r32, imm8mã hóa, vì vậy cách nhỏ nhất là với lệnh TEST 4B (bao gồm tiền tố REX) để kiểm tra chỉ byte RSP thấp so với số 8. Cùng kích thước với LEA + LOOP, nhưng cần thêm các hướng dẫn PUSH / POP.

Đã thử nghiệm cho tất cả n trong phạm vi thử nghiệm, so với triển khai C của hộp ổn định (vì nó sử dụng thuật toán khác). Trong hai trường hợp kết quả khác nhau mà tôi đã xem xét, mã của tôi là chính xác và ổn định là sai. Tôi nghĩ rằng mã của tôi là chính xác cho tất cả 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ác dòng duy nhất được in có c = 1 asm = 0: false-positive cho thuật toán C.

Cũng đã thử nghiệm với uint64_tphiên bản triển khai C của Karl cùng một thuật toán và kết quả khớp với tất cả các đầu vào.


Mã golf trong mã máy ? Đó là quyền làm chủ thực sự!
chx

@chx: Nó thực sự bằng ngôn ngữ lắp ráp, tối ưu hóa kích thước mã. Tôi không viết trực tiếp các byte hex, tôi chỉ biết (hoặc kiểm tra) kích thước của mỗi hướng dẫn. (Những gì tôi đã đăng là từ việc lắp ráp với yasm và sau đó chạy objdump -drwC -Minteltrên tệp đối tượng và sao chép nhận xét). Đó là một ngôn ngữ trong đó tối ưu hóa kích thước mã thực sự hữu ích trong cuộc sống thực. (Nhưng ngay cả sau đó, chỉ trong các trường hợp hiếm hoi như bộ tải khởi động hoặc trình diễn. Thông thường, nó chỉ đáng để lưu kích thước mã khi nó không ảnh hưởng đến hiệu suất trong trường hợp đã được lưu trong bộ nhớ cache, nhưng sau đó rất hữu ích để giải mã tắc nghẽn + lỗi bộ nhớ cache)
Peter Cordes

@chx: nhưng đúng vậy, chơi golf trong asm làm tôi cảm thấy như một kẻ xấu, cảm ơn vì đã chú ý :) Xem các câu trả lời khác của tôi, ở đây và trên SO :)
Peter Cordes

Tôi là một chiếc mũ rất cũ trong lắp ráp (1987, Z80 là chiếc đầu tiên) nhưng tôi chưa bao giờ nghĩ sẽ tham gia chơi golf với điều đó. Tôi đã nghĩ rằng không thể.
chx

@chx: Thỉnh thoảng tôi chỉ chơi golf, thường chỉ khi tôi thấy một câu hỏi trong Hot Network có vẻ hợp lý cho asm. Thông thường công cụ với số, không phải chuỗi. Một số người khác làm golf trong asm, mặc dù. Tôi đã không nghĩ làm như vậy cho đến khi tôi thấy câu trả lời golf mã máy của người khác. Có thể đây là điều khiến tôi phải chú ý đến thực tế là bạn có thể đếm byte mã máy thay vì ký tự nguồn asm cho câu trả lời asm. anatolyg đã đăng một số, bao gồm cả về câu hỏi này.
Peter Cordes

5

Haskell, 47 byte

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

Rất chậm. Kiểm tra với c<-['0'..'9'].

Kiểm tra mọi ký tự để đưa vào biểu diễn chuỗi nvà tạo danh sách những ký tự được bao gồm. Tương tự như vậy cho n^3và kiểm tra nếu danh sách bằng nhau.


Haskell không có thiết lập bằng chữ hay hàm trả về các phần tử duy nhất từ ​​danh sách?
con mèo

2
@cat số Haskell có nub(có các yếu tố duy nhất) và sort, nhưng cả hai đều yêu cầu nhập dài import Data.List. Mặc dù vậy, nó đến rất gần với 48 byte : import Data.List;q=sort.nub.show;f n=q n==q(n^3).
xnor

Tại sao cần phải sắp xếp ...?
con mèo

1
@cat nubbảo tồn trật tự bằng cách xuất hiện đầu tiên, tức là nub [3,1,3,2,1,2] == [3,1,2]. Nó không chuyển đổi thành một loại thiết lập (không có), nhưng đưa ra một danh sách.
xnor

Ồ, tôi chưa bao giờ nhận ra Haskell không có loại bộ sưu tập nguyên thủy không có thứ tự, điều đó có ý nghĩa
con mèo

5

APL Dyalog , 10 byte

⍕≡⍕∪(⍕*∘3)

⍕≡ là biểu diễn văn bản của đối số giống hệt với

⍕∪ sự kết hợp của biểu diễn văn bản của đối số và

(⍕*∘3) các đại diện văn bản của các đối số khối?

Dùng thử trực tuyến!

Lưu ý: Đối với số lớn, hãy đặt ⎕PP←34 ⋄ ⎕FR←1287(34 chữ số có nghĩa, số float 128 bit)


1
Bạn đang giả sử rằng các chữ số duy nhất trong n ^ 3 không thể nhỏ hơn các chữ số trong n?
ngn

Bạn có thể chứng minh sự tồn tại của một ví dụ phản biện?
Adám

1
106239, xem bình luận ở đầu
ngn


5

Java 7, 185 178 ký tự

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

Gọi như:

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

Đầu ra:

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

(Tôi không bao giờ chắc chắn nếu tôi cũng phải tính cả nhập khẩu và định nghĩa phương thức ... Tôi đã thấy một trong hai cách. Bản thân mã sẽ chỉ dài 141 byte.)


Nhập khẩu / sử dụng thực sự là một phần của số byte. Bạn có thể loại bỏ static mặc dù.
Kevin Cruijssen

Được rồi, cảm ơn. Đã gỡ bỏ static.
QBrute

4

Thạch , 8 byte

*3ṢQ⁼ṢQ$

Hãy thử trực tuyến!

Giải trình:

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

Điều này không hoạt động với đầu vào 100 .
Dennis

Tôi hiểu tại sao nó không, nhưng tại sao nó không hoạt động ?
DJMcMayhem

1
Bởi vì Jelly được phân tích cú pháp từ trái sang phải, không có sự ưu tiên của toán tử. *3ṢQ⁼ṢQ$hoạt động như dự định, vì các $nhóm nhanh chóng hai nguyên tử ở bên trái của nó thành một chuỗi đơn nguyên.
Dennis

4

Bình thường, 10 byte

Bởi vì chúng tôi không có đủ sự đa dạng với câu trả lời Pyth, chúng ta hãy thêm không phải một, mà là hai nữa! Cả hai đều là 10 byte và đã được thử nghiệm 106239dưới dạng đầu vào mẫu (một số câu trả lời khác không thành công).

!s.++Q,`**

Giải trình:

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

Hãy thử câu trả lời đầu tiên bằng cách sử dụng bộ kiểm tra trực tuyến.

Câu trả lời thứ hai:

qFmS{`d,**

Giải trình:

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

Hãy thử câu trả lời thứ hai bằng cách sử dụng bộ kiểm tra trực tuyến.


4

Kotlin: 46/88/96 byte

Câu hỏi không xác định nguồn gốc từ đâu đến, vì vậy đây là 3 nguồn đầu vào thông thường.


Chức năng: 46 byte

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

main () sử dụng đối số chương trình đầu tiên: 88 byte

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


main () sử dụng đầu vào tiêu chuẩn: 96 byte

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


1
Chào mừng đến với PPCG! Đầu vào / đầu ra được chỉ định ngầm định vì golf-code . Bạn có thể xem các tiêu chuẩn đồng thuận cộng đồng ở đây . Số lượng chức năng của bạn phải là đủ.
admBorkBork

4

Haskell, 54 52 byte

Cảm ơn @Laikoni vì đã lưu hai byte.

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

1
Khai báo a%b=all(elem a)blà một hàm và sau đó gọi với b%a&&a%bsẽ tiết kiệm hai 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)

Câu trả lời C tuyệt vời của cảng @ KarlNapf. ES7 lưu một byte thông qua n**3. Chỉ hoạt động tối đa 208063 do độ chính xác số lượng hạn chế của JavaScript; nếu bạn chỉ cần nó hoạt động tới 1290, bạn có thể lưu một byte khác.


4

Perl 6 , 22 byte

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

Mở rộng:

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

Các Symmetric Set chênh lệch 「⊖」 điều hành trả về một sản phẩm nào Set nếu cả hai bên đều Sets tương đương (tự động bật một danh sách vào một Set). Tại thời điểm đó, điều duy nhất còn lại phải làm là đảo ngược nó một cách logic.


Bạn có thể thay thế $_chỉ bằng.
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;}

Hàm t (a) trả về câu trả lời. Sử dụng một int như một bộ. In độc đáo:

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

Bạn cần bao gồm #include<set>using namespace std;trong mã golf và số byte
con mèo

@cat #include<set>thay vìalgorithm
Karl Napf

@KarlNapf oh, tôi nghĩ rằng tất cả các thùng chứa stdlib đều có thể truy cập thông qua thuật toán - hiển thị những gì tôi biết về C ++ :)
mèo

Dường như với tôi, biến cục bộ của hàm "c" không được khởi tạo mà được sử dụng c | = 1 ...
RosLuP

4

R, 65 79 70 byte

Lấy ntừ stdin, tách nn^3thành các chữ số duy nhất, và so sánh hai bộ. Sử dụng gmpgói để xử lý các số nguyên lớn (cảm ơn Billywob đã chỉ ra thiếu sót đó). Bây giờ sử dụng substringđể cắt giảm nn^3, nhờ @MickyT cho gợi ý. (Các phiên bản trước sử dụng scangsubtheo một cách hacky.)

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

Đáng buồn là điều này sẽ không hoạt động (cho lớn n) trừ khi bạn sử dụng một số loại gói BigInt. Xem ?.Machineđể biết chi tiết về số nguyên lớn nhất và số float, v.v ... Để xem so sánh này, ví dụ như 2600001^3trong R với wolframalpha
Billywob

Tôi chưa bao giờ phải sử dụng nó cho mình nhưng có vẻ như gmpgói có thể giải quyết vấn đề này.
Billywob

Ah, bắt tốt! Tôi đã cập nhật câu trả lời, giờ đây nó sử dụng gmp::as.bigz()để xử lý các số nguyên lớn.
rturnbull

bạn có thể tận dụng các thực tế substring cải để một nhân vật để phân chia các số, ví dụ:s=substring;setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e4,p),s(n^3,p,p))
MickyT

@MickyT Gợi ý tuyệt vời! Tôi không biết substringcó thể được sử dụng theo cách đó (tôi chỉ từng sử dụng substr). Câu trả lời đã được chỉnh sửa để kết hợp đề xuất của bạn bây giờ.
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);}

Cổng câu trả lời C của tôi , hoạt động cho số lớn (gọi với Lhậu tố).


3

Haskell, 47 byte

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

Ví dụ sử dụng: f 102343-> False.

Sử dụng bộ từ Data.Setmô-đun. Hàm trợ giúp sbiến một số thành biểu diễn chuỗi của nó và tạo ra một tập hợp các ký tự.


Bạn không thể lưu một byte ở đây bằng cách sử dụng s$n^3?

@ ais523: Không, bởi vì nó dịch (s n==s) (n^3)ra lỗi nào.
nimi

3

Brachylog , 11 byte

doI,?:3^doI

Hãy thử trực tuyến!

Cảm ơn @DeststallibleWateriwi đã chỉ ra một vấn đề với câu trả lời ban đầu của tôi.

Giải trình

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

Tôi thích chú mèo cười trong này: 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))

(Dòng mới cho rõ ràng, không bao gồm trong bytecount)

Dòng đầu tiên định nghĩa flà một filter(tương tự đủ với một chức năng cho các mục đích của chúng tôi ở đây để không đi vào chi tiết cụ thể) có đầu vào $nvà thực hiện như sau:

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

Dòng thứ hai lấy đầu vào $args, thực hiện ftrên nó và kiểm tra xem nó -eqcó được fthực hiện trên hình $xkhối hay không. Lưu ý [bigint]diễn viên rõ ràng , yêu cầu khác, chúng tôi sẽ lấy lại kết quả bằng ký hiệu khoa học, điều này rõ ràng sẽ không hoạt động.

Kết quả Boolean được để lại trên đường ống và đầu ra là ẩn.

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

Đã lưu một byte nhờ @ConnorLSW


bạn có thể sử dụng "$n"[0..99]thay vì [char[]]"$n"để lưu một byte, vì số lượng lớn nhất bạn cần xử lý chỉ dài khoảng 20 ký tự.
colsw

@ConnorLSW Có thủ thuật lập chỉ mục đó một lần nữa. Tôi sẽ cần phải nhớ điều đó.
admBorkBork

miễn là bạn được đảm bảo sử dụng ít hơn 100 ký tự, đó là một cách tiết kiệm đủ dễ dàng so với char[]chuyển đổi thông thường , phần còn lại của mã của bạn là tốt nhất tôi có thể có được, nếu có một cách tốc ký để so sánh các mảng, bạn có thể sử dụng một cái gì đó như ("$n"[0..99]|group).Nameđể tiết kiệm tải nhưng comparekhông chính xác nhanh chóng và dễ dàng để chơi gôn.
colsw

Đó là những gì tôi nhận được để giải quyết nó mà không cần nhìn vào câu trả lời ... Khá nhiều câu trả lời tương tự ;-). Nhưng bạn đã bỏ lỡ một vài tối ưu hóa rất rõ ràng ;-)
Joey

3

Groovy, 35 51 ký tự / byte

Tôi rất buồn khi không thấy Groovy đi kèm, vì vậy đây là nỗ lực 51 byte ban đầu của tôi:

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

Được viết lại dưới dạng đóng ẩn danh 35 byte và với **cấp số nhân, nhờ vào thao tác:

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

Một số trường hợp thử nghiệm cho chức năng ban đầu:

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

Một đóng cửa ccó tên có thể được gọi như thế này : println c.call(107624). Việc đóng 35 byte ẩn danh có thể được gọi như thế này:println ({"$it".toSet()=="${it**3}".toSet()}(107624))

Đầu ra:

true
true
true
true
true
false
false

Xin lưu ý: Tôi đã học được rằng một cái gì đó giống như mã golf tồn tại ngay bây giờ, vì vậy hy vọng tôi đã làm đúng!


Xin chào Rado, và Chào mừng bạn đến với PPCG! Đây là câu trả lời đầu tiên tuyệt vời, +1!
NoOneIsHãy

Tôi đã cố gắng nén nó hơn nữa đến 47 ký tự / byte bằng cách sử dụng bao đóng, nhưng không thể chỉnh sửa câu trả lời trước đó của tôi do mới ở đây, vì vậy đây là:def c={"$it".toSet()=="${it.power(3)}".toSet()}
Rado

1
Chức năng ẩn danh được chấp nhận. Và sử dụng **toán tử cho lũy thừa.
manatwork

Cảm ơn @NoOneIsHere! Ngoài ra, việc gọi đóng cửa cho các trường hợp thử nghiệm sẽ liên quan đến việc thay thế x(107624)bằngc.call(107624)
Rado

Cảm ơn bạn @manatwork! Sử dụng một bao đóng ẩn danh và **đưa nó xuống 35 ký tự / byte đẹp:{"$it".toSet()=="${it**3}".toSet()}
Rado

2

Ruby, 48 byte

->n{(f=->x{x.to_s.chars.uniq.sort})[n]==f[n**3]}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.