Sem usar strings (exceto quando necessário, como com entrada ou saída) calcule o enésimo dígito, a partir da esquerda , de um número inteiro (na base 10).
A entrada será fornecida neste formato:
726433 5
A saída deve ser:
3
como esse é o quinto dígito de "726433".
A entrada não conterá zeros à esquerda, por exemplo "00223".
Casos de teste / outros exemplos:
9 1 -> 9
0 1 -> 0
444494 5 -> 9
800 2 -> 0
Isso é código de golfe; menor quantidade de caracteres vence, mas qualquer função incorporada, como "nthDigit (x, n)", não é aceitável .
Aqui estão alguns pseudo-códigos para você começar:
x = number
n = index of the digit
digits = floor[log10[x]] + 1
dropRight = floor[x / 10^(digits - n)]
dropLeft = (dropRight / 10 - floor[dropRight / 10]) * 10
nthDigit = dropLeft
Como você pode ver, sou novo no código do golfe e, embora eu ache um pouco injusto fazer uma pergunta antes mesmo de responder uma, gostaria muito de ver que tipo de resposta isso gera. :)
Edit : Eu estava esperando por respostas matemáticas, por isso não posso realmente aceitar respostas que dependem da conversão de strings em matrizes ou de poder acessar números como uma lista de dígitos.
Temos um vencedor
Escrito em "dc", 12 bytes. Por DigitalTrauma .
Respostas:
dc , 12 bytes
Esta é uma resposta matemática. Veja como funciona:
?
leia o número de entrada e pressione para empilhard
topo duplicado da pilhaZ
Retorna o valor da pilha, calcula e envia o número de dígitos?
leia o índice de dígitos e pressione para empilhar-
subtrair índice de dígitos da contagem de dígitosA
empurre 10 para a pilhar
trocar os 2 principais valores na pilha^
exponenciada 10 ^ (contagem de dígitos - índice de dígitos)/
dividir número pelo resultado da exponenciaçãoA
empurre 10 para a pilha%
calcule o número mod 10 para obter o último dígito e empurre para o topo da pilhap
pop e imprima a parte superior da pilhaEm ação:
fonte
base conversion -> arrays
.GolfScript (10 bytes)
Isso pressupõe que a entrada seja uma string (por exemplo, via stdin). Se houver dois números inteiros na pilha, a inicial
~
deve ser removida, economizando 1 caractere.Se a conversão de base for considerada incorreta com a regra de funções internas, eu tenho uma alternativa de 16 caracteres:
fonte
CJam - 7
CJam é uma nova linguagem que estou desenvolvendo, semelhante ao GolfScript - http://sf.net/p/cjam . Aqui está a explicação:
l
lê uma linha da entrada~
avalia a string (obtendo assim os dois números)(
diminui o segundo número\
troca os númerosA
é uma variável pré-inicializada para 10b
faz uma conversão de base, fazendo um array com os dígitos da base 10 do primeiro número=
obter o desejado elemento da matrizO programa é basicamente uma tradução da solução de Peter Taylor.
fonte
Haskell 60 bytes e legível
sem compromisso!
fonte
J -
1524 caracteresUma resposta "matemática suficiente".
Mesmos resultados que abaixo, mas é dotado da qualidade mística de ser matemático.
A versão curta, usando expansão de base 10.
Anexamos um 0 para ajustar a indexação baseada em 1.
Uso:
fonte
Python 127
fonte
def f(i,n): ... return d
if n>k: return -1
caso.C, 50
Isso usa matrizes.
Apenas ignore todos os avisos.
E sim, em C, strings são realmente apenas matrizes, então isso é meio barato.
Mais matemático:
C, 83
fonte
bc (impulsionado por bash),
4129Eu acho que esta é a primeira resposta para fazer isso matematicamente e não com strings:
O uso de
length()
talvez pareça um pouco complicado, mas a página de manual do bc fala sobre o número de dígitos e não o comprimento da string:Resultado:
fonte
Mathematica -
2423Este é meio óbvio :)
Exemplo:
Resultado:
Você pode reduzi-lo codificando dois números inteiros, por exemplo
mas então você primeiro tem que escrever
n = 726433; m = 5;
. A chamada de função parecia mais semelhante a um programa.fonte
1
.C 145
O programa encontra a distância do final do número inteiro e se divide até o índice ser alcançado e, em seguida, usa o módulo 10 para obter o último dígito.
fonte
i,a;main(){scanf("%d%d",&i,&a);for(a=log(i)/log(10)+1-a;a--;)i/=10;printf("%d",i%10);}
.Wolfram Alpha - entre 40 e 43
Claro, posso defender totalmente que usar
IntegerDigits
é um truque que não se enquadraMas como minha resposta anterior ainda parecia trapacear um pouco, aqui está uma alternativa. Infelizmente, é um pouco mais longo, mas não vi como reduzi-lo mais do que vi.
Contando da mesma maneira que antes (com o e comercial, sem passar em nenhum argumento),
possui 43 caracteres. Ao negar o expoente e embaralhar os termos, posso perder um operador aritmético (
10^(...)x
será interpretado como multiplicação)Não tenho o Mathematica à mão para testar, duvido que sejaComo eu suspeitava (e como foi gentilmente verificado por kukac67 ) no Mathematica, isso não é aceito, mas é executado no WolframAlpha .Estou em dúvida sobre o uso de
RealDigits
, porque me restringi de usarIntegerDigits
para esta resposta e elas são bastante semelhantes. No entanto, se eu me permito incluí-lo (afinal, ele não retorna os inteiros diretamente, assim como muitos deles não são), eu posso cortar fora mais dois personagens:fonte
Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
[
caracteres, mesmo quando estão codificados. Vou passar por um encurtador de URL. {edit2} Aparentemente, o W.Alpha mudou um link.Tcl (42 bytes, lambda):
(49 bytes, função):
(83 bytes, se precisarmos aceitar entrada do shell):
fonte
R (60)
Resolvido o problema usando o log10 para calcular o número de dígitos. O caso especial x == 0 custa 13 caracteres, suspiro.
Ungolfed:
Uso
fonte
Scala (
13399 bytes):Funciona para todas as entradas positivas. Divide por 10 a potência do dígito procurado da direita e, em seguida, leva o módulo 10.
Obrigado por perceber o bug na fórmula anterior. Este é mais curto.
fonte
Haskell, 142
Não sei se entendi a pergunta corretamente, mas é o que acho que você queria: leia stdin (string), faça os dois números int (não string), faça algumas coisas algorítmicas e depois produza o resultado (string). Coloquei 142 caracteres, o que é demais:
exemplo de uso:
fonte
JavaScript - 84
Puramente matemático, sem strings, nenhum deles. Pega o primeiro número no primeiro prompt e o segundo número no segundo prompt.
Caso de teste :
Código Ungolfed:
fonte
perl,
38, 36há 30 caracteres(sem contar o avanço de linha)
Isso sem dúvida é trapaça devido à opção de comando, mas obrigado por me deixar jogar :-)
editar :
Conseguiu remover 2 caracteres:
... mais 6:
Quão
Dividimos a entrada do primeiro argumento no script
$ARGV[0]
por character (split//
) criando uma matriz indexada zero; adicionar um ao segundo argumento$ARGV[1]
no script corresponde ao elemento nessa posição na cadeia ou no primeiro argumento. Em seguida, mantemos a expressão dentro()
como uma lista de um elemento quesay
iterará. Para a versão curta mais curta, apenasshift
no primeiro argumento e usamos a parte restante do @ARGV para usar no índice - uma vezshift
ed, apenas o segundo argumento permanece, e nóspop()
subtraímos 1.Isso deveria ser um exercício de matemática? Acabei de perceber que estou indexando uma string lida na entrada, então ... acho que perco ?? Marque-me se eu fizer sentido em um campo de golfe paralelo e tentarei novamente - mais matematicamente - em uma resposta separada.
Felicidades,
fonte
PHP, 58
Usando apenas matemática
<?$n=$argv[1];while($n>pow(10,$argv[2]))$n/=10;echo $n%10;
fonte
echo$n%10
.~ - ~! -
9493Dobra um pouco as regras - é uma função que recebe n como entrada e assume que o número para encontrar o dígito n é armazenado em
'''''
- e ~ - ~! não suporta carros alegóricos.'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:
resultarão em''''''
ser~~
(2) ( '' '''= 128).fonte
:)
Python 2.7 (89 bytes)
Transformei o número inteiro em um "polinômio" usando uma lista de dígitos. Eu sei que você diz que não pode aceitar isso, mas não vejo por que não, pois usa o conceito matemático de números sendo representados como polinômios de suas bases. Só falhará quando o número inteiro for passado
0
, mas você disse que não há zeros acolchoados;)Executar como
test.py
:Suponho que você quisesse entrada de shell e que eu não poderia fazer uso do fato de que a entrada seria string. Ignorando a entrada do shell, são apenas 43 bytes, com:
Embora eu use alguma iteração desnecessária, economizo alguns bytes não adicionando um decremento adicional
n
.fonte
BrainFuck estendido : 49
Uso:
Não estou usando nenhum recurso especial do EBF, exceto o operador de multiplicação (por exemplo,
10+ => ++++++++++
). Fora isso, é principalmente puro BrainFuckComo funciona:
Esquema (R6RS): 100 (sem espaço em branco desnecessário)
fonte
awk - 53
Ungolfed:
fonte
Scala (83)
Não usa nenhum recurso especial do Scala. Antes, a solução padrão.
Ungolfed:
fonte
C, 94
C, 91, inválido devido ao uso de matrizes.
fonte
Julia 37
Devido ao operador interno ^. A aritmética de precisão arbitrária permite qualquer tamanho int.
Amostra
fonte
perl (um pouco mais mathy / não muito golfy) - 99 caracteres
Execute-o como:
fonte
Perl6 - 85 caracteres
fonte
Smalltalk, 44
Embora dc seja imbatível, aqui está uma solução Smalltalk:
argumentos, número n; d dígito-nr para extrair:
fonte