Bez użycia łańcuchów (z wyjątkiem, gdy jest to konieczne, na przykład z wejściem lub wyjściem) obliczyć n-tą liczbę od lewej liczby całkowitej (w podstawie 10).
Dane wejściowe zostaną podane w tym formacie:
726433 5
Dane wyjściowe powinny wynosić:
3
ponieważ jest to piąta cyfra „726433”.
Dane wejściowe nie będą zawierać zer wiodących, np. „00223”.
Przypadki testowe / dalsze przykłady:
9 1 -> 9
0 1 -> 0
444494 5 -> 9
800 2 -> 0
To jest kod golfowy; wygrywa najmniej znaków, ale jakiekolwiek wbudowane funkcje, takie jak „nthDigit (x, n)” są niedopuszczalne .
Oto pseudo-kod na początek:
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
Jak widać, jestem nowy w kodowaniu golfa i choć myślę, że to trochę niesprawiedliwe, że zadaję pytanie, zanim jeszcze na nie odpowiem, naprawdę chciałbym zobaczyć, jakie to generuje odpowiedzi. :)
Edycja : Miałem nadzieję na matematyczne odpowiedzi, więc nie mogę zaakceptować odpowiedzi, które polegają na konwersji ciągów znaków na tablice lub na dostępie do liczb jako listy cyfr.
Mamy zwycięzcę
Napisane w „dc”, 12 bajtów. Przez DigitalTrauma .
Odpowiedzi:
dc , 12 bajtów
To jest matematyczna odpowiedź. Oto jak to działa:
?
odczytać numer wejściowy i wcisnąć do stosud
zduplikowany początek stosuZ
Zrzuca wartość ze stosu, oblicza i wypycha liczbę cyfr?
odczytać indeks cyfr i nacisnąć na stos-
odejmij indeks cyfr od liczby cyfrA
pchnij 10 na stosr
zamień 2 górne wartości na stosie^
wykładnik 10 ^ (liczba cyfr - indeks cyfr)/
podziel liczbę przez wynik potęgowaniaA
pchnij 10 na stos%
obliczyć liczbę mod 10, aby uzyskać ostatnią cyfrę i przesunąć na górę stosup
pop i wydrukuj górę stosuW akcji:
źródło
base conversion -> arrays
.GolfScript (10 bajtów)
Zakłada się, że dane wejściowe są w postaci łańcucha (np. Przez stdin). Jeśli na stosie są dwie liczby całkowite, wartość początkowa
~
powinna zostać usunięta, oszczędzając 1 znak.Jeśli uważa się, że podstawowa konwersja jest niezgodna z regułą funkcji wbudowanych, mam 16-znakową alternatywę:
źródło
CJam - 7
CJam to nowy język, który rozwijam, podobny do GolfScript - http://sf.net/p/cjam . Oto wyjaśnienie:
l
czyta wiersz z danych wejściowych~
ocenia ciąg znaków (w ten sposób uzyskując dwie liczby)(
zmniejsza drugą liczbę\
zamienia liczbyA
jest zmienną wstępnie zainicjalizowaną na 10b
dokonuje konwersji podstawy, dzięki czemu tablica z cyframi podstawy 10 pierwszej liczby=
otrzymuje pożądane element tablicyProgram jest w zasadzie tłumaczeniem rozwiązania Petera Taylora.
źródło
Haskell 60 bajtów i czytelny
bez żadnych zobowiązań!
źródło
J -
1524 znakówWystarczająco „matematyczna odpowiedź”.
Te same wyniki, co poniżej, ale mają mistyczną jakość bycia matematyką.
Krótka wersja, wykorzystująca rozszerzenie base-10.
Poprzedzamy 0, aby skorygować indeksowanie 1.
Stosowanie:
źródło
Python 127
źródło
def f(i,n): ... return d
if n>k: return -1
.C, 50
To używa tablic.
Po prostu zignoruj wszystkie ostrzeżenia.
I tak, w C, ciągi są tak naprawdę tylko tablicami, więc jest to trochę tanie.
Więcej matematyki:
C, 83
źródło
bc (napędzany bash),
4129Myślę, że to pierwsza odpowiedź, aby zrobić to matematycznie, a nie za pomocą łańcuchów:
Użycie
length()
może wydaje się nieco rygorystyczne, ale strona podręcznika użytkownika bc mówi o liczbie cyfr, a nie o długości łańcucha:Wynik:
źródło
Mathematica -
2423Ten jest dość oczywisty :)
Przykład:
Wynik:
Możesz go skrócić, wpisując na stałe dwie liczby całkowite, np
ale najpierw musisz napisać
n = 726433; m = 5;
. Wywołanie funkcji wydawało się bardziej podobne do programu.źródło
1
.C 145
Program znajduje odległość od końca liczby całkowitej i dzieli aż do osiągnięcia indeksu, a następnie używa modułu 10, aby uzyskać ostatnią cyfrę.
źródło
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 - od 40 do 43
Oczywiście mogę całkowicie bronić tego, że używanie
IntegerDigits
jest lewą, która nie podlegaAle ponieważ moja poprzednia odpowiedź wciąż była trochę oszustwem, oto alternatywa. Niestety jest nieco dłuższy, ale nie widziałem, jak go skrócić bardziej niż ja.
Liczenie w podobny sposób jak poprzednio (z ampersand, bez przekazywania żadnych argumentów),
ma 43 znaków. Negując wykładnik potasowania i zmieniając terminy, mogę stracić jednego operatora arytmetycznego (
10^(...)x
zostanie zinterpretowane jako mnożenie)Nie mam pod ręką Matematyki do przetestowania, wątpię, aby była tak,jak podejrzewałem (i jak to uprzejmie zweryfikował kukac67 ) w Mathematice, że nie jest to akceptowane, ale działa w WolframAlpha .Mam wątpliwości co do użycia
RealDigits
, ponieważ ograniczyłem się do korzystaniaIntegerDigits
z tej odpowiedzi i są one dość podobne. Jednakże, jeśli mogę pozwolić sobie na włączenie go (po wszystkim, to nie zwraca liczb całkowitych bezpośrednio, podobnie jak wielu z nich istnieje), mogę ciąć się kolejne dwa znaki:źródło
Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
[
znaków, nawet jeśli są zakodowane. Przeciągnę go przez skracacz URL. {edit2} Najwyraźniej W.Alpha ma jeden - zmienił link.Tcl (42 bajty, lambda):
(49 bajtów, funkcja):
(83 bajty, jeśli musimy zaakceptować dane wejściowe z powłoki):
źródło
R (60)
Rozwiązano problem za pomocą log10 do obliczenia liczby cyfr. Przypadek specjalny x == 0 kosztuje 13 znaków, westchnienie.
Nie golfowany:
Stosowanie
źródło
Scala (
13399 bajtów):Działa dla wszystkich pozytywnych danych wejściowych. Dzieli przez 10 na potęgę cyfry poszukiwanej z prawej strony, a następnie przyjmuje modulo 10.
Dziękujemy za zauważenie błędu w poprzedniej formule. Ten jest krótszy.
źródło
Haskell, 142
Nie jestem pewien, czy poprawnie zrozumiałem pytanie, ale myślę, że chciałeś tego: przeczytaj stdin (ciąg), utwórz dwie liczby int (nie ciąg), zrób kilka algorytmicznych rzeczy, a następnie wyślij wynik (ciąg). Wcisnąłem go w 142 znaki, co jest zdecydowanie za dużo:
przykładowe użycie:
źródło
JavaScript - 84
Czysto matematyczny, bez zobowiązań, bez żadnego z nich. Pobiera pierwszą liczbę w pierwszym monicie i drugą liczbę w drugim monicie.
Przypadek testowy :
Nieskluczony kod:
źródło
perl,
38, 36nr 30 znaków(nie licząc linii)
Prawdopodobnie jest to oszustwo ze względu na przełącznik poleceń, ale dzięki za umożliwienie mi gry :-)
edycja :
Był w stanie usunąć 2 znaki:
... a potem jeszcze 6:
W jaki sposób
Podzieliliśmy wejście pierwszego argumentu do skryptu
$ARGV[0]
według znaków (split//
), tworząc tablicę indeksowaną zerowo; dodanie jednego do drugiego argumentu$ARGV[1]
w skrypcie odpowiada następnie elementowi w tej pozycji w ciągu lub pierwszym argumencie. Następnie przechowujemy wyrażenie w środku()
jako listę jednego elementu, którasay
będzie się powtarzać. W przypadku krótszej krótkiej wersji używamy tylkoshift
pierwszego argumentu i używamy pozostałej części @ARGV do użycia dla indeksu - razshift
ed pozostaje tylko drugi argument, więcpop()
go odejmujemy 1.Czy to ma być ćwiczenie matematyczne? Właśnie zdałem sobie sprawę, że indeksuję ciąg odczytany z danych wejściowych, więc ... Myślę, że przegrałem? Zaznacz mnie, jeśli mam sens na równoległym polu golfowym i spróbuję ponownie - bardziej matematycznie - w osobnej odpowiedzi.
Twoje zdrowie,
źródło
PHP, 58
Używanie tylko matematyki
<?$n=$argv[1];while($n>pow(10,$argv[2]))$n/=10;echo $n%10;
źródło
echo$n%10
.~ - ~! -
9493Wygina nieco reguły - jest to funkcja, która przyjmuje n jako dane wejściowe i zakłada, że liczba, aby znaleźć cyfrę n, jest przechowywana w
'''''
- i ~ - ~! nie obsługuje pływaków.'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:
spowoduje''''''
bycie~~
(2) („” „= 128).źródło
:)
Python 2.7 (89 bajtów)
Przekształcam liczbę całkowitą na „wielomian” za pomocą listy cyfr. Wiem, że mówisz, że nie możesz tego zaakceptować, ale nie rozumiem, dlaczego nie, ponieważ wykorzystuje matematyczną koncepcję liczb reprezentowanych jako wielomiany ich podstaw. Nie powiedzie się to tylko wtedy, gdy podana jest liczba całkowita
0
, ale nie powiedziałeś żadnych dopełnianych zer;)Uruchom jako
test.py
:Zakładam, że chciałeś danych wejściowych powłoki i że nie mogłem skorzystać z faktu, że dane wejściowe byłyby łańcuchami. Pomijanie danych wejściowych powłoki to zaledwie 43 bajty, z:
Chociaż używam niepotrzebnej iteracji, oszczędzam niektóre bajty, nie dodając do nich dodatkowego zmniejszenia
n
.źródło
Extended BrainFuck : 49
Stosowanie:
Nie używam żadnych specjalnych funkcji EBF poza operatorem mnożenia (np.
10+ => ++++++++++
). Poza tym jest to w większości czysty BrainFuckJak to działa:
Schemat (R6RS): 100 (bez niepotrzebnych białych znaków)
źródło
awk - 53
Nie golfowany:
źródło
Scala (83)
Nie używa żadnych specjalnych funkcji Scala. Raczej standardowe rozwiązanie.
Nie golfowany:
źródło
C, 94
C, 91, nieprawidłowa z powodu użycia tablic.
źródło
Julia 37
Dzięki wbudowanemu operatorowi ^. Arbitralna precyzja arytmetyczna pozwala na dowolny rozmiar int.
Próba
źródło
perl (nieco więcej mathy / niezbyt golfy) - 99 znaków
Uruchom jako:
źródło
Perl6 - 85 znaków
źródło
Smalltalk, 44
Chociaż dc jest nie do pobicia, oto rozwiązanie Smalltalk:
argumenty, liczba n; d cyfra-nr do wyodrębnienia:
źródło