Você está desenvolvendo algum código para gerar números de identificação. A política exige que nenhum número de identificação inclua a sequência de dígitos 666 .
Crie uma função (ou equivalente do seu idioma) que aceite um parâmetro inteiro positivo e retorne o próximo número inteiro que não inclui 666 quando esse número inteiro é expresso em decimal. (60606 é bom, 66600 não é.)
Seu código não deve usar um loop que adicione um até encontrar um resultado que atenda às regras.
f(1) returns 2.
f(665) returns 667.
f(665999999) returns 667000000 without having looped a million times.
(Following examples added since the question was first posed.)
f(666666666) also returns 667000000.
f(66600) returns 66700.
f(456667) returns 456670.
ATUALIZAÇÃO:
Substituir 666 por 667 não funcionará se houver mais de um 666 na entrada.
66700
.Respostas:
Python, sem manipulação de string
Obras de encontrar potências de 10,
p
onde 666 exibido e adicionandop - n % p
paran
que substitui666xxxxx
com66700000
.fonte
m /= 10
param //= 10
. Caso contrário, m se tornará um flutuador e a condiçãom % 1000 == 666
será continuamente falsa e outros "666" em n serão mantidos inalterados.JavaScript (atualizado para funcionar com todos os casos de teste)
A verdade pouco conhecida é que, na verdade, existem quatro
6
s, mas um deles traiu os outros e polimorfou em forma de código para erradicá-los dos dígitosmundiaisdos números. Aqui estão seis traidores:Aqui está uma explicação. Primeiro, embeleze o código e remova coisas inúteis como
''+'string'
e((code))
:Converta notações estranhas (como
~indexOf
e['replace']
) em mais comuns:E agora simplesmente entenda que o algoritmo é assim:
Se já houver um 666 na entrada,
outro,
Versão antiga (não funciona
666666666
) :Para entender isso, primeiro vamos embelezá-lo:
Agora vamos remover coisas inúteis como
'' + string
e'str' + 'ing'
, remova o desnecessárioss
variável e mudança estranheza como-~![]
em1
:'l ength'['replace'](/ /g,'')
é simplesmente"length"
:E
"undefined"[0]
é"u"
, e"u".length
é1
:Agora terminamos! Deve ser bem fácil de entender agora.
fonte
666666666
666666666
, e a fonte do6
é apreciador;)~1
para!= -1
é bem legal.~a.indexOf('b')
gera o JS correto, tente no livescript.net!Applescript
Este site não possui respostas suficientes do Applescript. Vamos banir alguns demônios!
Saída de log:
Eu queria incluir algumas das citações mais poderosas do The Exorcist nisso, mas isso teria tornado esse post decididamente NSFW. Você pode ler a página do IMDB.
fonte
Perl
Você disse que não devemos incrementar em um loop. Não estou usando nenhum operador matemático! Aqui está uma abordagem pura de substituição de regex (não há garantias de que seja seguro para sua sanidade).
As três primeiras substituições incrementam o número em um. Eu resolvi esse problema sozinho uma vez, mas incluiu uma substituição que precisava ser repetida até que não houvesse mais substituições, então usei a abordagem de Andrew Cheong .
A quarta substituição transforma todos os dígitos após a
666
em zeros. A substituição final transforma o restante666
em a667
.Como bônus, isso funcionará com vários números inteiros na entrada, desde que separados por caracteres que não sejam dígitos.
fonte
LiveScript
Isso está dobrando as regras. Veja bem, você disse que não devo usar um loop que adicione um até encontrar o resultado correto. Então, subtraio menos um !
Uma versão de golfe em
534845 bytes por diversão:Agradecemos a user1737909 por ajudar no golfe.
Testes
Requer Node.js com o
LiveScript
módulo npm ou uma biblioteca de afirmações compatível.fonte
Rubi
Esta é (eu acho) a primeira resposta que funciona para 666666666. (Exceto a subtração barata -1 da resposta.;))
Estou com pressa agora; explicação será adicionada mais tarde.
Atualização : versão muito mais eficiente (tempo de execução quase constante, acredito):
fonte
PowerShell
fonte
J
Finalmente, um bom uso para
E.
!Em essência, encontramos a primeira posição na qual o argumento está cheio
666
e substituímos essa substring e tudo o que temos depois66700000...
até o final.Explicado em detalhes:
":@>:
- Incremente por um e converta em string.'666'&E.
- Faça um vetor de booleanos, verdadeiro em cada lugar que '666' começar na string.i.1:
- Encontre o índice do primeiro verdadeiro no vetor, caso contrário, retorne o comprimento do vetor.#@[-]
- Comprimento da string (que também é o comprimento do vetor) menos o resultado dei.
.'667'{.!.'0'~
- Pegue uma substring de '667' com um comprimento desse resultado, preenchendo à direita com '0', se necessário.{.~
- Pegue uma substring com o comprimento do resultado original dei.
.,
- Anexe os dois juntos.Em uso:
E como esse não é um código de golfe, isso não precisa ser jogado no inferno com otimizações malucas. Todo mundo ganha!
fonte
C #
148137 charsConseguiu cortar alguns caracteres graças a @recursive
Ungolfed:
Fiddle: http://dotnetfiddle.net/XB83bf
fonte
Int32
pode ser substituído porint
.Pitão
fonte
Perl
Código embutido que altera o conteúdo interno
$_
, uma ideologia bastante padrão em perl. Pode ser usado em conjunto com-p
sinalizador como este:fonte
J
Sem strings, loops ou condicionais:
Da mesma forma que a solução de paper_box, isso separa o número em grupos de três dígitos, dividindo por potências de dez. Ele usa o índice da primeira ocorrência de 666 para arredondar o número adequadamente.
fonte
Haskell (70 caracteres)
Aqui está uma implementação simples no Haskell.
map digitToInt . show
para converter uma identificação possivelmente incorreta em uma lista de dígitos.purge
corresponde ao padrão do mal e o substitui pelo seu equivalente bom.foldl' ((+).(*10)) 0
reduz a lista de dígitos para umInteger
.Vamos ver se funciona!
Parece bom. E apenas por diversão, uma versão para golfe.
fonte
Java
Não é o suficiente para fazer isso?
fonte
String.valueOf(currentId + 1)
.return Integer.parseInt(String.valueOf(currentId + 1).replace("666", "667"));
R
Substituindo 666 por 667 obras.
Resultados
fonte
3 respostas JavaScript diferentes:
1. JavaScript (ECMAScript 6)
Converte o número em uma sequência de caracteres e itera sobre cada caractere até encontrar, e
666
depois muda o último6
para a7
e gera0
todos os caracteres a seguir.2. JavaScript (rascunho do ECMAScript 6)
Função recursiva sem manipulação de string:
Ou mais detalhadamente:
Testes:
3. JavaScript
Usando expressões regulares:
Ou (o mesmo, mas usando o ECMAScript 6)
fonte
6.667
então tecnicamente ele ainda está lá. Não pense que isso pode ser ajudado.1e20
é a maior ordem de magnitude que o JavaScript (pelo menos no FireFox) imprimirá como um número inteiro sem recorrer à notação científica.AWK
dá
editar: 2ª solução
rendimentos
fonte
awk
índices eram baseados em 1.f(665) returns 667
como ele está pedindo "o próximo inteiro que não inclui 666"awk
ish eb) minimiza o uso de funções de string.Pitão:
Ou:
fonte
666666
em667667
vez de667000
?Java
Usando a função recursiva para encontrar o 666 mais à esquerda e calculando quanto ajustar o número ao exibir a pilha de chamadas novamente.
fonte
f(666666666) -> 667000000
popularity-contest
, não umcode-golf
.Lote
Manipulação de string iterada simples.
Inicia nos três primeiros caracteres do número (como uma sequência) e segue até o final até encontrar 666, substitui-o por 667 e faz um loop no comprimento da sequência adicionando zeros.
Todos os casos de teste produzem os resultados corretos.
fonte
perl, 45 bytes
Um único regex com o sinalizador / e faz todo o trabalho aqui:
fonte
SQL
Para ser mais preciso, o SQL Server 2012 Transact-SQL.
fonte
Pitão
fonte
Julia
Resultados REPL
fonte
C #
Eu estou fazendo a coisa certa
fonte
vba
Em ação:
resultado:
fonte
C ++
Sei que isso não é código-golfe, mas (a) algumas pessoas sugeriram que é um bom desafio de golfe e (b) esta é minha primeira resposta de desafio / golfe, achei que seria divertido e, se o fizer isso aqui não aparece em um desafio real de golfe por ser um péssimo jogador de golfe. X)
Basicamente, '666' substituído por '667' funciona se você o fizer pela primeira instância no número e depois escrever 0s à direita.
Golfe (
175155 caracteres):Ungolfed:
fonte
x+=c=='6'?1:0
, você pode se safarx+=c=='6'
. Ainda não tentei.std::
antesstringstream
. Não compila sem isso.x+=c=='6'
redução, bem como olhando para fazer isso com dígitos int em vez de caracteres sstream ...Rubi
fonte
perl, 36 apenas um sub, sem bytes
Uma versão mais curta que a minha última solução, usando uma mistura de operações aritméticas e de expressões regulares.
fonte
C
OK - sem verificação de limites e muito espaço em branco, mas não é golfe. Também é um pouco divertido de formatar "while (d -> 0)".
fonte