Seu desafio é encontrar o número mais suave em um determinado intervalo. Em outras palavras, encontre o número cujo maior fator primo é o menor.
Um número suave é aquele cujo maior fator primo é pequeno. Números desse tipo são úteis para o algoritmo de transformação rápida de Fourier, análise de criptografia e outros aplicativos.
Por exemplo, acima do intervalo 5, 6, 7, 8, 9, 10
, 8 é o número mais suave, porque o maior fator primo de 8 é 2, enquanto todos os outros números têm um fator primo de 3 ou maior.
Entrada: a entrada será dois números inteiros positivos, que definem um intervalo. O número inteiro mínimo permitido no intervalo é 2. Você pode escolher se o intervalo é inclusivo, exclusivo, semi-exclusivo etc., desde que um intervalo arbitrário possa ser especificado dentro dos limites do seu idioma. Você pode pegar os números via entrada de função, stdin, argumento de linha de comando ou qualquer outro método equivalente para o seu idioma. Nenhuma informação extra de codificação na entrada.
Saída: Retorne, imprima ou equivalente a um ou mais números inteiros no intervalo de entrada que sejam maximamente suaves (mínimo fator máximo). O retorno de vários resultados é opcional, mas se você optar por fazê-lo, os resultados deverão ser claramente delimitados. O formato de saída nativo é adequado para vários resultados.
Por favor, indique na sua resposta como você está recebendo informações e dando resultados.
Pontuação: código de golfe. Contar por caracteres, se escritos em ASCII, ou 8 * bytes / 7, se não estiverem em ASCII.
Casos de teste:
Nota: Esses são intervalos no estilo Python, incluindo o low-end, mas não o high-end. Altere conforme apropriado ao seu programa. Apenas um resultado é necessário.
smooth_range(5,11)
8
smooth_range(9,16)
9, 12
smooth_range(9,17)
16
smooth_range(157, 249)
162, 192, 216, 243
smooth_range(2001, 2014)
2002
fonte
Respostas:
CJam - 13
Experimente em http://cjam.aditsu.net/
Exemplo de entrada:
2001 2014
Exemplo de saída:
2002
Explicação:
q~
lê e avalia a entrada, pressionando os 2 números na pilha (digamos min e max) forma,
uma matriz [0 1 ... max-1]>
corta a matriz começando em min, resultando em [min ... max-1]{…}$
classifica a matriz usando o bloco para calcular a chave de classificaçãomf
obtém uma matriz com todos os fatores primos de um número, paraW=
obter o último elemento da matriz (W = -1), obtendo, assim, o maior fator primo a ser usado como chave de classificação0=
obtém o primeiro elemento da matriz (classificada)fonte
mfW
alguém resolveu em 13 caracteres.Regex ( sabor
.NETPCRE),183129 bytesNão tente isto em casa!
Este não é realmente um candidato à vitória. Mas Eric Tressler sugeriu resolver esse problema com nada além de um regex, e eu não pude resistir a tentar. Isso
tambémé possível no PCRE (e ainda mais curto, veja abaixo), mas eu escolhi o .NET porque minha solução precisa de lookbehinds de comprimento arbitrário. Aqui vamos nós:A entrada é codificada como um intervalo incluso separado por vírgula, onde ambos os números são fornecidos em notação unária usando
1
s. A partida será oS
1s à direita, ondeS
é o número mais suave do intervalo. Os laços são quebrados em favor do menor número.Portanto, o segundo exemplo da pergunta seria a seguinte string (correspondência sublinhada)
Ele é baseado no regex de verificação primária (até agora bastante conhecido) , cujas variações são incorporadas 6 vezes.
Aqui está uma versão usando espaçamento livre e comentários para quem quer saber o que está acontecendo.
Você pode testá-lo online aqui . Não tente entradas muito grandes, porém, não dou garantias sobre o desempenho desse monstro.
Editar:
Acabei portando isso para o PCRE (que requer apenas duas etapas) e diminuindo o regex em quase um terço. Aqui está a nova versão:
É basicamente o mesmo, com duas alterações:
MIN
no grupo1
). No entanto,PCRE
suporta o\K
que redefine o início da correspondência para a posição atual do cursor. Daí(?<=^(1+),.*)
se torna^(1+),.*?\K
, que já salva dois bytes.(?n)
para corresponder ao grupon
novamente, semelhante a uma chamada de sub-rotina. Como o regex original continha o código para encontrar o maior fator primo de um número duas vezes, eu fui capaz de substituir a maior parte do segundo por um simples(?2)
.fonte
3
ou7
) é realmente primo. Isso requer que exista outra cópia do fator após a primeira captura, o que não seria o caso dos números primos. Enquanto eu trabalho em torno disso no .NET, colocando um olhar para trás em algum lugar para que eu possa voltar um pouco para a verificação, isso não seria possível na versão PCRE mais curta devido à falta de olhar para trás de comprimento variável. Provavelmente é possível diminuir esse pouco, mas não acho que apenas mudar+
para o*
trabalho.(.*),.*?\K(?=(..+)((?=((?(R)\6|\2))*$).*(?=\4$)(?!(..+)\5+$)))(?!.+(?=\1)(?=(..+)(?3)).*(?!\2)\6).+
99 bytes no PCRE. Além disso, já deparei com muito do seu trabalho neste site e sou um grande fã: D Ansioso por uma batalha regex no futuro!\4$
a sonda e colando-a após a negativa, mas isso afeta severamente o desempenho (todos os subgrupos de dígitos <= \ 4 é verificado quanto à composição em vez de apenas \ 4) e falha em entradas mais longas.Regex (sabor PCRE), 66 (65🐌) bytes
Inspirado ao ver que Martin Ender e Jaytea , dois gênios do regex, escreveram soluções regex para esse código de golfe, escrevi o meu a partir do zero. O famoso regex de verificação principal não aparece em nenhum lugar da minha solução.
Não leia isso se você não quiser que você estrague uma mágica regex unária. Se você quiser tentar descobrir essa mágica, recomendo começar resolvendo alguns problemas no regex do ECMAScript:
(O mecanismo de regex que escrevi pode ser útil, pois é muito rápido em regexes matemáticas unárias e inclui um modo numérico unário que pode testar intervalos de números naturais (mas também possui um modo de seqüências de caracteres que pode avaliar expressões regulares não unárias ou unárias). Por padrão, ele é compatível com ECMAScript, mas possui extensões opcionais (que podem adicionar seletivamente subconjuntos de PCRE, ou mesmo de visual molecular, algo que nenhum outro mecanismo de expressão regular possui).)
Caso contrário, continue lendo e também leia este GitHub Gist (aviso, muitos spoilers) que narra a jornada de pressionar o regex do ECMAScript para lidar com funções numéricas naturais de dificuldade crescente (começando com o conjunto de quebra-cabeças de teukon, nem todos matemáticos, o que provocou isso viagem).
Assim como as outras soluções regex para esse problema, a entrada é fornecida como dois números em bijetivo unário, separados por vírgula, representando um intervalo inclusivo. Somente um número é retornado. A regex pode ser modificada para retornar todos os números que compartilham o mesmo menor fator primo maior, como correspondências separadas, mas isso exigiria uma aparência de comprimento variável e a colocação
\K
de uma lookahead ou a devolução do resultado como uma captura em vez de uma correspondência.A técnica usada aqui de divisão implícita repetida pelo menor fator primo é idêntica à usada nas seqüências de caracteres Match, cujo comprimento é a quarta resposta de potência que eu postei há um tempo.
Sem mais delongas:
((.+).*),(?!.*(?=\1)(((?=(..+)(\5+$))\6)*)(?!\2)).*(?=\1)\K(?3)\2$
Você pode experimentá-lo aqui.
E a versão de espaço livre, com comentários:
O algoritmo pode ser facilmente portado para o ECMAScript substituindo a chamada de sub-rotina por uma cópia da sub-rotina e retornando a correspondência como um grupo de captura em vez de usar \ K. O resultado é 80 bytes de comprimento:
((x+)x*),(?!.*(?=\1)((?=(xx+)(\4+$))\5)*(?!\2)).*(?=\1)(((?=(xx+)(\8+$))\9)*\2$)
Experimente online!
Observe que
((.+).*)
pode ser alterado para((.+)+)
, reduzindo o tamanho em 1 byte (de 66 a 65 bytes ) sem perda da funcionalidade correta - mas o regex explode exponencialmente em lentidão.Experimente online! (Versão de desaceleração exponencial ECMAScript de 79 bytes)
fonte
Python 2, 95
Encontra a suavidade dos números por divisão de tentativa até que o número seja 1.
i
armazena a menor suavidade até agora,j
armazena o número que deu essa suavidade.Graças a @xnor pelos campos de golfe.
fonte
if/else
tem que ser reduzido. Meu primeiro pensamento éb=a%p<1;p+=1-b;a/=p**b
. Ou um executivo que executa um dos dois em uma sequência intercalada. Além disso, talvezwhile~-a
funcione.s,p=a,2
,i,j=p,s
, @ idéias de XNOR, removendo recuo redundante e colocando o bloco enquanto em uma linha produz 95 caracteres. Não sei como você veio acima com 98 ...J,
22 2019 caracteresPor exemplo
(Funções com dois argumentos estão infixadas em J.)
fonte
(#~ (= <./)@:(i:"1&1)@:*@:(_&q:))@:([ + i.@-~)
{:
é o mesmo que>./
e salva 1 byte.Haskell,
9694938680 caracteresuso via GHCi (um shell Haskell):
EDIT: agora um algoritmo muito mais simples.
esta solução inclui os dois números no intervalo (então
8 # 9
e7 # 8
são ambos 8)explicação:
a função (%) usa dois parâmetros, x e y. quando y é 2, a função retorna a suavidade de x.
o algoritmo daqui é simples - obtenha a lista combinada de todas as suavidades de números na entrada, com cada suavidade armazenando uma referência ao seu número original, classifique para obter o menor e retorne o número referenciado.
aqui está uma versão javascript não-golfada com o mesmo algoritmo:
fonte
m l=minimum l
Mathematica,
614539 caracteresImplementação muito direta das especificações como uma função sem nome.
fonte
Lua - 166 caracteres
Eu
nãonão tem (ainda!) Reputação suficiente para comentar sobre a solução da AndoDaan , mas aqui estão algumas melhorias em seu códigoAlterar :
n%d==0
pelon%d<1
qual é equivalente neste casotable.insert(f,d)
porf[#f+1]=d
(#f
é o número de elementos de f)fonte
Bash + coreutils, 56 bytes
A entrada é proveniente de exatamente dois argumentos de linha de comando (Obrigado @ nyuszika7h !!!). A saída é um resultado singular impresso em STDOUT.
seq
fornece o intervalo de números, um por linha, a partir dos argumentos da linha de comando.factor
lê esses números e gera cada número seguido de dois pontos e a lista classificada de fatores primos desse número. Portanto, o maior fator primordial está no final de cada linha.sed
remove os dois pontos e todos, exceto o último / maior fator primo, deixando uma lista de cada número (coluna 1) e seu maior fator primo (coluna 2).sort
numericamente em ordem crescente pela coluna 2.sed
corresponde à linha 1 (número cujo maior fator primo é o menor da lista), remove tudo, inclusive e após o primeiro espaço, e sai.sed
imprime automaticamente o resultado dessa substituição antes de sair.Resultado:
Os intervalos de notas nesse contexto incluem os dois pontos de extremidade.
fonte
seq $@
é 3 bytes mais curto, se você puder assumir que existem apenas dois argumentos.Python 2, 67
Pensar em outro golfe me deu uma idéia de um novo algoritmo para verificar a suavidade, daí a resposta tardia.
A fatoração primária do fatorial
i!
inclui exatamente os primos, no máximoi
. Portanto, sen
é um produto de primos distintos, sua suavidade (maior fator primo) é a menori
da qualn
é um divisor dei!
. Para explicar os fatores primários repetidosn
, podemos usar uma potência suficientemente alta dei!
. Em particular,(i!)**n
basta.O código tenta aumentar fatoriais
F=i!
, atualizados recursivamente. Nós filtramos os divisores deF
no intervalo de entrada e os produzimos, se houver algum, e passamos para(i+1)!
.Caso de teste:
fonte
C,
14995Resposta editada:
Não posso reivindicar crédito por esta solução. Esta resposta atualizada empresta o belo método usado por isaacg em sua solução Python. Eu queria ver se era possível escrevê-lo em C como um aninhado
for
/while
loop sem chaves, e é!Explicação:
R(a,b,n,q,p,m)
varre a gamaa
deb-1
e retorna o primeiro número mais suave encontrados. Invocação exige a adesão a seguinte forma:R(a,b,a,b,2,0)
para que variáveis dentro da função são eficazmente inicializado como se segue:n=a;q=b;p=2;m=0;
.Resposta original :
Esta foi a minha resposta original ...
Explicação:
P(n,f,p)
testa o valorn
da primalidade e retorna verdadeiro (diferente de zero) sen
for primo ou falso (zero) sen
for não-primo.f
ep
ambos devem ser passados como 1.G(n,f)
retorna o maior fator primo den
.f
deve ser passado comon
.R(a,b,p,n)
varre a gamaa
deb-1
e retorna o primeiro número mais suave encontrados.p
deve ser passado como 1.n
pode ser qualquer valor.Driver de teste:
Resultado:
fonte
Haskell - 120
Exemplo de uso:
fonte
<1
vez de==0
?Q, 91 caracteresK, 78 caracteresprovavelmente rasparia uma dúzia de caracteres
edit: de fato, tratando o limite superior como não inclusivo desta vez
fonte
Nota: Esta resposta não é permitida.
Esta resposta usa vários recursos do Pyth adicionados após o desafio ter sido solicitado.
Adicionei outro novo recurso, chamando intervalo unário em uma tupla de 2 elementos, que reduz a solução em dois caracteres, para isso:
Pitão , 7
A entrada agora é separada por vírgula. O resto é o mesmo.
Esta resposta usa um recurso do Pyth que foi adicionado depois que essa pergunta foi feita, especificamente depois de ver a maravilhosa solução CJam do @ aditsu. Dito isto, eu queria demonstrar o que a adição desse recurso tornou possível. O recurso é
P
, que é uma função arity-1 que na entrada inteira retorna uma lista de todos os fatores primos da entrada, classificados do menor para o maior.Pitão , 9
Usa intervalos no estilo Python, nova linha separada em STDIN. Produz a menor solução para STDOUT.
Explicação:
Testes:
fonte
Lua - 176 caracteres
Eu realmente deveria parar de jogar golfe em Lua. Não há sentido.
fonte
Clojure -
173170 caracteresEu sou um novato Clojure. Golfe:
Amostras de execuções:
As faixas incluem extremidade baixa e exclusão de extremidade alta: [a, b) Imprime apenas um dos números mais suaves, se ocorrerem vários.
rendimentos:
Ungolfed:
fonte
Ruby,
6562Com desculpas a https://codegolf.stackexchange.com/a/36484/6828 , esta é a versão mais simples (e um pouco simplificada) disso. Usa um intervalo inclusivo, pois é um personagem mais curto.
E obrigado a YenTheFirst por salvar três caracteres.
fonte
C # LINQ:
317303289262Ungolfed:
Ele pega o início e o comprimento da linha de comando e retornará o maior número suave.
Eu usei respostas daqui e aqui para fazer a minha resposta.
Agradecimentos ao VisualMelon por ajustá-lo e remover 12 bytes! Eu também me livrei dos aparelhos nos 2 bytes se salvando, e o CodeInChaos apontou algumas coisas óbvias que eu perdi (obrigado novamente).
fonte
F
definindoint b
ao lado de m. Em um par de lugares que você realizar a comparaçãoa%b==0
, ea
eb
são sempre positivos você pode cortar um byte para cada verificando se é inferior a 1a%b<1
. Você também pode salvar um byte, incrementandob
na condição if,a%++b<0
e não no for, inicializando-o para 1. Eu também acho que, nesse caso, é mais barato qualificar completamenteSystem.Console.WriteLine
e evitar anamespace
cláusula.m=...:m;
coisa cai fora do loop while. Portanto, você pode soltarm=0,
e substituirreturn m;
porreturn m=b>m?b:m;
. Então, você pode largarm=...:m;
completamente.Aggregate
funciona, apenas tentei depois de ver em outra resposta para chegar ao meu novo objeto em vez de apenas um campo dentro dele, e ele só passou a funcionar perfeitamente :)R, 83
onde a parte inferior do intervalo de entrada é atribuída
a
e a parte superior (inclusive) é atribuídab
.gmp
é um pacote que está disponível no CRAN. Parecia sujo até que vi essamf
função absurda no CJam. Instale digitandoinstall.packages("gmp")
no console.fonte
lapply
três vezes, poderá usar o apelido (por exemplo,l=lapply
e depois usarl(...
). Da mesma forma, já quefactorize
é a única função que você usa do pacote,gmp
você pode usar emgmp::factorize
vez de carregar a biblioteca e usá-lafactorize
. Seu código se tornarial=lapply;n=a:b;n[which.min(l(l(l(n,gmp::factorize),max),as.numeric))]
69 bytes.PowerShell - 85
Isso classificará um intervalo de números (inclusive) com base no fator primo máximo de cada número. Retorna o elemento classificado mais baixo.
fonte
J - 16 caracteres
Usando o estilo ( início , comprimento ) do intervalo, conforme permitido pelos comentários.
Para ser usado como um verbo diádico: o argumento esquerdo é iniciado , o direito é comprimento .
Uma solução ( início , fim ) tem +2 caracteres e exclui o fim; incluindo o final é +2 a mais. Mas pelo lado positivo, parece muito bom, pois combinamos todos os {chaves}.
fonte
Sério, 8 * 14/7 = 16 (não competitivo)
O Seriously foi criado após esse desafio, mas eu queria postar essa resposta, pois exemplifica o tipo de desafio em que o Seriously é bom.
Experimente online!
Explicação:
fonte
Pitão , 7 bytes
Experimente aqui!
}
r
fonte
Cobra - 150
Nem mesmo sei por que me incomodei, a cobra simplesmente não pode competir aqui.
fonte
Ruby - 113 caracteres
Usando o stdlib. Retorna um resultado. Testado em rubi 2.1.2.
fonte
Perl (5.10+), 83
(a quebra de linha pode ser removida). Toma dois pontos finais de um intervalo inclusivo em duas linhas de stdin (porque
<>
é mais barato do que acessarARGV
) e gera o resultado mais suave para stdout. Se houver um empate para o mais suave, imprima o menor. Pode imprimir o maior com o custo de um caractere.O algoritmo é basicamente a maneira de Isaac encontrar o maior fator primo, embora o tenhamos escolhido de forma independente. Essa parte se resume a uma única declaração em perl, o resto tem mais despesas do que eu gostaria.
Deve ser executado sob
perl -E
ou com umuse 5.012
preâmbulo. Se você não pode fazer isso, substituasay$r
porprint$r,$/
.fonte
Python 2 (84)
A solução de @ isaacg , mas com uma
min
tecla de função by no lugar da localização min explícita e uma função recursiva desempenhando o papel da iteração.Execute no Python sem pilha para evitar limites de recursão.
Parece um desperdício usar a condição parênteses
(n%p<1)
, depois repita sua negação também entre parênteses(n%p>0)
, mas foi o melhor que obtive. Eu tentei várias coisas, mas elas ficaram piores.Congratulo-me com todas as melhorias que você pode pensar.
fonte
Java 8 - 422
454caracteresEstou aprendendo Java 8 e queria dar uma chance a isso em relação ao Java (ou mesmo aos fluxos Java 8).
Comparado a outros idiomas, este é brutal, mas é um exercício interessante.
Golfe:
Ungolfed:
exemplo, execute usando:
fonte
MATL ( não competitivo ), 20 bytes
Esta linguagem foi projetada após o desafio
O alcance é inclusivo nas duas extremidades. Os números são tomados como duas entradas separadas.
Experimente online!
Explicação
fonte
&:[]y"@YfX>h]&X<)
ou talvez 16:[]y"@YfX>h]&X<)
. A&
verdade era uma grande idéia (e eu estou supondo quey
não estava disponível naquela época?).Yf
com 1 prefixado também seria útil aqui, mas isso provavelmente não é suficiente para decidir que é uma boa ideia em geral. :)y
ou&
. Agradeço a Suever pela semântica muito útil desta última (minha idéia inicial foi fazer com que ela significasse "uma entrada a mais que o padrão"). Se virmos mais casos em queYf
adicionar outros seria útil, pode realmente valer a pena adicionar esse recurso. O problema é que, há cerca de 34 respostas que usamYf
(de acordo com o script ), por isso é difícil dizerGelatina , 7 bytes, pontuação = 7 × 7 × 8 = 8, desafio pós-datas no idioma
Experimente online!
Toma os pontos de extremidade inferior e superior como dois argumentos separados. Produz uma lista de todos os números mais suaves do intervalo. (Isso pode ser visto como uma função; nesse caso, a saída é uma lista Jelly, ou como um programa completo; nesse caso, a saída usa a mesma representação de lista que o JSON).
Explicação
Aqueles momentos em que seu programa Jelly é apenas uma tradução literal das especificações…
fonte