Tanpa menggunakan string (kecuali bila perlu, seperti dengan input atau output) hitung digit ke-n, dari kiri , dari sebuah bilangan bulat (pada basis 10).
Masukan akan diberikan dalam format ini:
726433 5
Output harus:
3
karena itu adalah digit kelima "726433".
Input tidak akan mengandung angka nol di depan, misalnya "00223".
Uji kasus / contoh lebih lanjut:
9 1 -> 9
0 1 -> 0
444494 5 -> 9
800 2 -> 0
Ini adalah kode golf; paling sedikit jumlah karakter yang menang, tetapi fungsi bawaan seperti "nthDigit (x, n)" tidak dapat diterima .
Berikut beberapa pseudo-code untuk Anda mulai:
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
Seperti yang Anda lihat, saya baru mengenal kode golf, dan meskipun saya pikir agak tidak adil untuk mengajukan pertanyaan bahkan sebelum saya menjawabnya, saya benar-benar ingin melihat respons seperti apa yang dihasilkannya. :)
Sunting : Saya berharap untuk jawaban matematis, jadi saya tidak dapat benar-benar menerima jawaban yang mengandalkan konversi string ke array atau dapat mengakses angka sebagai daftar angka.
Kami punya pemenang
Ditulis dalam "dc", 12 byte. Oleh DigitalTrauma .
Jawaban:
dc , 12 byte
Ini jawaban matematis. Begini cara kerjanya:
?
baca nomor input dan tekan untuk menumpukd
duplikat atas tumpukanZ
Muncul nilai dari tumpukan, menghitung dan mendorong jumlah digit?
baca indeks angka dan tekan untuk menumpuk-
kurangi indeks angka dari jumlah digitA
dorong 10 ke tumpukanr
menukar 2 nilai teratas pada stack^
exponentiate 10 ^ (angka digit - indeks angka)/
bagi angka dengan hasil eksponensialA
dorong 10 ke tumpukan%
menghitung angka mod 10 untuk mendapatkan digit terakhir dan tekan ke atas tumpukanp
pop dan cetak bagian atas tumpukanBeraksi:
sumber
base conversion -> arrays
.GolfScript (10 byte)
Ini mengasumsikan input adalah sebagai string (misalnya via stdin). Jika dua bilangan bulat di tumpukan, yang awal
~
harus dihapus, menghemat 1 char.Jika konversi basis dianggap melanggar aturan fungsi bawaan, saya memiliki alternatif 16-char:
sumber
CJam - 7
CJam adalah bahasa baru yang saya kembangkan, mirip dengan GolfScript - http://sf.net/p/cjam . Berikut penjelasannya:
l
membaca garis dari input~
mengevaluasi string (sehingga mendapatkan dua angka)(
decrements angka kedua\
menukar angkaA
adalah variabel yang diinisialisasi menjadi 10b
melakukan konversi basis, membuat array dengan basis-10 digit angka pertama=
mendapatkan yang diinginkan elemen arrayProgram ini pada dasarnya adalah terjemahan dari solusi Peter Taylor.
sumber
Haskell 60 byte dan dapat dibaca
tidak ada ikatan!
sumber
J -
1524 char"Jawaban matematis" yang cukup.
Hasil yang sama seperti di bawah ini, tetapi diberkahi dengan kualitas mistis menjadi matematika.
Versi singkatnya, menggunakan ekspansi base-10.
Kami menambahkan 0 untuk menyesuaikan pengindeksan berbasis 1.
Pemakaian:
sumber
Python 127
sumber
def f(i,n): ... return d
if n>k: return -1
.C, 50
Ini menggunakan array.
Abaikan semua peringatan.
Dan ya, di C, string benar-benar hanya array, jadi ini agak murah.
Lebih banyak matematika:
C, 83
sumber
bc (didorong oleh bash),
4129Saya pikir ini adalah jawaban pertama untuk melakukan ini secara matematis dan bukan dengan string:
Penggunaan
length()
mungkin tampak agak berserabut, tetapi halaman manual bc berbicara tentang jumlah digit dan bukan panjang string:Keluaran:
sumber
Mathematica -
2423Yang ini agak jelas :)
Contoh:
Keluaran:
Anda bisa membuatnya lebih pendek dengan mengkodekan dua bilangan bulat, mis
tapi pertama-tama kamu harus menulis
n = 726433; m = 5;
. Panggilan fungsi terasa lebih mirip dengan program.sumber
1
.C 145
Program menemukan jarak dari ujung integer dan membaginya hingga indeks tercapai kemudian menggunakan modulus 10 untuk mendapatkan digit terakhir.
sumber
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 - antara 40 dan 43
Tentu saja, saya benar-benar dapat mempertahankan bahwa menggunakan
IntegerDigits
adalah trik yang tidak jatuh di bawahTetapi karena jawaban saya sebelumnya masih merasa sedikit curang, inilah alternatifnya. Sayangnya ini sedikit lebih lama, tetapi saya tidak melihat bagaimana mempersingkatnya daripada saya.
Menghitung dengan cara yang sama seperti sebelumnya (dengan ampersand, tanpa melewati argumen apa pun),
memiliki 43 karakter. Dengan meniadakan eksponen dan menyeret istilah-istilah di sekitar, saya dapat kehilangan satu operator aritmatika (
10^(...)x
akan diartikan sebagai multiplikasi)Saya tidak memiliki Mathematica untuk diuji, saya ragu bahwa itu akan menjadiSeperti yang saya duga (dan seperti yang diverifikasi oleh kukac67 ) di Mathematica ini tidak diterima, tetapi berjalan di WolframAlpha .Saya ragu tentang penggunaannya
RealDigits
, karena saya membatasi diri saya untuk menggunakanIntegerDigits
jawaban ini dan mereka sangat mirip. Namun, jika saya membiarkan diri saya untuk memasukkannya (setelah semua, itu tidak mengembalikan bilangan bulat secara langsung, berapa banyak dari mereka ada), saya dapat memotong dua karakter lain:sumber
Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
[
karakter bahkan ketika mereka dikodekan. Saya akan menariknya melalui penyingkat URL. {edit2} Rupanya W.Alpha memiliki satu - mengubah tautan.Tcl (42 byte, lambda):
(49 byte, fungsi):
(83 byte, jika kita perlu menerima input dari shell):
sumber
R (60)
Memecahkan masalah menggunakan log10 untuk menghitung jumlah digit. Kasing khusus x == 0 dikenakan biaya 13 karakter, desah.
Tidak Disatukan:
Pemakaian
sumber
Scala (
13399 bytes):Berfungsi untuk semua input positif. Dibagi dengan 10 pangkat digit yang dicari dari kanan, lalu bawa modulo 10.
Terima kasih telah memperhatikan bug di rumus sebelumnya. Yang ini lebih pendek.
sumber
Haskell, 142
Saya tidak yakin saya memahami pertanyaan dengan benar, tetapi ini adalah apa yang saya pikir Anda inginkan: baca stdin (string), buat dua angka int (bukan string), lakukan beberapa hal algoritmik, dan kemudian hasilkan hasilnya (string). Saya menjejalkannya ke 142 karakter, yang terlalu banyak:
contoh penggunaan:
sumber
JavaScript - 84
Murni matematis, tidak ada dawai, tidak satupun dari mereka. Mengambil nomor pertama di prompt pertama dan nomor kedua di prompt kedua.
Test case :
Kode Tidak Terkunci:
sumber
perl,
38, 36no 30 karakter(tidak termasuk linefeed)
Ini bisa dibilang curang karena saklar perintah, tapi terima kasih telah mengizinkan saya bermain :-)
edit :
Dapat menghapus 2 karakter:
... lalu 6 lainnya:
Bagaimana
Kami membagi input argumen pertama ke skrip
$ARGV[0]
dengan karakter (split//
) membuat array yang diindeks nol; menambahkan satu ke argumen kedua$ARGV[1]
ke skrip kemudian sesuai dengan elemen pada posisi itu di string atau argumen pertama. Kami kemudian memegang ekspresi di dalam()
sebagai daftar satu elemen yangsay
akan diulangi. Untuk versi pendek yang lebih pendek, kita hanya perlushift
argumen pertama dan menggunakan bagian @ARGV yang tersisa untuk digunakan untuk indeks - setelah dieditshift
hanya argumen kedua yang tersisa jadi kitapop()
dan kurangi 1.Apakah ini seharusnya menjadi latihan matematika? Saya baru sadar saya mengindeks string yang dibaca dari input, jadi ... Saya kira saya kehilangan ?? Tandai saya jika saya masuk akal di lapangan golf paralel dan saya akan mencoba lagi - lebih matematis - dalam jawaban terpisah.
Bersulang,
sumber
PHP, 58
Hanya menggunakan matematika
<?$n=$argv[1];while($n>pow(10,$argv[2]))$n/=10;echo $n%10;
sumber
echo$n%10
.~ - ~! -
9493Tekuk aturan sedikit - ini adalah fungsi yang mengambil n sebagai input dan mengasumsikan nomor untuk menemukan digit n disimpan
'''''
- dan ~ - ~! tidak mendukung pelampung.'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:
akan menghasilkan''''''
menjadi~~
(2) ('' '' '= 128).sumber
:)
Python 2.7 (89 bytes)
Saya mengubah bilangan bulat menjadi "polinomial" dengan menggunakan daftar angka. Saya tahu Anda mengatakan Anda tidak dapat menerimanya, tetapi saya tidak mengerti mengapa tidak karena menggunakan konsep matematika angka yang direpresentasikan sebagai polinomial dari pangkalan mereka. Ini hanya akan gagal ketika bilangan bulat yang lewat adalah
0
, tetapi Anda mengatakan tidak ada nol empuk;)Jalankan sebagai
test.py
:Saya berasumsi bahwa Anda menginginkan input shell dan bahwa saya tidak dapat memanfaatkan fakta bahwa input tersebut adalah string. Melewatkan input shell hanya 43 byte, dengan:
Meskipun saya menggunakan beberapa iterasi yang tidak perlu, saya menyimpan beberapa byte dengan tidak menambahkan pengurangan tambahan
n
.sumber
Extended BrainFuck : 49
Pemakaian:
Saya tidak menggunakan fitur-fitur khusus EBF kecuali untuk operator perkalian (mis.
10+ => ++++++++++
). Selain itu kebanyakan BrainFuck murniBagaimana itu bekerja:
Skema (R6RS): 100 (tanpa spasi yang tidak perlu)
sumber
awk - 53
Tidak Disatukan:
sumber
Scala (83)
Tidak menggunakan fitur khusus Scala. Melainkan solusi standar.
Tidak Disatukan:
sumber
C, 94
C, 91, tidak valid karena menggunakan array.
sumber
Julia 37
Karena operator bawaan. Aritmatika presisi sewenang-wenang memungkinkan untuk berbagai ukuran int.
Sampel
sumber
perl (sedikit lebih gila / tidak terlalu golf) - 99 karakter
Jalankan sebagai:
sumber
Perl6 - 85 karakter
sumber
Smalltalk, 44
Meskipun dc tidak terkalahkan, berikut adalah solusi Smalltalk:
argumen, nomor n; d digit-nr untuk mengekstrak:
sumber