O ano de 2013 teve uma propriedade interessante: os dígitos são consecutivos quando classificados (0123). Vamos chamar esse tipo de número de número classificável: um número inteiro não negativo cujos dígitos da base 10 são consecutivos após a classificação. Infelizmente, isso não acontecerá novamente até 2031, e depois disso, não até 2103. Seu desafio é escrever um programa ou função que, ao receber um número inteiro não negativo por meio de qualquer método padrão, produza ou retorne o próximo número classificável.
Regras
- A entrada e a saída devem estar na base 10.
- A saída pode estar em qualquer formato razoável (literal de número, literal de cadeia, matriz de item único, ...).
- Seu código deve produzir a saída adequada em 1 minuto para todas as entradas até 98764.
Casos de teste
0 -> 1
1 -> 2
9 -> 10
10 -> 12
11 -> 12
99 -> 102
233 -> 234
234 -> 243
243 -> 312
2016 -> 2031
2031 -> 2103
2103 -> 2130
2130 -> 2134
2134 -> 2143
9876 -> 10234
98764 -> 98765
Os números classificáveis formam A215014 . Uma lista de todas as entradas até 98765 pode ser encontrada aqui .
Pontuação
Isso é código-golfe , então o código mais curto em bytes vence.
Respostas:
Python 2 , 61 bytes
Experimente online!
fonte
'0123456789'
ser algo como1./81
, mas não funciona muito bem.1./81.0000001
que ainda não o faria corretamente trabalho e é mais longo1./81-1e-10
mas ainda tem 10 bytes e ainda precisará truncá-lo.Geléia ,
11109 bytesRetorna uma matriz singleton. Experimente online!
Como funciona
fonte
MATL , 8 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
JavaScript (ES6),
6454 bytesEconomizou 10 bytes em massa, graças a Neil
Casos de teste
Mostrar snippet de código
fonte
map
retorno de chamada é a própria matriz, mas você pode fazer muito melhor:f=n=>[...++n+''].sort().some((v,i,a)=>v-i-a[0])?f(n):n
Pitão -
1110 bytesSuíte de teste
fonte
PowerShell v2 +,
716867 bytesExperimente online!
Uma solução iterativa que roda praticamente instantaneamente na minha máquina.
Sim, isso é um loop
do
/until
em um código-golfe. Desculpe, não desculpe. Basicamente, fazemos um loop para cima a partir de nossa entrada$n
até que os$n|sort
regex sejam-match
contra0123456789
. Em seguida, colocamos$n
no pipeline e a produção está implícita.Salva um byte ao perceber que
-join(0..9)
é um byte menor que a string literal0123456789
.fonte
Mathematica, 63 bytes
Substitui
#+1
pelo próximo valor, desde queDifferences@Sort@IntegerDigits@x~MatchQ~{1...}
seja falso, que é a condição em que o valor atual é classificável.Aqui está outra idéia divertida, que infelizmente acabou sendo longa demais:
Neste, estou gerando todos os anos classificáveis primeiro e depois seleciono o primeiro que é maior que a entrada.
Mais algumas idéias que não foram mais curtas que a primeira tentativa:
fonte
PHP,
10510389 bytesNova versão de 89 bytes graças a Titus:
Uso:
Versão anterior de 103 bytes graças a Xanderhall:
Versão anterior de 105 bytes:
Uso:
sortable-years.php?n=9000
saídas9678
.Versão ungolfed com casos de teste:
Teste online! (Nova versão de 89 bytes)
Teste online! (Versão anterior de 103 bytes)
Teste online! (Versão anterior de 105 bytes)
Tempo de execução talvez <= 1 segundo para todos os casos de teste.
fonte
break
(exit
na versão de golfe), você encontrou! Ótimo.$i=0
é desnecessário (-4).join
é um alias paraimplode
(-3).echo$n
é saída suficiente (-5).$argv[1]
em vez de$_GET[n]
allow, o-r
que permite omitir a<?
tag (-2).join
como pseudônimoimplode
! Sobre ophp -r
parâmetro que usei no passado, mas ultimamente não o uso porque (não sei por que) às vezes não consigo fazê-lo funcionar corretamente em alguns casos.Perl 6 , 49 bytes
Explicação
Teste:
fonte
C #,
153130101 bytes (1229983 excluindo declarações de espaço para nome)-23 bytes graças a pinkfloydx33
outro -29 graças ao Link Ng (eu realmente deveria saber que não preciso convertê-lo em uma matriz)
Malditas conversões.
(Bônus adicionado, isso é surpreendentemente rápido)
fonte
$"{n}".ToCharArray()
ou(""+n).ToCharArray()
e não precisa dos colchetes depois de um tempo:while(!s.Contains...)n++;
ou melhor ainda, combiná-los e deixar um corpo de loop vazio:while(!s.Contains(.....$"{n++}".ToCharArray()....);return n;
declare s comvar s="... "
ou remova-o completamente:while(!"0123456789".Contains(...
n++
e, em vez combiná-lo com o acima e fazer$"{++n}".ToCharArray()
use System;
e use emstring
vez deString
por 11 bytes. Use emstring.Concat
vez destring.Join
e mantenha apenas o segundo parâmetro para 1 byte. Mude""+ ++n
para++n+""
para 1 byte. Deixado para você como exercício: mais 14 bytes podem ser removidos.Anterior , 117 bytes
Experimente online!
A maneira como testamos se um ano é classificado é criando uma "matriz" (escrita na cadeia literal na linha cinco) e para cada dígito do ano, definimos esse índice na matriz como 1. Depois que todos os dígitos tiverem sido processado, contamos quantos 1s existem em sequência e, se essa contagem for igual à duração do ano, podemos assumir que o ano está classificado.
Explicação detalhada
fonte
Ruby, 51 bytes
fonte
Python 2, 68 bytes
Bem derrotado por @Dennis, mas apenas postado como um método alternativo de qualquer maneira.
fonte
C #, 127 bytes
Bata a submissão atual do C # em 3 bytes: pJávencido, eu sei que essa resposta será vencida facilmente ...
repl.it demo
Ungolfed
fonte
05AB1E ,
109 bytes-1 graças a Emigna.
Experimente online!
Nova descrição chegando quando eu tiver tempo.
fonte
[>D{žhså#
por 9 bytes.Python 2,
118 117 114108 BytesEDITAR:
-1 Byte graças a @ Gábor Fekete
-6 Bytes graças a @Zachary T
fonte
sorted
função.PHP,
908988 bytesuma abordagem completamente diferente:
Corra com
-r
.demolir
fonte
Clojure,
1049691 bytesNomes de métodos longos não tornam isso tão curto ... Pelo menos,
map-indexed
e os-
principais cálculos são feitos de maneira organizada.Edit 1 : puro, eu esqueci também
=
pode levar vários argumentos, então eu não preciso verificar se a contagem de valores distintos é 1.Edit 2 : Não há necessidade de executar
(sort(seq(str %)))
,(sort(str %))
funciona igualmente bem.Ungolfed:
fonte
R, 87 bytes
Como de costume, quando se trata de dividir números em dígitos, R não possui uma maneira nativa de fazer isso. Conseqüentemente, temos que coagir a entrada em um caractere, dividir em um vetor de caractere e, posteriormente, converter novamente em qualquer tipo numérico.
Experimente online
fonte