Sans utiliser de chaînes (sauf lorsque cela est nécessaire, comme avec une entrée ou une sortie), calculez le nième chiffre, partir de la gauche , d'un entier (en base 10).
L'entrée sera donnée dans ce format:
726433 5
La sortie doit être:
3
car c'est le cinquième chiffre de "726433".
L'entrée sera ne contiendra pas de zéros non significatifs, par exemple "00223".
Cas de test / autres exemples:
9 1 -> 9
0 1 -> 0
444494 5 -> 9
800 2 -> 0
C'est le golf de code; moins de caractères gagnent, mais toutes les fonctions intégrées telles que "nthDigit (x, n)" sont ne pas acceptées .
Voici un pseudo-code pour vous aider à démarrer:
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
Comme vous pouvez le voir, je suis nouveau dans le golf de code, et même si je pense qu'il est un peu injuste que je pose une question avant même d'y avoir répondu, j'aimerais vraiment voir quel type de réponses cela génère. :)
Edit : J'espérais des réponses mathématiques, donc je ne peux pas vraiment accepter les réponses qui reposent sur la conversion de chaînes en tableaux ou sur la possibilité d'accéder à des nombres sous forme de liste de chiffres.
Nous avons un gagnant
Écrit en "dc", 12 octets. Par DigitalTrauma .
Réponses:
dc , 12 octets
Ceci est une réponse mathématique. Voici comment ça fonctionne:
?
lire le numéro d'entrée et pousser pour empilerd
dupliquer le haut de la pileZ
Fait sortir la valeur de la pile, calcule et pousse le nombre de chiffres?
lire l'index des chiffres et pousser pour empiler-
soustraire l'index des chiffres du nombre de chiffresA
poussez 10 vers la piler
permuter les 2 premières valeurs sur la pile^
exponentiate 10 ^ (nombre de chiffres - index des chiffres)/
diviser le nombre par le résultat de l'exponentiationA
poussez 10 vers la pile%
calculer le nombre mod 10 pour obtenir le dernier chiffre et pousser en haut de la pilep
sauter et imprimer le haut de la pileEn action:
la source
base conversion -> arrays
.GolfScript (10 octets)
Cela suppose que l'entrée est une chaîne (par exemple via stdin). S'il s'agit de deux entiers sur la pile, l'initiale
~
doit être supprimée, économisant 1 caractère.Si la conversion de base est considérée comme contraire à la règle des fonctions intégrées, j'ai une alternative à 16 caractères:
la source
CJam - 7
CJam est un nouveau langage que je développe, similaire à GolfScript - http://sf.net/p/cjam . Voici l'explication:
l
lit une ligne de l'entrée~
évalue la chaîne (obtenant ainsi les deux nombres)(
décrémente le deuxième nombre\
permute les nombresA
est une variable préinitialisée à 10b
effectue une conversion de base, faisant un tableau avec les chiffres de base 10 du premier nombre=
obtient le désiré élément du tableauLe programme est essentiellement une traduction de la solution de Peter Taylor.
la source
Haskell 60 octets et lisible
aucune chaîne impliquée!
la source
J -
1524 caractèresUne réponse suffisamment "mathématique".
Mêmes résultats que ci-dessous, mais est doté de la qualité mystique d'être mathématique.
La version courte, utilisant l'expansion base-10.
Nous ajoutons un 0 pour ajuster l'indexation basée sur 1.
Usage:
la source
Python 127
la source
def f(i,n): ... return d
if n>k: return -1
.C, 50
Cela utilise des tableaux.
Ignorez simplement tous les avertissements.
Et oui, en C, les chaînes ne sont vraiment que des tableaux, donc c'est en quelque sorte bon marché.
Plus mathématique:
C, 83
la source
bc (entraîné par bash),
4129Je pense que c'est la première réponse pour le faire mathématiquement et non avec des chaînes:
L'utilisation de
length()
peut - être semble un peu filandreuse, mais la page de manuel bc parle du nombre de chiffres et non de la longueur de la chaîne:Production:
la source
Mathematica -
2423Celui-ci est assez évident :)
Exemple:
Production:
Vous pouvez le raccourcir en codant en dur deux entiers, par exemple
mais il faut d'abord écrire
n = 726433; m = 5;
. L'appel de fonction ressemblait plus à un programme.la source
1
.C 145
Le programme trouve la distance de la fin de l'entier et divise jusqu'à ce que l'indice soit atteint, puis utilise le module 10 pour obtenir le dernier chiffre.
la source
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 et 43
Bien sûr, je peux totalement défendre que l'utilisation
IntegerDigits
est une astuce qui ne relève pasMais parce que ma réponse précédente avait toujours envie de tricher un peu, voici une alternative. Malheureusement, c'est un peu plus long, mais je n'ai pas vu comment le raccourcir plus que moi.
Compter de la même manière que précédemment (avec l'esperluette, sans passer d'arguments),
a 43 caractères. En niant l'exposant et en mélangeant les termes autour, je peux perdre un opérateur arithmétique (
10^(...)x
sera interprété comme une multiplication)Je n'ai pas Mathematica à portée de main pour tester, je doute que ce sera commeje le soupçonnais (et comme l'a aimablement vérifié par kukac67 ) en Mathematica cela n'est pas accepté, mais il fonctionne dans WolframAlpha .Je doute de l'utilisation de
RealDigits
, car je me suis limité à utiliserIntegerDigits
pour cette réponse et ils sont assez similaires. Cependant, si je me permets de l' inclure (après tout, il ne retourne pas les entiers directement, à quel point nombre d'entre eux il y a), je peux réduire de deux autres personnages:la source
Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
[
caractères même lorsqu'ils sont encodés. Je vais le passer à travers un raccourcisseur d'URL. {edit2} Apparemment W.Alpha en a un - a changé le lien.Tcl (42 octets, lambda):
(49 octets, fonction):
(83 octets, si nous devons accepter l'entrée du shell):
la source
R (60)
Solved the problem using log10 to calculate the number of digits. The special case x==0 costs 13 character, sigh.
Ungolfed:
Usage
la source
Scala (
13399 bytes):Works for all positive inputs. Divides by 10 to the power of the digit looked for from the right, then takes it modulo 10.
Thank you for noticing the bug in the previous formula. This one is shorter.
la source
Haskell, 142
I'm not sure I understood the question correctly, but this is what I think you wanted: read stdin (string), make the two numbers int (not string), do some algorithmic things, and then output the result (string). I crammed it into 142 chars, which is way too much:
example usage:
la source
JavaScript - 84
Purely mathematical, no strings, none of them. Takes the first number in the first prompt and the second number in the second prompt.
Test Case:
Ungolfed Code:
la source
perl,
38, 36no 30 characters(not counting the linefeed)
This is arguably cheating due to the command switch, but thanks for letting me play :-)
edit:
Was able to remove 2 characters:
... then 6 more:
How
We split the input of the first argument to the script
$ARGV[0]
by character (split//
) creating an zero indexed array; adding one to the second argument$ARGV[1]
to the script then corresponds to the element at that position in the string or first argument. We then hold the expression inside()
as a one element list whichsay
will iterate through. For the shorter short version we justshift
in the first argument and use the remaining part of @ARGV to use for the index - onceshift
ed only the second argument remains so wepop()
it and subtract 1.Is this supposed to be a math exercise? I just realized I'm indexing a string read from input, so ... I guess I lose?? Mark me up if I make sense in parallel golf course and I will try again - more mathematically - in a separate answer.
cheers,
la source
PHP, 58
Using math only
<?$n=$argv[1];while($n>pow(10,$argv[2]))$n/=10;echo $n%10;
la source
echo$n%10
.~-~! -
9493Bends the rules a bit - it's a function that takes n as input and assumes the number to find digit n of is stored in
'''''
- and ~-~! doesn't support floats.'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:
will result in''''''
being~~
(2) (''''' = 128).la source
:)
Python 2.7 (89 bytes)
I transform the integer into a "polynomial" by using a list of digits. I know you say you can't accept that, but I don't see why not since it uses the mathematical concept of numbers being represented as polynomials of their bases. It will only fail when the integer passed in is
0
, but you said no padded zeroes ;)Run as
test.py
:I assume you wanted shell input and that I couldn't make use of the fact that the input would be strings. Skipping shell input it's just 43 bytes, with:
Although I use some unnecessary iteration, I save some bytes by not adding an additional decrement on
n
.la source
Extended BrainFuck: 49
Usage:
I'm not ectually using any special features of EBF except the multiplication operator (eg.
10+ => ++++++++++
). Other than that it's mostly pure BrainFuckHow it works:
Scheme (R6RS): 100 (without unnecessary whitespace)
la source
awk - 53
Ungolfed:
la source
Scala (83)
Does not use any Scala special features. Rather the standard solution.
Ungolfed:
la source
C, 94
C, 91, invalid because of using arrays.
la source
Julia 37
Owing to the builtin ^ operator. Arbitrary precision arithmetic allows for any size int.
Sample
la source
perl (slightly more mathy/not very golfy) - 99 chars
Run it as:
la source
Perl6 - 85 chars
la source
Smalltalk, 44
Although dc is unbeatable, here is a Smalltalk solution:
arguments, n number; d digit-nr to extract:
la source