A maioria dos computadores armazena números inteiros em binário, mas os produz em decimal. No entanto, decimal é apenas uma representação; por acaso, achamos conveniente.
Esse desafio é escrever algum código para gerar um valor inteiro em decimal shortlex .
O que é isso?
http://en.wikipedia.org/wiki/Shortlex_order
Shortlex assume o comprimento da sequência de dígitos como o principal significante do valor. A sequência, iniciando a partir de uma sequência vazia que representa zero, é ...
ε,0,1,...,8,9,00,01,...98,99,000,001,...,998,999,0000,...
(Pense nas colunas do Excel, mas usando apenas os dígitos decimais.)
Escreva um programa ou função que aceite um número inteiro e retorne uma cadeia de caracteres correspondente à representação decimal em shortlex desse número inteiro, conforme descrito acima.
Valores de teste:
0 → "" (String vazia)
1 → "0"
10 → "9"
11 → "00"
42 → "31"
100 → "89"
800 → "689"
1060 → "949"
10270 → "9159"
100501 → "89390"
19, 20, 21, 22
em decimais é mapeada para08, 09, 10, 11
em shortlex. Por isso eu confundi isso100 -> 89
!Respostas:
JavaScript (ES6) 42
74Teste no console do FireFox
Resultado
Como eu pensei nisso?
Dado um número fixo de dígitos, a sequência de saída é simplesmente crescente, para que haja um delta fixo entre entrada e saída. Dar uma olhada:
Mas os 0s iniciais são difíceis de gerenciar, então eu tenho um truque padrão, adicione um primeiro dígito e trabalhe o módulo (ou seja, corte o primeiro dígito na saída). Então -1-> +9, -11 -> +89, -111 -> +889 e assim por diante.
Última etapa: não ligo para o que é o primeiro dígito, portanto, não há necessidade de verificar se o número de entrada é <ou> maior que 111 ... (honestamente, achei isso por tentativa e erro)
Teste
fonte
n-~(n+'')
vez de apenasn-~n
?(n+'').replace(...)
, substituir obras em seqüências de caracteres, não números.Marbelous
177173170Ele funciona apenas para valores abaixo de 256, pois o Marbelous é uma linguagem de 8 bits.
Como funciona
Marbelous é uma linguagem 2D com valores representados por bolinhas de 8 bits que caem uma célula em cada tick, a menos que algum dispositivo impeça a queda. Este programa Marbelous consiste em 3 placas; vamos começar com o mais fácil:
:O
é o nome do painel (para ser mais preciso, O é o nome e: diz ao interpretado que esta linha é um nome. Ao dar um nome aos painéis, outros painéis podem chamá-los}0
como um dispositivo de entrada, isso pode ser visto como um Esta célula será substituída por um mármore de entrada (valor) quando a função for chamada.+Z
adiciona 35 a qualquer mármore que passa por ele e o deixa cair.+C
faz o mesmo, mas adiciona 12.{0
é uma célula de saída , quando um mármore atingir essa célula, a função sairá e retornará o valor nesse dispositivo de saída.Portanto, todos juntos, este quadro assume um valor e, em seguida, acrescenta 47. Para nós, isso significa que transforma qualquer número de dígito único no código ASCII do dígito -1 (é claro que isso também funcionará para 10).
Este fórum está um pouco mais complicado. Você deve conseguir identificar
:I
como o nome da placa e localizar alguns dispositivos de entrada e saída. Você notará que temos dois dispositivos de entrada diferentes}0
e}1
. Isso significa que esta função recebe 2 entradas. Você também notará que existem duas instâncias do}1
dispositivo. Ao chamar a função, essas duas células conterão o mesmo valor. O}0
dispositivo de entrada está diretamente acima de um\/
dispositivo, atua como uma lata de lixo e remove qualquer mármore que cair sobre ela imediatamente.Vamos dar uma olhada no que acontece com uma das bolinhas colocadas no quadro pelos
}1
dispositivos de entrada:Ele cairá no primeiro tique e atingirá o
=9
dispositivo. Isso compara o valor do mármore a 9 e permite que o mármore caia, se a instrução=9
avaliar. O mármore é empurrado para a direita, se não.&0
e&1
são sincronizadores. Eles seguram bolas de gude que caem sobre eles até que todos os outros&n
sincronizadores sejam preenchidos também. Como você pode esperar, isso provocará condicionalmente comportamentos diferentes em alguma outra parte do quadro.Se eu lhe disser que
++
é um incrementador, você já deverá saber com o que os diferentes sincronizadores serão preenchidos. A esquerda&1
conterá o valor de entrada}1
+ 1, o&0
próximo a ele conterá 0 (00
é um literal de idioma, representado em hexadecimal). O segundo&1
conterá o valor 1 e o direito&0
será preenchido com umF7
, que subtrai 9 de um valor, uma vez que a adição no Marbelous é o módulo 256.//
é um dispositivo defletor, que empurra qualquer mármore para a esquerda em vez de deixá-lo cair.Juntar tudo isso dá a você o seguinte: se o mármore
}1
for 9, os&0
sincronizadores serão preenchidos. Isso fará com que o valor 0 caia na{0
saída eF7
(ou -9) na{1
saída. Se}1
não for 9,{0
será preenchido com}1
+ 1 e{0
conterá 1. Há também um{>
dispositivo, esta é uma saída especial que gera uma bola de gude próxima a uma placa em vez de embaixo dela. Isso será preenchido}1
se for igual a 9.Ok, agora para o grande. Este quadro não tem um nome explícito, pois é o quadro principal do arquivo. Seu nome implícito é
Mb
. Você deve conseguir reconhecer algumas células. Há um dispositivo de entrada, alguns literais de idioma (00
eFF
). Existem alguns sincronizadores e há um defletor. vamos percorrer este pedaço por pedaço.Portanto, o valor de entrada (a entrada da linha de comando, pois essa é a placa principal) começa na segunda célula a partir do topo, onde
}0
está localizado. Ele cairá e alcançará o>0
dispositivo, que é outro dispositivo de comparação. qualquer mármore maior que 0 cai, qualquer outro mármore é empurrado para a direita. (como as variáveis Marbelous não são assinadas, apenas exatamente 0 será empurrado para a direita). Esse mármore de valor zero atingirá o@6
dispositivo. Este é um portal e transporta o mármore para outro portal correspondente, neste caso, logo acima dele. O mármore 0 alcançará o&0
sincronizador e acionará algumas coisas em outro lugar.Se o mármore não for 0, ele cai, é desviado para a direita por
\\
acertos--
que o diminuem em um e depois caem em/\
um clonador. Este dispositivo pega uma bola de gude e produz uma cópia para a direita e outra para a esquerda. A esquerda será levada para o outro,@0
onde o mármore passará pela mesma sequência novamente. A esquerda será levada para outro lugar. Isso nos dá um loop, que diminui a entrada da linha de comando uma vez por loop e aciona algum comportamento em cada loop até atingir 0. Ele então aciona outro comportamento.Vamos dar uma olhada no que acontece com o mármore colocado em
@4
cada loop.Existem três literais de idioma aqui (
FF
), que caem imediatamente em portais. Esses portais os levarão para três dosII
dispositivos.II
refere-se ao quadro:I
que definimos mais adiante no arquivo. Como:I
possui 2 dispositivos de entrada distintos, sua representação em outra placa deve ter 2 células de largura. Como temos 6 células contendoII
, podemos dizer que temos 3 instâncias dessa função no quadro.Os
FF
mármores (ou 256 ou -1, se desejar) ficarão nas células de entrada da:I
função, esperando até que haja mármore de entrada suficiente para iniciar a função (mais um). É aí que o@4
portal entra. Uma cópia da entrada da linha de comando decrementada cai em cada loop. Isso acionará a:I
placa mais à esquerda . Inicialmente com os valores 256 (ou -1) e qualquer que seja a entrada da linha de comando foi -1. O mármore esquerdo será colocado nos}0
dispositivos do:I
tabuleiro e o direito no}1
. Se você se lembrar do que este fórum fez, poderá saber qual é o resultado. Ele produzirá uma versão incrementada da entrada direita na saída esquerda (e transforma um 9 em 0, e não 10) e gera 1 ou -9 à direita.O valor incrementado será levado de volta para a célula de entrada correta por um portal e o valor à direita cai em um sincronizador. Se um sincronizador já estiver segurando uma bola de gude, as duas bolas de gude colidem. Os mármores em colisão são adicionados no módulo 256. Portanto, os valores nos sincronizadores farão o seguinte: eles começam vazios, depois passam para 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 e depois para 1 novamente (desde 247 é adicionado o módulo 256).
Você também deve se lembrar que uma bola de gude obtém a saída para a direita quando o valor de entrada volta para 0. Como as
:I
placas estão próximas umas das outras, isso ativará a placa à direita uma vez. Isso preencherá os três sincronizadores com valores que são um mais altos do que deveriam ser uma representação abreviada da entrada da linha de comando, no momento em que esse loop for reduzido a 0.Você também deve se lembrar que a
:O
função transforma um valor no valor ascii do dígito que representa o valor -1. A saída dessasOO
células cairá da placa, que imprime seus caracteres ASCII correspondentes em STDOUT.Então, o que acontece quando a linha de comando de mármore atinge 0 e preenche esses
&0
sincronizadores? bem, algumas bolinhas de valor 0 caem e acionam os três sincronizadores que estão segurando os dígitos (+ 1) do número shortlex na parte inferior do quadro.&3
é acionado primeiro, pois contém o dígito mais significativo, depois é&2
seguido por&1
. Esse mármore é teleportado para o outro@5
dispositivo antes de atingir a!!
célula, que termina o tabuleiro.fonte
CJam,
1411 bytesExperimente online.
Como funciona
Essa abordagem é fortemente baseada na resposta do edc65 (com sua permissão explícita ):
Exemplo de execução
fonte
Python 2 (38)
(43)Sem substituição de caracteres, apenas aritmética.
Ungolfed:
Não tenho uma boa razão para a recursão funcionar, apenas encaixo esse padrão na lista de valores. Se você alterasse cada um
n-1
paran
, obteria a representação regular de dígitos.Para jogar golfe, costumo
~-n
calcularn-1
com maior precedência que/10
ou%10
, economizando em parênteses. On*'_'
é apenas para produzir a cadeia vazia quandon=0
e qualquer outra cadeia caso contrário. O'_'
pode ser qualquer cadeia para esta finalidade.fonte
Ruby,
7068666457 bytesDefine uma função a ser chamada como
f[42]
. Aqui está o detalhamento do algoritmo:0
separadamente.Os créditos para a idéia de usar uma string de formato vão para Falko!
Como alternativa, usando a abordagem do edc65:
São 45 bytes e só incluo, porque não estou superando ele. ;)
fonte
Haskell, 67 bytes
essa solução basicamente adiciona 1 o número especificado de vezes, em notação abreviada.
uso:
fonte
CJam, 16 bytes
Experimente online. Requer pelo menos O (n) tempo e memória, então deixe 100501 para o intérprete offline ...
Como funciona
A idéia básica por trás dessa abordagem é calcular pelo menos N decimais shortlex em sua ordem natural e descartar tudo, exceto o enésimo. Não é muito eficiente, mas curto.
Exemplo de execução
fonte
Bash + coreutils, 27 bytes
Porto da resposta inteligente do @ edc65 , com as melhorias do @ Dennis :
Resultado:
Resposta anterior:
Bash + coreutils,
7154 bytesAqui está uma maneira ligeiramente diferente de fazer isso:
jot
saídas aumentando números inteiros hexadecimaistr
converte isso em (0,1, ..., 8,9, b, ... f, 0a, 00,01, ..., 99,9b, ..., ff, 0aa, ..., 000 , ...)grep
simplesmente filtra todas as linhas que contêm dígitos para fornecer (0,1, ..., 8,9,00, ..., 99.000 ....)sed
exclui tudo, exceto a enésima linhased
conta os números de linha começando em 1, portanto, erros se 0 é passado)grep
, precisamos gerar mais números inteiros base 11 comseq
/dc
que o número de entrada. Repetir os dígitos de n é mais que suficiente.Note que uma vez que o número shortlex é impresso,
seq
continua gerando números até$1$1
, o que diminui especialmente para números de entrada maiores - O (n²), eu acho. Podemos acelerar,seq
fechando imediatamente após a impressão, ao custo de 7 bytes:Não há requisito de velocidade na pergunta, por isso vou com a versão mais curta para minha resposta principal.
fonte
s='jot -w%x $1$1|tr 0-9a a0-9|grep -P ^\\d+$|sed $1!d 2>-'; echo ${#s}
. Eu suspeito que você possa estar usando python para medir o comprimento da string, que trata o "\\" como um caractere.$a
parece ser desnecessária;cut -b2-<<<$[$1-~${1//?/8}]
deve funcionar muito bem.Python 2-
84, 7066Abordagem alternativa (mesmo comprimento):
fonte
Python 3, 107 caracteres
Isso não acabou vencendo, mas achei inteligente:
Eu defino um gerador para toda a sequência em 64 caracteres. Infelizmente, eu tenho que passar por algumas contorções para obter o enésimo elemento do gerador ... se eu pudesse
S=lambda n:G()[n]
.fonte
Pyth , 12
Outro ponto da resposta da @ edc65, que é o vencedor claro (IMO):
Pacote de teste (Graças a @DigitalTrauama):
Explicação:
fonte
[8, 8, 9] -> 889
). Como você faz isso?jk
transformará sua lista em uma string ev
transformará isso em um int. Entãovjk[8 8 9]
vai dar o número 889.[2 -1] -> 19
e[1 11] -> 21
.Java 8, 60 bytes
Porta da incrível resposta JavaScript (ES6) do @ edc65 , já que duvido que possa ser feito de forma mais curta de maneira aritmética em Java.
Experimente aqui.
fonte
Haskell , 57 bytes
Experimente online!
Constrói uma lista infinita de números e índices abreviados para a resposta.
g n
constrói a enésima "geração" de números, acrescentando o próximo dígito na frente de cada um dos números da geração anterior.fonte
05AB1E , 7 bytes
Usa a substituição do edc65 por 8 truques
Experimente online!
Explicação
fonte
Excel, 37 bytes
Usando a abordagem do @ edc65:
fonte
Gelatina , 5 bytes
Experimente online!
Sou muito novo no Jelly, por isso, se você puder melhorar isso, comente!
Explicação:
(De acordo com o comentário de res acima, o problema é equivalente a converter o número em base bijetiva 10)
fonte