Dado um número n (0 <= n <= 2642245), verifique se n e n 3 têm o mesmo conjunto de dígitos e produza um valor de verdade ou falsey de acordo.
Por exemplo, vamos verificar o número 100.
100 3 é 1000000.
O conjunto de dígitos em 100 é {0, 1}.
O conjunto de dígitos em 1000000 é {0, 1}.
Portanto, 100 deve fornecer um valor verdadeiro.
Casos de teste
0 -> True
1 -> True
10 -> True
107624 -> True
251894 -> True
251895 -> False
102343 -> False
Lembre-se, isso é código-golfe , então o código com o menor número de bytes vence.
code-golf
number
decision-problem
Oliver Ni
fonte
fonte
2103869 -> True
. Este (ou um maior) é necessário para testar um idioma com umlong
tipo de dados.Respostas:
Python 3,
3632 bytesEu acho que isso só funciona no Python 3.5 e posterior. Quatro bytes se foram, graças ao Copper.
fonte
set(`x`)
2097152
(sys.maxint**(1/3.)
) e menor quesys.maxint+1
retornaráFalse
se você usarrepr()
. repl.it/EXs2/1 . Longs têm umL
no final.lambda x:{*str(x)}=={*str(x**3)}
no Python 3.5+.==
por^
. Dois conjuntos iguais levam ao{}
qual é falso.05AB1E , 6 bytes
05AB1E usa a codificação CP-1252 .
Experimente online!
Explicação
fonte
C, 73 bytes
Cria o conjunto via bits. Retorna
0
para o mesmo conjunto, qualquer outra coisa para conjuntos diferentes.Ungolfed:
fonte
1 <<
ao definir os bits comk |= 1 << i % 10
. Ótima solução!0
como verdade? Eu acho questrcmp
funciona dessa maneira, então parece razoável em C.int
maior que 64 bits. (Até 64 bits assinados não são suficientes, mas 64 bits não assinados). Portanto, não existem implementações reais de C que eu saiba onde isso satisfaz os requisitos da pergunta. (Funciona corretamente comunsigned long long
, ou apenasunsigned long
em implementações em que é do tipo de 64 bits). GNU C define__int128_t
em máquinas de 64-bit (sem quaisquer cabeçalhos) ...Perl, 31 + 2 (
-pl
sinalizador) =2521183433 bytesUsando:
Saída:
1\n
ou0\n
.Thanx para @Dada por 3 bytes, Gabriel Benamy por 1 byte e @Zaid para relatórios de erros.
fonte
perl -pe '$_=$_**3!~/[^$_]/'
10
:(-l
sinalizador necessário.&&
a um*
para salvar um byteMathematica, 34 bytes
Implementação direta (função sem nome de um argumento inteiro).
fonte
Geléia , 8 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
CJam, 8 bytes
Suíte de teste.
Explicação
fonte
JavaScript ES6,
5551 bytesObrigado ao Downgoat por 3 bytes! Você pode salvar um byte convertendo para o ES7 e usando em
n**3
vez den*n*n
.Simples o suficiente.
fonte
==
não funciona nem em matrizes.n*n*n
paran**3
, mas acho que pode ser o ES7 e não o ES6.2103869
e o problema exige explicitamente soluções para trabalhar2642245
.C #,
241208205201193233222220212203177159 bytes (109 alternativo)Os lambda devem usar especificamente o
ulong
tipo:Agradeço a @Corak e @Dennis_E por salvar alguns bytes e @TimmyD por encontrar um problema com minha solução original. Agradeço ao @SaxxonPike por apontar o problema ulong / long / decimal / etc (que na verdade também me salvou alguns bytes).
Há também uma solução de 109 bytes usando o HashSets, semelhante às respostas Java aqui, mas vou manter a minha solução original para a minha pontuação.
fonte
p<0
vez dep==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+"")
porc-'0'
long
Em vez deulong
e este caso de teste usa o MSB.)Java 8, 154 caracteres
Chamado assim:
Saídas:
Uma resposta muito Java 8-y, usando um lambda, bem como fluxos, incluindo algumas conversões sofisticadas de número para string.
Infelizmente, precisamos usar em
BigInteger.pow(3)
vez deMath.pow(a,3)
usar Math.pow usando dobras não precisas, que retornam valores incorretos com números grandes (começando com2103869
).fonte
static Y y
coisa é uma sintaxe de inicialização estranha, ela é atribuída automaticamentey.n
porque a interface possui exatamente um membro?@FunctionalInterface
anotação (interface com apenas um método, consulte javadoc), que faz com que os lambdas funcionem em vez da instanciação de tipo anônima usual.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()); } }
e ostatic
modificador existe apenas para permitir a chamaday.n(int)
do método principal estático.BATER,
69, 59 bytesATUALIZAR
Outra boa maneira de fazer isso no bash é usar tr (62 bytes, mas provavelmente pode ser espremido um pouco mais)
EDIT: Mais algumas otimizações (Thx! @Manatwork)
Golfe
Teste
0 - para sucesso (código de saída) 1 - para falha (código de saída)
fonte
T <<< 11
. Dirá que os conjuntos de dígitos são os mesmos apenas porque 11 ** 3 == 1331 contém os dígitos que não estão presentes no número original duas vezes.-w
explicitamente o arquivofold
. Seuniq
for usado sem opções,sort -u
pode substituí-lo. E alimente a segunda chamada S com a string aqui. E acho que não há necessidade de citar a fórmula passadabc
.cmp
vez dediff
e salvar 1 byte.função de código de máquina x86-64, 40 bytes.
Ou 37 bytes, se 0 vs. diferente de zero for permitido como "verdade", como strcmp.
Graças à resposta C de Karl Napf para a idéia de bitmap, que o x86 pode fazer de maneira muito eficiente com o BTS .
Assinatura da função:,
_Bool cube_digits_same(uint64_t n);
usando o x86-64 System V ABI. (n
em RDI, valor de retorno booleano (0 ou 1) em AL)._Bool
é definido pela ISO C11 e normalmente é usado#include <stdbool.h>
para definirbool
com a mesma semântica que o C ++bool
.Potencial de economia:
Tudo isso é possível se esse fosse um fragmento inline-asm em vez de uma função, o que tornaria 35 bytes para inline-asm .
LOOP parece ser a menor maneira de repetir uma vez. Também observei apenas a repetição do loop (sem prefixos REX e um registro de bitmap diferente), mas isso é um pouco maior. Eu também tentei usar PUSH RSI e usar
test spl, 0xf
/jz
para fazer loop uma vez (uma vez que a ABI exige que o RSP seja 16B alinhado antes de CALL, então um empurrão o alinha e outro desalinha novamente). Não hátest r32, imm8
codificação; portanto, a menor maneira foi com uma instrução 4B TEST (incluindo um prefixo REX) para testar apenas o byte baixo do RSP contra um imm8. Mesmo tamanho que LEA + LOOP, mas com instruções extras de PUSH / POP necessárias.Testado para todos os n na faixa de teste, em comparação à implementação C do stablebox (já que ele usa um algoritmo diferente). Nos dois casos de resultados diferentes para os quais eu olhei, meu código estava correto e o do stablebox estava errado. Eu acho que meu código está correto para todos os n.
As únicas linhas impressas têm c = 1 asm = 0: falso-positivos para o algoritmo C.
Também testado contra uma
uint64_t
versão da implementação C de Karl do mesmo algoritmo, e os resultados correspondem a todas as entradas.fonte
objdump -drwC -Mintel
no arquivo de objeto e copiar comentários). É uma linguagem em que a otimização do tamanho do código é realmente útil na vida real. (Mas mesmo assim, apenas em casos raros, como gerenciadores de inicialização ou demos. Geralmente, vale a pena salvar o tamanho do código quando não prejudicar o desempenho no caso já armazenado em cache, mas é útil evitar descodificar gargalos + falhas de cache)Haskell, 47 bytes
Muito devagar. Teste com
c<-['0'..'9']
.Testa cada caractere para inclusão na representação de string de
n
e faz uma lista dos incluídos. Igualmente fazn^3
e verifica se as listas são iguais.fonte
nub
(obtém elementos exclusivos) esort
, mas ambos exigem a importação longaimport Data.List
. Mesmo assim, ele vem muito perto em 48 bytes:import Data.List;q=sort.nub.show;f n=q n==q(n^3)
.nub
preserva a ordem pela primeira aparição, ou sejanub [3,1,3,2,1,2] == [3,1,2]
. Não converte para um tipo de conjunto (não há nenhum), mas fornece uma lista.Dyalog APL , 10 bytes
⍕≡
é a representação de texto do argumento idêntica à⍕∪
a união da representação de texto do argumento e(⍕*∘3)
a representação de texto do argumento em cubos?TryAPL online!
Nota: Para números grandes, defina
⎕PP←34 ⋄ ⎕FR←1287
(34 dígitos significativos, flutuações de 128 bits)fonte
Clojure, 35 bytes
fonte
Java 7,
185178 caracteresLigue como:
Resultado:
(Eu nunca tenho certeza se preciso contar também as importações e as definições de métodos ... vi de qualquer maneira. O código em si teria apenas 141 bytes de comprimento.)
fonte
static
porém.static
.Gelatina , 8 bytes
Experimente online!
Explicação:
fonte
*3ṢQ⁼ṢQ$
funciona como pretendido, desde que os$
grupos rápidos agrupam os dois átomos à sua esquerda em uma cadeia monádica.Pitão, 10 bytes
Como não temos variedade suficiente com as respostas Pyth, vamos adicionar não uma, mas mais duas! Ambos são 10 bytes e foram testados
106239
como uma amostra de entrada (com falha em algumas outras respostas).Explicação:
Experimente a primeira resposta usando uma suíte de testes online.
Segunda resposta:
Explicação:
Tente a segunda resposta usando uma suíte de testes online.
fonte
Kotlin: 46/88/96 bytes
A pergunta não especifica de onde a entrada vem, então aqui estão as 3 fontes de entrada usuais.
Função: 46 bytes
main () usando o argumento do primeiro programa: 88 bytes
fun main(a:Array<String>){val i=a[0].toLong();println("$i".toSet()=="${i*i*i}".toSet())}
main () usando entrada padrão: 96 bytes
fun main(a:Array<String>){val i=readLine()!!.toLong();println("$i".toSet()=="${i*i*i}".toSet())}
fonte
Haskell,
5452 bytesObrigado @Laikoni por salvar dois bytes.
fonte
a%b=all(
elema)b
como uma função e depois chamar comb%a&&a%b
deve salvar dois bytes.JavaScript (ES6), 44 bytes
Porto da excelente resposta C de @ KarlNapf. O ES7 salva um byte via
n**3
. Funciona apenas até 208063 devido à precisão numérica limitada do JavaScript; se você precisar apenas trabalhar até 1290, poderá salvar outro byte.fonte
Perl 6 , 22 bytes
Expandido:
O operador Diferença do conjunto simétrico returns ⊖ 」 retorna um conjunto vazio se os dois lados forem conjuntos equivalentes (transforma automaticamente uma lista em um conjunto). Nesse ponto, a única coisa que resta a fazer é invertê-lo logicamente.
fonte
$_
com apenas.
C ++, 82 bytes
A função t (a) retorna a resposta. Usa um int como um conjunto. Impresso bem:
fonte
#include<set>
eusing namespace std;
no código de golfe e na contagem de bytes#include<set>
vez dealgorithm
R,
657970 bytesToma
n
de stdin, dividen
en^3
em dígitos únicos e compara os dois conjuntos. Usa ogmp
pacote para lidar com números inteiros grandes (obrigado a Billywob por apontar essa falha). Agora, use osubstring
cut-upn
en^3
, graças a @MickyT, pela sugestão. (Versões anteriores usadasscan
e degsub
maneira hacky.)fonte
n
), a menos que você use algum tipo de pacote BigInt. Consulte?.Machine
para obter detalhes sobre o maior número inteiro e flutuar etc. Para ver este exemplo comparar2600001^3
em R para WolframAlphagmp
pacote poderia resolver esse problema.gmp::as.bigz()
para manipular números inteiros grandes.s=substring;setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e4,p),s(n^3,p,p))
substring
poderia ser usado dessa maneira (eu só useisubstr
). A resposta foi editada para incorporar sua sugestão agora.C ++ 14, 93 bytes
Porta da minha resposta C , funciona para grandes números (ligue com
L
sufixo).fonte
Haskell, 47 bytes
Exemplo de uso:
f 102343
->False
.Usa conjuntos do
Data.Set
módulo. A função auxiliars
transforma um número em sua representação de sequência e, em seguida, define os caracteres.fonte
s$n^3
?(s n==s) (n^3)
que gera um erro de tipo.Braquilog , 11 bytes
Experimente online!
Obrigado a @DestructibleWatermelon por apontar um problema com a minha resposta original.
Explicação
fonte
PowerShell v2 +,
9493 bytes(Nova linha para maior clareza, não incluída no bytecount)
A primeira linha define
f
como umfilter
(similar-ish o suficiente para uma função para nossos propósitos aqui, não entrar em detalhes) que recebe entrada$n
e faz o seguinte:A segunda linha pega a entrada
$args
, executaf
nela e verifica se é-eq
necessáriof
executar em$x
cubos. Observe o[bigint]
elenco explícito , necessário, caso contrário, obteremos o resultado de volta em notação científica, que obviamente não funcionará.O resultado booleano é deixado no pipeline e a saída é implícita.
Guardou um byte graças a @ConnorLSW
fonte
"$n"[0..99]
vez de[char[]]"$n"
salvar um byte, já que o maior número com o qual você precisará lidar é de apenas 20 caracteres.char[]
conversão normal , o restante do código é o melhor possível, se houver uma forma abreviada de comparar matrizes, você poderá use algo como("$n"[0..99]|group).Name
economizar cargas, mascompare
não é exatamente rápido e fácil de jogar golfe.Groovy, 35
51caracteres / bytesFiquei triste por não ter incluído o Groovy, então aqui está minha tentativa original de 51 bytes:
def x(def n){"$n".toSet()=="${n.power(3)}".toSet()}
Reescrito como um fechamento anônimo de 35 bytes e com
**
exponenciação, graças ao manatwork:{"$it".toSet()=="${it**3}".toSet()}
Alguns casos de teste para a função original:
Um fechamento chamado
c
poderia ser chamado assim:println c.call(107624)
. O fechamento anônimo de 35 bytes poderia ser chamado assim:println ({"$it".toSet()=="${it**3}".toSet()}(107624))
Saídas:
Por favor note: eu aprendi que algo como código golf existe agora, então espero que eu entendi direito!
fonte
def c={"$it".toSet()=="${it.power(3)}".toSet()}
**
operador para exponenciação.x(107624)
porc.call(107624)
**
reduz-o a belos 35 caracteres / bytes:{"$it".toSet()=="${it**3}".toSet()}
Ruby, 48 bytes
fonte