Чи мають n і n ^ 3 однаковий набір цифр?


52

Враховуючи число n (0 <= n <= 2642245), перевірте, чи n і n 3 мають однаковий набір цифр, і відповідно виведіть значення truthy або falsey.

Наприклад, давайте перевіримо число 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
Денніс

8
Тестовий приклад: 2103869 -> True. Це (або більший) необхідно для тестування мови з longтипом даних.
mbomb007

5
Шкода, що макс занадто великий для мови без 64-бітного цілого числа.
edc65

17
Я думаю, ви повинні бути чіткими щодо основи ... у бінарному вигляді це начебто половина забави :-D
The Vee

7
@ ZoltánSchmidt 106239 найменше натуральне число п таке , що - 1199090390129919 - не містить всі цифри п . Деякі відповіді лише перевіряли, чи n містить усі цифри і таким чином отримав неправильний результат за 106239 .
Денніс

Відповіді:


28

Python 3, 36 32 байти

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

Я думаю, що це працює лише в Python 3.5 та пізніших версіях. Чотири байти пішли завдяки міді.


8
У python 2 ви можете використовувати backtics як ярлик для repr (), економлячи 6 байтів. set(`x`)
DenDenDo

9
@DenDenDo Будь-який вхід, більший за 2097152( sys.maxint**(1/3.)) і менший, ніж sys.maxint+1повернеться, Falseякщо ви використовуєте repr(). repl.it/EXs2/1 . Довгі мають Lкінець.
mbomb007

9
Неперевірений, але ви, ймовірно, можете це зробити lambda x:{*str(x)}=={*str(x**3)}в Python 3.5+.
Мідь

1
@BenHoyt Це більш стисло, ніж використання print (...) та input (). Зробити це функцією коротше, ніж зробити повну програму.
0WJYxW9FMN

1
Оскільки в запитанні сказано, що повернення правдоподібного або хибного значення достатньо, ви можете замінити ==на ^. Два рівних множини ведуть до {}цього помилково.
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
Дякую за відповідь. На жаль, намагаючись редагувати коментар, я його видалив. Просто для того, щоб зрозуміти всім, я поцікавився кодуванням символів у кодових
гольфних

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 :)
Пітер Кордес

Чи дозволено нам вважати 0правдою? Я здогадуюсь, strcmpщо так працює, тому це здається розумним у C.
Пітер Кордес

1
Це працює лише для всього діапазону входів, необхідних для запитання, якщо він intперевищує 64-бітний. (Навіть підписаних 64-розрядних не вистачає, але 64-розрядних непідписаних є). Тож немає реальних реалізацій C, які я знаю, де це задовольняє вимоги питання. (Це правильно працює з unsigned long longабо просто unsigned 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.

Дякуємо @Dada за 3 байти, Габріелю Бенамі за 1 байт, а @Zaid за повідомлення про помилки.


1
Гарна відповідь! Ви можете зберегти декілька (3) байтів:perl -pe '$_=$_**3!~/[^$_]/'
Dada

@Zaid Thanx. Виправлено.
Денис Ібаєв

Тепер він виводить помилки для 10:(
Заїд

@Zaid Yep. -lпрапор потрібен.
Денис Ібаєв

2
Змініть &&на а, *щоб зберегти байт
Габріель Бенамі

7

Математика, 34 байти

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

Пряма реалізація (неназвана функція одного цілого аргументу).


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 байти! Ви можете зберегти байт, перейшовши на ES7 і використовуючи n**3замість n*n*n.

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

Досить просто.


страшно, що не існує приємного способу порівняння наборів на еквівалентність
njzk2

1
@ njzk2 Ну, я б сказав, що більша трагедія полягає в тому, що ==це не працює навіть на масивах.
Conor O'Brien

Ви можете зберегти байт, змінивши n*n*nна n**3, але я думаю, що це може бути ES7, а не ES6.
Роберт Хікман

1
@Downgoat Спасибі, що надихнуло мене зберегти ще кілька байтів!
Conor O'Brien

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 за те, що вони знайшли проблему з моїм оригінальним рішенням. Завдяки @SaxxonPike за вказівку на проблему ulong / long / decimal / etc (що фактично також врятувало мені кілька байтів).


Існує також 109- байтне рішення з використанням HashSets, подібне до відповідей Java, але я буду дотримуватися свого оригінального рішення для моєї оцінки.

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

Ви можете перевірити p<0замість p==1?
Іци

@TuukkaX Зробив би це, але для того, як я визначаю набори зараз, використовується той же масив цілих чисел, збільшуючи відповідний індекс для обох рядків, тому значення 0 або 2 нормально, але якщо такі є 1, він повинен повернути помилкове.
Йодл

Економте дуже мало, витягуючи створення та заповнення масивів в окрему лямбда: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;};
Корак

Ви можете замінити 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-у, використовуючи лямбда, а також потоки, включаючи певні перетворення числа на рядок.

На жаль, нам потрібно використовувати BigInteger.pow(3)замість Math.pow(a,3)Math.pow використання неточних пар, які повертають неправильні значення з великою кількістю (починаючи з 2103869).


Ця static Y yріч є дивним синтаксисом ініціалізації, чи вона автоматично призначається, y.nоскільки в інтерфейсі є рівно один член?
кіт

Я так вважаю, так. Якщо чесно, я новачок у Java 8, оскільки на моєму робочому місці ще 7, але я так сприймаю, як це працює.
Hypino

Компілятор автоматично додає @FunctionalInterfaceанотацію (інтерфейс лише з одним методом, див. 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)статичний основний метод.
1Darco1

1
Не забудьте, просто прочитайте мета-пост про це, і, здається, громада погоджується. Я думаю, я бачу, чому. Я оновлю.
Хіпіно

6

БАШ, 69, 59 байт

ОНОВЛЕННЯ

Ще один приємний спосіб зробити це в bash - використовувати tr (62 байти, але, ймовірно, можна видавити трохи більше)

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

EDIT: Ще кілька оптимізацій (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 містить цифри, які не містяться в початковому числі двічі.
манантська робота

Так, ви правильні, виправлені! Дякую !
зеппелін

Гаразд, але тепер у коді залишилось кілька пробілів. Не впевнений, чому ви -wявно додали це fold. Якщо uniqвикористовується без опцій, sort -uможе замінити її. І подайте другий виклик S за допомогою рядка тут. І я думаю, не потрібно цитувати формулу, передану до цього bc.
манастирські роботи

@manatwork, thx, я виправив аргумент fold, видалив пробіли та змусив другий аргумент diff використовувати тут-doc. Я також передаю перший аргумент у diff і видалив зайві лапки навколо виразу bc . > uniq використовується без параметрів, сортування -u може замінити його. Це лише залишки попередньої версії (був uniq -u )). Дякую !
зеппелін

1
@zeppelin: ви можете використовувати cmpзамість diffі зберегти 1 байт.
Іпор Сірсер

6

Функція машинного коду x86-64, 40 байт.

Або 37 байт, якщо 0 проти не нуля дозволено як "truthy", як strcmp.

Завдяки C відповіді Карла Напфа за раціональну ідею, яку x86 може зробити дуже ефективно з BTS .

Підпис функції: _Bool cube_digits_same(uint64_t n);за допомогою системи x86-64 System V ABI. ( nв RDI, булеве значення повернення (0 або 1) в AL).

_Boolвизначається ISO C11, і зазвичай використовується #include <stdbool.h>для визначення boolз тією ж семантикою, що і C ++ bool.

Потенційна економія:

  • 3 байти: Повернення оберненої умови (ненульової, якщо є різниця). Або з вбудованого asm: повернення умови прапора (що можливо з gcc6)
  • 1 байт: Якби ми могли сковувати EBX (це зробило б цю функцію нестандартною умовою виклику). (міг би зробити це з inline asm)
  • 1 байт: інструкція RET (від вбудованого ASM)

Все це можливо, якби це був вбудований фрагмент asm замість функції, яка зробила б його 35 байтами для 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 здається найменшим способом повторити один раз. Я також дивився на просто повторення циклу (без префіксів REX та іншого реєстру растрових зображень), але це трохи більше. Я також спробував використовувати PUSH RSI і один раз використовувати цикл test spl, 0xf/ jzдля циклу (оскільки ABI вимагає, щоб RSP вирівнювався 16B перед CALL, тому один натискання вирівнює його, а інший знову вирівнює). test r32, imm8Кодування немає , тому найменший спосіб полягав у інструкції 4B TEST (включаючи префікс REX), щоб перевірити лише низький байт RSP проти імунітету8. Той самий розмір, що і LEA + LOOP, але потрібні додаткові інструкції PUSH / POP.

Тестується для всіх n в тестовому діапазоні, порівняно з реалізацією 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 = 1 asm = 0: хибнопозитивні для алгоритму C.

Також перевіряється uint64_tверсія версії C Карла за тим же алгоритмом, і результати відповідають для всіх даних.


Код гольфу в машинному коді ? Це справжнє майстерність!
chx

@chx: це дійсно в мові збірки, оптимізуючи розмір коду. Я не пишу шістнадцяткові байти, я просто знаю (або перевіряю), який розмір має кожна інструкція. (Я розміщував повідомлення - це збірка з язмом, а потім запуск objdump -drwC -Mintelфайлу об'єкта та копіювання коментарів). Це мова, де оптимізація розміру коду насправді корисна в реальному житті. (Але навіть тоді, лише в рідкісних випадках, таких як завантажувачі або демонстрації. Зазвичай, варто зберегти розмір коду лише тоді, коли це не зашкодить продуктивності у вже кешованому випадку, але тоді корисно уникати декодивних вузьких місць + промахування кешу)
Пітер Кордес

@chx: але так, гольф в Асмі змушує мене почуватися недоброзичливцем, дякую за те, що помітив :) Дивіться інші мої відповіді тут і на ТАК :)
Пітер Кордес

Я дуже стара капелюх в зборах (1987 рік, Z80 був першим), але я б ніколи не думав вступати з цим кодом у гольф. Я вважав би неможливим.
chx

@chx: Я займаюся гольфом лише зрідка, як правило, лише коли я бачу те, що в питаннях із питань гарячих мереж виглядає обґрунтованим для Asm. Зазвичай набивайте цифри, а не рядки. Хоча кілька інших людей займаються гольфом в зоні. Я не думав робити це сам, поки не побачив відповідь когось із відповідей на машинний гольф на гольф. Можливо, це саме те, що підказало мені на те, що ви можете порахувати байти машинного коду замість символів джерела ASM для відповідей на ASM. 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

Діалог APL , 10 байт

⍕≡⍕∪(⍕*∘3)

⍕≡ це подання тексту аргументу, ідентичне

⍕∪ об'єднання тексту аргументації аргументу та

(⍕*∘3) текстове подання кубового аргументу?

СпробуйтеAPL онлайн!

Примітка. Для великої кількості встановіть ⎕PP←34 ⋄ ⎕FR←1287(34 значні цифри, 128 бітових плавців)


1
Ви припускаєте, що унікальних цифр у n ^ 3 не може бути менше, ніж цифр у n?
ngn

Чи можете ви довести існування зустрічного прикладу?
Адам

1
106239, дивіться коментарі вгорі
п.


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 Однак ви можете видалити .
Кевін Кройсейсен

Добре, дякую. Вилучено 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$працює за призначенням, оскільки швидкий $групує два атоми зліва в монадійний ланцюг.
Денніс

4

Pyth, 10 байт

Оскільки у нас недостатньо різноманітності з відповідями Pyth, додамо не одну, а ще дві! Обидва є 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?

Спробуйте першу відповідь, використовуючи онлайн тестовий набір.

Друга відповідь:

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

Спробуйте другу відповідь, використовуючи онлайн-тестовий набір.


4

Котлін: 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! Вхід / вихід неявно вказується через код-гольф . Ви можете ознайомитись зі стандартами консенсусу громади тут . Кількість ваших функцій повинна бути достатньою.
AdmBorkBork

4

Haskell, 54 52 байти

Дякуємо @Laikoni за збереження двох байтів.

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

1
Оголошення a%b=all(елем a)bяк функції, а потім виклик за допомогою, b%a&&a%bмає зберегти два байти.
Лайконі

4

JavaScript (ES6), 44 байти

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

Відмінний C відповідь Порта @ KarlNapf. ES7 зберігає байт через n**3. Працює лише до 208063 через обмежену числову точність JavaScript; якщо вам потрібно лише до 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
  )
}

Оператор симетричного набору difference ⊖ 」 повертає порожній набір, якщо обидві сторони еквівалентні Набори (автоматично перетворює список у набір). У той момент єдине, що залишається зробити, це перетворити його логічно.


Ви можете замінити $_просто.
Джо Кінг

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;в код для гольфу і кількість байтів
кіт

@cat #include<set>замістьalgorithm
Karl Napf

@KarlNapf о, я думав, що всі контейнери stdlib були доступні за допомогою алгоритму - показує, що я знаю про C ++ :)
кіт

Мені здається, мінлива локальна для функції "c" не ініціалізована, але використовується c | = 1 ...
RosLuP

4

R, 65 79 70 байт

Бере nз stdin, розбиває nі n^3на однозначні цифри, і порівнює два набори. Використовує gmpпакет для обробки великих цілих чисел (спасибі Billywob за вказівку на цей недолік). Тепер використовується substringдля скорочення nі n^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пакет міг вирішити цю проблему.
Billywob

Ах, гарний улов! Я оновив відповідь, тепер вона використовується 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);}

Порт моєї відповіді на С , працює для великої кількості (дзвінок із 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)що дає помилку типу.
німі


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

(Новий рядок для наочності, не включається до рахунку)

Перший рядок визначає fяк filter(досить схоже на функцію для наших цілей тут, щоб не вдаватися до конкретики), що приймає дані $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

Друга лінія приймає вхідні дані $args, виконує fна ньому, і перевіряє , чи є це -eqUAL , щоб fвиконуватися на $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


ви можете використовувати "$n"[0..99]замість цього, [char[]]"$n"щоб зберегти один байт, оскільки найбільша кількість, з якою вам знадобиться мати справу, становить лише близько 20 символів.
colsw

@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()}
Радо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.