Если задано число 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
Помните, что это код-гольф , поэтому выигрывает код с наименьшим количеством байтов.
code-golf
number
decision-problem
Оливер Ни
источник
источник
2103869 -> True
. Это (или большее) необходимо для проверки языка сlong
типом данных.Ответы:
Python 3,
3632 байтаЯ думаю, что это работает только в Python 3.5 и более поздних версиях. Благодаря Байперу прошло четыре байта.
источник
set(`x`)
2097152
(sys.maxint**(1/3.)
) и меньше, чемsys.maxint+1
вернется,False
если вы используетеrepr()
. repl.it/EXs2/1 . Длинные имеютL
в конце.lambda x:{*str(x)}=={*str(x**3)}
в Python 3.5+.==
на^
. Два равных набора приводят к{}
ошибочности.05AB1E , 6 байтов
05AB1E использует кодировку CP-1252 .
Попробуйте онлайн!
объяснение
источник
C 73 байта
Создает набор через биты. Возвращает
0
для того же набора, что-нибудь еще для разных наборов.Ungolfed:
источник
1 <<
при установке битов с помощьюk |= 1 << i % 10
. Отличное решение!0
правдивыми? Я думаю,strcmp
что так работает, поэтому кажется разумным в C.int
больше 64-битного. (Даже 64-битный со знаком недостаточно, но 64-битный без знака). Так что я не знаю реальных реализаций C, где это удовлетворяет требованиям вопроса. (Это работает правильноunsigned long long
, или толькоunsigned long
в реализациях, где это 64-битный тип). GNU C определяет__int128_t
на 64-битных машинах (без заголовков) ...Perl, 31 + 2 (
-pl
флаг) =2521183433 байтаС помощью:
Выход:
1\n
или0\n
.Спасибо @Dada за 3 байта, Габриэлю Бенами за 1 байт и @Zaid за сообщения об ошибках.
источник
perl -pe '$_=$_**3!~/[^$_]/'
10
:(-l
флаг нужен.&&
a,*
чтобы сохранить байтMathematica, 34 байта
Прямая реализация (безымянная функция с одним целочисленным аргументом).
источник
Желе , 8 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
CJam, 8 байт
Тестирование.
объяснение
источник
JavaScript ES6,
5551 байтСпасибо Downgoat за 3 байта! Вы можете сохранить байт, преобразовав его в ES7 и используя
n**3
вместоn*n*n
.Достаточно просто.
источник
==
она не работает даже с массивами.n*n*n
наn**3
, но я думаю, что это может быть ES7, а не ES6.2103869
, и проблема явно требует решения, чтобы работать до2642245
.C #,
241208205201193233222220212203177159 байт (109 альтернатив)Лямбда должна специально использовать
ulong
тип:Спасибо @Corak и @Dennis_E за сохранение некоторых байтов и @TimmyD за поиск проблемы с моим исходным решением. Спасибо @SaxxonPike за указание на проблему ulong / long / decimal / etc (которая на самом деле также сэкономила мне несколько байтов).
Существует также 109-байтовое решение с использованием HashSets, аналогичное ответам на Java, но я собираюсь придерживаться своего исходного решения для своей оценки.
источник
p<0
вместоp==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'
long
вместо,ulong
и этот тестовый случай использует MSB.)Java 8, 154 символа
Вызывается так:
Выходы:
Очень Java 8-й ответ, использующий лямбду, а также потоки, включающие некоторые причудливые преобразования числа в строку.
К сожалению, мы должны использовать
BigInteger.pow(3)
вместо того,Math.pow(a,3)
чтобы Math.pow использовал неточные двойные числа, которые возвращают неправильные значения с большими числами (начиная с2103869
).источник
static Y y
вещь является странным синтаксисом инициализации, он автоматически назначается,y.n
потому что интерфейс имеет ровно один член?@FunctionalInterface
аннотацию (интерфейс только с одним методом, см. Javadoc), которая заставляет работать лямбда-выражения вместо обычного создания экземпляров анонимного типа.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)
из статического основного метода.BASH,
6959 байтОБНОВИТЬ
Другой хороший способ сделать это в bash - использовать tr (62 байта, но, вероятно, его можно сжать немного больше)
РЕДАКТИРОВАТЬ: Еще несколько оптимизаций (Thx! @Manatwork)
Golfed
Контрольная работа
0 - для успеха (код выхода) 1 - для отказа (код выхода)
источник
T <<< 11
. Скажем, наборы цифр одинаковы только потому, что 11 ** 3 == 1331 содержит цифры, отсутствующие в исходном числе дважды.-w
явноfold
. Еслиuniq
используется без параметров,sort -u
можете заменить его. И скорми 2-ой звонок S здесь-строкой. И я думаю, что нет необходимости цитировать формулу, переданнуюbc
.cmp
вместоdiff
и сохранить 1 байт.Функция машинного кода 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
.Потенциальная экономия:
Все это возможно, если бы это был фрагмент inline-asm вместо функции, что сделало бы 35 байтов для inline-asm .
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.
Единственные напечатанные строки имеют c = 1 asm = 0: ложные срабатывания для алгоритма C.
Также проверен
uint64_t
вариант версии того же алгоритма, реализованный Карлом С, и результаты совпадают для всех входных данных.источник
objdump -drwC -Mintel
файла объекта и копирование комментариев). Это язык, на котором оптимизация по размеру кода действительно полезна в реальной жизни. (Но даже тогда, только в редких случаях, таких как загрузчики или демонстрационные версии. Обычно экономить размер кода стоит только тогда, когда это не снижает производительность в уже кэшированном случае, но тогда полезно избегать узких мест декодирования + пропусков кэша)Haskell, 47 байтов
Очень медленно. Тест с
c<-['0'..'9']
.Проверяет каждый символ на включение в строковое представление
n
и составляет список включенных. Аналогично дляn^3
и проверяет, равны ли списки.источник
nub
(получите уникальные элементы) иsort
, но оба требуют длительного импортаimport Data.List
. Тем не менее , это очень близко по 48 байт:import Data.List;q=sort.nub.show;f n=q n==q(n^3)
.nub
пресервы заказ по первому внешнему виду, то естьnub [3,1,3,2,1,2] == [3,1,2]
. Он не конвертируется в заданный тип (его нет), но выдает список.Dyalog APL , 10 байт
⍕≡
текстовое представление аргумента идентично⍕∪
объединение текстового представления аргумента и(⍕*∘3)
текстовое представление аргумента в кубе?Попробуй APL онлайн!
Примечание. Для больших чисел установите
⎕PP←34 ⋄ ⎕FR←1287
(34 значащих цифры, 128-разрядные числа с плавающей запятой)источник
Clojure, 35 байт
источник
Java 7,
185178 символовЗвоните как:
Выход:
(Я никогда не уверен, должен ли я также считать импорт и определения методов ... Я видел оба пути. Хотя сам код был бы длиной всего 141 байт.)
источник
static
хотя.static
.Желе , 8 байт
Попробуйте онлайн!
Объяснение:
источник
*3ṢQ⁼ṢQ$
работает как задумано, так как быстрые$
группы двух атомов слева в монадическую цепочку.Pyth, 10 байт
Поскольку у нас нет достаточного разнообразия с ответами Pyth, давайте добавим не один, а еще два! Оба имеют размер 10 байт и были протестированы
106239
в качестве образца ввода (что некоторые другие ответы не дали).Объяснение:
Попробуйте первый ответ, используя набор онлайн-тестов.
Второй ответ:
Объяснение:
Попробуйте второй ответ, используя набор онлайн-тестов.
источник
Котлин: 46/88/96 байт
Вопрос не указывает, откуда поступает входной сигнал, поэтому вот обычные 3 входных источника.
Функция: 46 байтов
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())}
источник
Haskell,
5452 байтаСпасибо @Laikoni за сохранение двух байтов.
источник
a%b=all(
elema)b
как функции и последующий вызов с помощьюb%a&&a%b
должны сохранить два байта.JavaScript (ES6), 44 байта
Порт @ KarlNapf отличный ответ C. ES7 сохраняет байты через
n**3
. Работает только до 208063 из-за ограниченной числовой точности JavaScript; если вам нужно, чтобы он работал до 1290, вы можете сохранить еще один байт.источник
Perl 6 , 22 байта
Expanded:
Оператор difference difference difference разности симметричного набора возвращает пустой набор, если обе стороны являются эквивалентными наборами (автоматически превращает список в набор). На этом этапе остается только инвертировать его логически.
источник
$_
просто.
C ++, 82 байта
Функция t (a) возвращает ответ. Использует int как набор. Напечатано красиво:
источник
#include<set>
иusing namespace std;
в гольф-код и количество байтов#include<set>
вместоalgorithm
R,
657970 байтПринимает
n
от стандартного устройства ввода, расколовn
иn^3
на отдельные цифры, и сравнивает два набора. Используетgmp
пакет для обработки больших целых чисел (спасибо Billywob за указание на этот недостаток). Теперь использует,substring
чтобы сократитьn
иn^3
, спасибо @MickyT за предложение. (Предыдущие версии использовалисьscan
иgsub
в хакерской манере.)источник
n
), если вы не используете какой-то пакет BigInt. Смотрите?.Machine
подробности о наибольшем целом числе и числе с плавающей точкой. Чтобы увидеть это, сравните, например,2600001^3
в R с wolframalphagmp
пакет мог решить эту проблему.gmp::as.bigz()
для обработки больших целых чисел.s=substring;setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e4,p),s(n^3,p,p))
substring
может быть использован таким образом (я только когда-либо использовалsubstr
). Ответ был отредактирован, чтобы включить ваше предложение сейчас.C ++ 14, 93 байта
Порт моего ответа C , работает для больших чисел (вызов с
L
суффиксом).источник
Haskell, 47 байтов
Пример использования:
f 102343
->False
.Использует наборы из
Data.Set
модуля. Вспомогательная функцияs
превращает число в его строковое представление, а затем создает набор из символов.источник
s$n^3
?(s n==s) (n^3)
ошибку типа.Брахилог , 11 байт
Попробуйте онлайн!
Спасибо @DestructibleWatermelon за указание на проблему с моим первоначальным ответом.
объяснение
источник
PowerShell v2 +,
9493 байта(Новая строка для ясности, не включена в bytecount)
Первая строка определяется
f
какfilter
(достаточно похожая на функцию для наших целей, чтобы не вдаваться в подробности), которая принимает входные данные$n
и выполняет следующее:Вторая линия принимает входные данные
$args
, выполняетf
на нем, и проверяет , является ли это-eq
UAL , чтобыf
выполняться на$x
кубе. Обратите внимание на явное[bigint]
приведение, иначе мы получим результат в научной нотации, что, очевидно, не сработает.Логический результат остается на конвейере, а вывод неявным.
Сохраненный байт благодаря @ConnorLSW
источник
"$n"[0..99]
вместо того,[char[]]"$n"
чтобы сохранить один байт, так как самое большое число, с которым вам нужно иметь дело, имеет длину всего около 20 символов.char[]
преобразованием, остальная часть вашего кода будет настолько хороша, насколько я смогу это получить, если бы был сокращенный способ сравнения массивов, вы могли бы использовать что-то вроде,("$n"[0..99]|group).Name
чтобы сэкономить грузы, ноcompare
не совсем быстро и легко в гольфGroovy, 35
51символ / байтМне было грустно не видеть Groovy включенным, поэтому вот моя первоначальная попытка в 51 байт:
def x(def n){"$n".toSet()=="${n.power(3)}".toSet()}
Переписано как 35-байтовое анонимное закрытие и
**
для возведения в степень, благодаря manatwork:{"$it".toSet()=="${it**3}".toSet()}
Несколько тестов для оригинальной функции:
Именованные закрытие
c
можно было бы назвать так:println c.call(107624)
. Анонимное закрытие 35 байтов можно назвать так:println ({"$it".toSet()=="${it**3}".toSet()}(107624))
Выходы:
Пожалуйста, обратите внимание: я узнал, что нечто вроде Code Golf существует только сейчас, так что, надеюсь, я понял это правильно!
источник
def c={"$it".toSet()=="${it.power(3)}".toSet()}
**
оператор для возведения в степень.x(107624)
наc.call(107624)
**
доведение его до красивых 35 символов / байт:{"$it".toSet()=="${it**3}".toSet()}
Рубин, 48 байтов
источник