N и n ^ 3 имеют одинаковый набор цифр?


52

Если задано число n (0 <= n <= 2642245), проверьте, имеют ли n и n 3 одинаковый набор цифр, и выведите соответственно значение truey или false.

Например, давайте проверим число 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 . Некоторые ответы только проверяли, содержал ли 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
Спасибо за ответ. К сожалению, пытаясь редактировать мой комментарий, я удалил его. Просто чтобы всем было понятно, я спросил о кодировке символов в кодах языков игры в гольф
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для того же набора, что-нибудь еще для разных наборов.

Ungolfed:

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

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

Код ungolfed отсутствует 1 <<при установке битов с помощью k |= 1 << i % 10. Отличное решение!
1Darco1

1
Я использовал эту идею для создания 39-байтовой функции машинного кода x86-64 :)
Peter Cordes

Разрешено ли нам считать 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

@ Заид, спасибо. Исправлена.
Денис Ибаев

Теперь выводит false для 10:(
Заид

@ Заид Да. -lфлаг нужен.
Денис Ибаев

2
Измените на &&a, *чтобы сохранить байт
Габриэль Бенами

7

Mathematica, 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 байт

Спасибо Downgoat за 3 байта! Вы можете сохранить байт, преобразовав его в ES7 и используя n**3вместо n*n*n.

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

Достаточно просто.


это ужасно, что нет
лучшего

1
@ njzk2 Ну, я бы сказал, что большая трагедия в том, что ==она не работает даже с массивами.
Конор О'Брайен

Вы можете сохранить байт, изменив n*n*nна n**3, но я думаю, что это может быть ES7, а не ES6.
Роберт Хикман

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 за поиск проблемы с моим исходным решением. Спасибо @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?
Yytsi

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

Сэкономьте очень мало, извлекая создание и заполнение массивов в отдельную лямбду: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), которая заставляет работать лямбда-выражения вместо обычного создания экземпляров анонимного типа.
Darco1

Это по существу равно, 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
Неважно, просто прочитайте мета-пост об этом, и сообщество, похоже, согласится. Я полагаю, я понимаю почему. Я буду обновлять.
Hypino

6

BASH, 6959 байт

ОБНОВИТЬ

Другой хороший способ сделать это в bash - использовать tr (62 байта, но, вероятно, его можно сжать немного больше)

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

РЕДАКТИРОВАТЬ: Еще несколько оптимизаций (Thx! @Manatwork)

Golfed

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 содержит цифры, отсутствующие в исходном числе дважды.
manatwork

Да, вы правы, исправлено! Спасибо !
Цеппелин

Хорошо, но теперь в коде остались лишние пробелы. Не уверен, почему вы добавили -wявно fold. Если uniqиспользуется без параметров, sort -uможете заменить его. И скорми 2-ой звонок S здесь-строкой. И я думаю, что нет необходимости цитировать формулу, переданную bc.
manatwork

@manatwork, спасибо, я исправил аргумент сгиба, удалил пробелы и заставил второй аргумент diff использовать here-doc. Теперь я также передал первый аргумент в diff и удалил лишние кавычки вокруг выражения bc . > uniq используется без опций, sort -u может заменить его. Это просто остатки предыдущей версии (был uniq -u )). Спасибо !
Цеппелин

1
@zeppelin: вы можете использовать cmpвместо diffи сохранить 1 байт.
Ипор Сирсер

6

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

Или 37 байтов, если 0 против ненулевого значения допускается как «правдивый», как 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 (это дало бы этой функции нестандартное соглашение о вызовах). (может сделать это из встроенного ассема)
  • 1 байт: инструкция RET (из встроенного asm)

Все это возможно, если бы это был фрагмент inline-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 против imm8. Тот же размер, что и LEA + LOOP, но с дополнительными инструкциями PUSH / POP.

Проверено для всех n в тестовом диапазоне, по сравнению с реализацией Си от устойчивой среды (поскольку она использует другой алгоритм). В двух случаях, когда я смотрел на разные результаты, мой код был верным, а версионный - неверным. Я думаю, что мой код правильный для всех 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вариант версии того же алгоритма, реализованный Карлом С, и результаты совпадают для всех входных данных.


Код гольф в машинный код ? Это настоящее мастерство!
chx

@chx: Это действительно на ассемблере, оптимизированный под размер кода. Я не пишу шестнадцатеричные байты напрямую, я просто знаю (или проверяю), каков размер каждой инструкции. (То, что я опубликовал, - это сборка с помощью yasm, а затем запуск objdump -drwC -Mintelфайла объекта и копирование комментариев). Это язык, на котором оптимизация по размеру кода действительно полезна в реальной жизни. (Но даже тогда, только в редких случаях, таких как загрузчики или демонстрационные версии. Обычно экономить размер кода стоит только тогда, когда это не снижает производительность в уже кэшированном случае, но тогда полезно избегать узких мест декодирования + пропусков кэша)
Питер Кордес

@chx: но да, игра в гольф в asm заставляет меня чувствовать себя как задира, спасибо, что заметили :) Смотрите мои другие ответы, здесь и на SO :)
Питер Кордес

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

@chx: я только иногда играю в гольф, обычно только когда вижу один в Hot Network Questions, который выглядит разумным для 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 нет литералов set или функции, которая возвращает уникальные элементы из списка?
кот

2
У 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

О, я никогда не осознавал, что у Хаскелла нет примитивного неупорядоченного типа коллекции, что имеет смысл
кошка

5

Dyalog APL , 10 байт

⍕≡⍕∪(⍕*∘3)

⍕≡ текстовое представление аргумента идентично

⍕∪ объединение текстового представления аргумента и

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

Попробуй APL онлайн!

Примечание. Для больших чисел установите ⎕PP←34 ⋄ ⎕FR←1287(34 значащих цифры, 128-разрядные числа с плавающей запятой)


1
Вы предполагаете, что уникальные цифры в n ^ 3 не могут быть меньше цифр в n?
нгн

Можете ли вы доказать контрпример?
Адам

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 хотя.
Кевин Круйссен

Хорошо спасибо. Удалены 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(elem 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)

Порт @ KarlNapf отличный ответ C. ES7 сохраняет байты через n**3. Работает только до 208063 из-за ограниченной числовой точности JavaScript; если вам нужно, чтобы он работал до 1290, вы можете сохранить еще один байт.


4

Perl 6 , 22 байта

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

Expanded:

{ # 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 difference 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
Карл Напф

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

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

4

R, 65 79 70 байт

Принимает nот стандартного устройства ввода, расколов 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);}

Порт моего ответа 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)ошибку типа.
Ними

3

Брахилог , 11 байт

doI,?:3^doI

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

Спасибо @DestructibleWatermelon за указание на проблему с моим первоначальным ответом.

объяснение

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

Мне нравится кошачий смайлик в этом: 3
QBrute

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

(Новая строка для ясности, не включена в bytecount)

Первая строка определяется 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

Вот что я получаю за решение, не глядя на ответы ... Почти такой же ответ ;-). Но вы пропустили несколько очень очевидных оптимизаций ;-)
Joey

3

Groovy, 35 51 символ / байт

Мне было грустно не видеть Groovy включенным, поэтому вот моя первоначальная попытка в 51 байт:

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

Переписано как 35-байтовое анонимное закрытие и **для возведения в степень, благодаря manatwork:

{"$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

Пожалуйста, обратите внимание: я узнал, что нечто вроде Code Golf существует только сейчас, так что, надеюсь, я понял это правильно!


Привет Радо и добро пожаловать в PPCG! Это отличный первый ответ, +1!
NoOneIsHere

Мне удалось сжать его еще дальше до 47 символов / байтов с помощью замыкания, но я не могу отредактировать свой предыдущий ответ из-за того, что он здесь новый, так что вот оно:def c={"$it".toSet()=="${it.power(3)}".toSet()}
Rado

1
Анонимные функции приемлемы. И использовать **оператор для возведения в степень.
manatwork

Спасибо @NoOneIsHere! Кроме того, вызов закрытия для тестовых случаев будет включать замену x(107624)наc.call(107624)
Rado

Спасибо @manatwork! Использование анонимного закрытия и **доведение его до красивых 35 символов / байт:{"$it".toSet()=="${it**3}".toSet()}
Rado

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.