Без использования строк (кроме случаев, когда это необходимо, например, с вводом или выводом) вычислите n-ю цифру слева от целого числа (в базе 10).
Ввод будет дан в следующем формате:
726433 5
Вывод должен быть:
3
так как это пятая цифра "726433".
Ввод не будет содержать начальных нулей, например, «00223».
Тестовые случаи / дополнительные примеры:
9 1 -> 9
0 1 -> 0
444494 5 -> 9
800 2 -> 0
Это код гольф; выигрывает наименьшее количество символов, но любые встроенные функции, такие как «nthDigit (x, n)», недопустимы .
Вот некоторый псевдокод, чтобы вы начали:
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
Как вы видите, я новичок в коде гольфа, и хотя я думаю, что это немного несправедливо, когда я задаю вопрос, прежде чем я даже отвечу на него, мне бы очень хотелось посмотреть, какие ответы это вызывает. :)
Изменить : я надеялся на математические ответы, поэтому я не могу принять ответы, которые основаны на преобразовании строк в массивы или возможности доступа к числам в виде списка цифр.
У нас есть победитель
Написано в "dc", 12 байтов. По DigitalTrauma .
Ответы:
постоянный ток , 12 байт
Это математический ответ. Вот как это работает:
?
прочитать номер ввода и нажать на стекd
дубликат вершины стекаZ
Вытаскивает значение из стека, вычисляет и выталкивает количество цифр?
прочитать цифровой индекс и нажать на стек-
вычитать индекс из числа цифрA
толкнуть 10 в стекr
поменять 2 верхних значения в стеке^
возведение в степень 10 ^ (число цифр - индекс цифры)/
разделить число по степени возведения в степеньA
толкнуть 10 в стек%
рассчитать число мод 10, чтобы получить последнюю цифру и нажать на вершину стекаp
выскочить и распечатать вершину стекаВ бою:
источник
base conversion -> arrays
.GolfScript (10 байт)
Это предполагает, что ввод в виде строки (например, через стандартный ввод). Если в стеке два целых числа, то начальная буква
~
должна быть удалена, сохраняя 1 символ.Если базовое преобразование считается нарушением правила встроенных функций, у меня есть альтернатива из 16 символов:
источник
CJam - 7
CJam - это новый язык, который я разрабатываю, похожий на GolfScript - http://sf.net/p/cjam . Вот объяснение:
l
читает строку из входных данных,~
оценивает строку (получая, таким образом, два числа),(
уменьшает второе число,\
переставляет числа,A
переменная, предварительно инициализированную в 10,b
выполняет базовое преобразование, делая массив с 10-значными цифрами из первого числа, получая=
желаемое элемент массиваПрограмма в основном перевод решения Питера Тейлора.
источник
Haskell 60 байт и читаемый
без всяких условий!
источник
J -
1524 символаДостаточно «математический ответ».
Те же результаты, что и ниже, но наделены мистическим качеством математики.
Короткая версия, использующая расширение base-10.
Мы добавляем 0 для корректировки индексации на основе 1.
Использование:
источник
Python 127
источник
def f(i,n): ... return d
if n>k: return -1
дело.С, 50
Это использует массивы.
Просто игнорируйте все предупреждения.
И да, в C строки - это просто массивы, так что это довольно дешево.
Больше математики:
С, 83
источник
до н.э. (управляемый bash),
4129Я думаю, что это первый ответ, который делает это математически, а не со строками:
Использование
length()
может показаться немного сложным, но страница руководства bc говорит о количестве цифр, а не о длине строки:Выход:
источник
Mathematica -
2423Этот вид очевиден :)
Пример:
Выход:
Вы можете сократить его, жестко закодировав два целых числа, например:
но тогда сначала нужно написать
n = 726433; m = 5;
. Вызов функции чувствуется больше похожим на программу.источник
1
.C 145
Программа находит расстояние от конца целого и делит до достижения индекса, затем использует модуль 10 для получения последней цифры.
источник
i,a;main(){scanf("%d%d",&i,&a);for(a=log(i)/log(10)+1-a;a--;)i/=10;printf("%d",i%10);}
.Вольфрам Альфа - между 40 и 43
Конечно, я могу полностью отстоять, что использование
IntegerDigits
- это трюк, который не подпадает подНо так как мой предыдущий ответ все еще немного обманывал, вот альтернатива. К сожалению, это немного дольше, но я не видел, как сократить это больше, чем я.
Считаем так же, как и раньше (с амперсандом, не передавая никаких аргументов),
имеет 43 символа. Отрицая показатель степени и перемешивая члены, я могу потерять один арифметический оператор (
10^(...)x
будет интерпретироваться как умножение)У меня нет Mathematica под рукой для тестирования, я сомневаюсь, что это будетКак я подозревал (и как любезно подтверждено kukac67 ) в Mathematica, это не принято, но оно работает в WolframAlpha .Я сомневаюсь в использовании
RealDigits
, потому что я ограничил себя в использованииIntegerDigits
этого ответа, и они очень похожи. Однако, если я позволю себе включить его ( в конце концов, он не возвращает целые числа непосредственно, так как многие из них есть), я могу сократить от еще два символа:источник
Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
[
символы, даже когда они закодированы. Я потяну это через сокращение URL. {edit2} Видимо у W.Alpha есть один - изменил ссылку.Tcl (42 байта, лямбда):
(49 байт, функция):
(83 байта, если нам нужно принять входные данные из оболочки):
источник
R (60)
Решил проблему, используя log10 для вычисления количества цифр. Особый случай x == 0 стоит 13 символов, вздох.
Ungolfed:
использование
источник
Scala (
13399 байт):Работает на все положительные вклады. Делит на 10 на степень искомой цифры справа, затем принимает ее по модулю 10.
Спасибо, что заметили ошибку в предыдущей формуле. Этот короче.
источник
Хаскелл, 142
Я не уверен, что правильно понял вопрос, но это то, что я думаю, вы хотели: прочитать stdin (строка), сделать два числа int (не строка), сделать некоторые алгоритмические вещи, а затем вывести результат (строка). Я втиснул его в 142 символа, что слишком много:
пример использования:
источник
JavaScript - 84
Чисто математический, без строк, ни один из них. Принимает первое число в первом приглашении и второе число во втором приглашении.
Тестовый кейс :
Код Ungolfed:
источник
Perl,
38, 36без 30 символов(не считая перевода строки)
Возможно это обман из-за переключателя команд, но спасибо, что позволили мне поиграть :-)
редактировать :
Смог удалить 2 персонажа:
... тогда еще 6:
Как
Мы разделяем ввод первого аргумента в сценарии
$ARGV[0]
символом (split//
), создавая нулевой индексированный массив; добавление одного ко второму аргументу$ARGV[1]
в сценарии затем соответствует элементу в этой позиции в строке или первом аргументе. Затем мы сохраняем выражение внутри()
как один элемент списка, которыйsay
будет повторяться. Для более короткой короткой версии мы простоshift
используем первый аргумент и используем оставшуюся часть @ARGV для индекса - после редактированияshift
остается только второй аргумент, поэтому мыpop()
вычитаем 1 и вычитаем 1.Это должно быть математическое упражнение? Я только что понял, что индексирую строку, прочитанную из ввода, так что ... я думаю, я проиграл ?? Отметьте меня, если у меня есть смысл в параллельном поле для гольфа, и я попробую еще раз - более математически - в отдельном ответе.
веселит,
источник
PHP, 58
Использование только математики
<?$n=$argv[1];while($n>pow(10,$argv[2]))$n/=10;echo $n%10;
источник
echo$n%10
.~ - ~! -
9493Немного изменяет правила - это функция, которая принимает n в качестве входных данных и предполагает, что число, в котором находится цифра n, хранится в
'''''
- и ~ - ~! не поддерживает поплавки.'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:
приведет''''''
к~~
(2) ('' '' '= 128).источник
:)
Python 2,7 (89 байт)
Я преобразую целое число в «полином», используя список цифр. Я знаю, что вы говорите, что не можете принять это, но я не понимаю, почему нет, поскольку в нем используется математическая концепция чисел, представляемых в виде полиномов их базисов. Он потерпит неудачу только тогда, когда передано целое число
0
, но вы сказали, что нет дополненных нулей;)Запустите как
test.py
:Я предполагаю, что вы хотели ввода в оболочку, и я не мог использовать тот факт, что ввод будет строкой. Пропустив ввод оболочки, это всего 43 байта, с:
Хотя я использую некоторые ненужные итерации, я сохраняю некоторые байты, не добавляя дополнительного декремента
n
.источник
Расширенный BrainFuck : 49
Использование:
На самом деле я не использую какие-либо специальные функции EBF, кроме оператора умножения (например,
10+ => ++++++++++
). Кроме этого это в основном чистый BrainFuckКак это устроено:
Схема (R6RS): 100 (без лишних пробелов)
источник
awk - 53
Ungolfed:
источник
Скала (83)
Не использует никаких специальных функций Scala. Скорее стандартное решение.
Ungolfed:
источник
С, 94
C, 91, недопустимый из-за использования массивов.
источник
Юлия 37
Благодаря встроенному оператору ^. Произвольная точность арифметики допускает любой размер int.
Образец
источник
Perl (немного больше математики / не очень гольфы) - 99 символов
Запустите его как:
источник
Perl6 - 85 символов
источник
Smalltalk, 44
Хотя dc непобедим, вот решение Smalltalk:
аргументы, n число; d цифра-номер для извлечения:
источник