Ketika saya masih kecil, dan ingin menghitung uang dolar dalam tabungan hidup saya, saya akan menghitung dengan keras:
satu dua tiga empat lima enam tujuh delapan sembilan sepuluh;
sebelas, dua belas, tiga belas, empat belas, lima belas, enam belas, tujuh belas, delapan belas, sembilan belas, dua puluh;
dua puluh satu, dua puluh dua, dua puluh tiga, dua puluh empat, dua puluh lima ...
Akhirnya saya bosan mengucapkan masing-masing angka multi-suku kata ini. Berpikir matematis, saya menciptakan metode penghitungan yang jauh lebih efisien:
satu dua tiga empat lima enam tujuh delapan sembilan sepuluh;
satu, dua, tiga, empat, lima, enam, tujuh, delapan, sembilan, dua puluh;
satu, dua, tiga, empat, lima, enam, tujuh, delapan, sembilan, tiga puluh ...
Seperti yang Anda lihat, saya hanya akan mengucapkan digit yang telah berubah dari angka sebelumnya. Ini memiliki keuntungan tambahan bahwa itu jauh lebih berulang daripada nama-nama bahasa Inggris untuk angka, dan karenanya membutuhkan lebih sedikit kekuatan otak untuk menghitung.
Tantangan
Tulis sebuah program / fungsi yang mengambil bilangan bulat positif dan menghasilkan / mengembalikan bagaimana saya akan menghitungnya: yaitu, digit paling kanan bukan nol dan semua nol tertinggal.
Contohnya
1 1
2 2
10 10
11 1
29 9
30 30
99 9
100 100
119 9
120 20
200 200
409 9
1020 20
Daftar lengkap kasus uji seharusnya tidak perlu. Ini adalah A274206 pada OEIS.
Aturan
- Entri Anda secara teoritis harus bekerja untuk semua bilangan bulat positif, mengabaikan masalah presisi dan memori.
- Input dan output harus dalam desimal.
- Anda dapat memilih untuk mengambil input dan / atau output sebagai angka, string, atau array angka.
- Input dijamin bilangan bulat positif. Entri Anda dapat melakukan apa saja untuk input yang tidak valid.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
[1,0,2,0]
->[2,0]
untuk kasus uji terakhir? (Saya tidak jelas pada frasa "array item tunggal").Jawaban:
Python 2 , 28 byte
Cobalah online!
Formula rekursif bekerja dengan sangat bersih. Jika digit terakhir bukan nol, keluarkan. Jika tidak, hapus nol akhir, hitung output untuk itu, dan kalikan dengan 10.
sumber
Jelly ,
63 byte-3 byte dengan memiliki I / O sebagai daftar angka desimal .
Test suite di Coba online!
Bagaimana?
Jika kita tidak bisa mengambil daftar desimal, 6 byter adalah:
Yang bisa Anda lihat di sini .
Ini melakukan hal yang sama, tetapi mengonversi bilangan bulat ke daftar desimal sebelumnya dan mengonversi kembali ke bilangan bulat setelahnya.
sumber
C,
302927 byteBangga dengan ini ketika saya menyalahgunakan dua eksploitasi C untuk golf ini (dijelaskan di akhir posting); Ini khusus untuk C (GCC)
3)
b=10;f(a){a=a%b?:b*f(a/b);}
// 27 byte2)
// 29 byteb;f(a){b=a=a%10?:10*f(a/10);}
1)
// 30 bytef(i){return i%10?:10*f(i/10);}
Cobalah online (versi 27 byte)
Upaya pertama (30 byte): Menyalahgunakan fakta bahwa dalam GCC jika tidak ada nilai yang dinyatakan dalam ternary, nilai kondisional akan dikembalikan. Karenanya mengapa operator ternary saya kosong untuk nilai pengembalian kebenaran.
Upaya kedua (29 byte): Menyalahgunakan memori bug di GCC di mana, sejauh yang saya mengerti, jika suatu fungsi tidak memiliki nilai balik, ketika lebih dari dua variabel telah dimanfaatkan secara bermakna dalam fungsi, nilai set terakhir dari variabel argumen pertama akan dikembalikan.
(Edit: tetapi "nilai setel" ini harus ditetapkan dengan cara tertentu, misalnya mengatur variabel dengan
=
atau+=
berfungsi tetapi menyetelnya dengan%=
tidak berfungsi; aneh)Upaya ketiga (27 byte): Karena saya harus secara bermakna memanfaatkan variabel kedua (b) untuk menyalahgunakan bug memori yang disebutkan di atas, saya juga dapat menggunakannya sebagai variabel aktual untuk "10" untuk substitusi.
(Catatan: Saya harus bisa bertukar
a=a%b
dengana%=b
untuk menyimpan byte lain tapi sayangnya ini menyebabkan exploit bug memori di atas berhenti "bekerja", jadi saya tidak bisa)sumber
Retina ,
76 byteCobalah secara online (semua test case)
Output cocok dengan digit diikuti oleh nol di akhir string input. Meskipun tidak diperlukan, ini juga berlaku untuk
0
.sumber
[1-9]
(atau[^0]
) akan diperlukan sebagai gantinya\d
. Saya kira keserakahan*
memastikan hasil yang benar setiap saat.*
tetapi dengan fakta bahwa kecocokan dicari dari kiri ke kanan.\d0*?$
juga akan bekerja..0*$
harus bekerja.0*
Cubix , 18
32byteSaya pikir saya harus meluangkan waktu untuk ini nanti dan melihat apakah saya bisa mengompresnya sedikit. Tapi untuk saat ini dia.Ternyata saya benar-benar salah memikirkan hal ini. Sekarang proses secara bertahap menerapkan mod (1,10.100.1000, ...) ke integer input dan mencetak yang pertama yang bukan nol. Sedikit lebih membosankan, tetapi lebih pendek.
Coba di sini
sumber
JavaScript, 21 byte
Uji kasus
Tampilkan cuplikan kode
sumber
Javascript
1918 byteBerkat produk ETH untuk bermain golf satu byte dan Patrick Roberts karena bermain golf dua byte
Mengembalikan array string yang cocok dengan regex berada di akhir string input dengan karakter apa pun diikuti dengan jumlah nol terbesar yang mungkin.
Cobalah secara Online
sumber
g
, karena hanya ada satu pertandingan yang cocok.x=>x.match`.0*$`
Bash + coreutils, 12
Cobalah online .
sumber
Grime , 5 byte
Cobalah online!
Penjelasan
sumber
Brachylog , 2 byte
Cobalah online!
Sufiks bawaan
a₁
, untuk bilangan bulat, diimplementasikan sebagai:Brachylog suka dapat memperlakukan bilangan bulat sebagai daftar digit, dan untuk itu ia menggunakan predikat utilitas khusus
integer_value/2
. Hal yang menarik diinteger_value/2
sini adalah karena harus dapat menerjemahkan dengan benar daftar digit dengan nol di depan, akhirnya juga bisa menerjemahkan bilangan bulat ke daftar digit dengan nol di depan, jadi predikat yang tidak ingin itu menerjemahkan terjadi (kebanyakan dari mereka, terutama yang tidak sepertia
) melarang kepala daftar digit mereka menjadi 0. Jadi, ketikaa₁
menghasilkan sufiks yang terpendek pertama untuk daftar dan string, ia melompati sufiks dari setiap bilangan bulat dari bilangan bulat dengan 0 yang memimpin, yang pada Selain menghapus duplikat, juga berarti bahwa sufiks pertama yang dihasilkan adalah digit bukan nol paling kanan dengan semua nol trailing.sumber
Brain-Flak , 74 byte
Cobalah online!
Hanya mencetak non-0 terakhir dan semua 0 di belakang.
Penjelasan:
sumber
Vim, 19 byte
Dua versi, keduanya 19 byte:
Ditambah carriage return di masing-masing.
Verifikasi semua uji kasus online! (Satu byte ditambahkan untuk menguji pada beberapa baris)
sumber
TI-Basic, 18 byte
sumber
R, 33 byte
Diimplementasikan sebagai fungsi yang tidak disebutkan namanya
Ini berlaku mod 10 ^ 0 hingga 10 ^ 99.
rle
digunakan untuk mengurangi hasil sehingga item kedua selalu hasil yang kita inginkan.Cobalah online!
sumber
Zsh ,
1816 byteCobalah online!Cobalah online!Bash , 25 byte
Cobalah online!
Shell perlu memanggil program eksternal untuk menggunakan regex, jadi kita harus puas dengan globbing.
The
${1%[^0]*}
ekspansi sesuai dengan akhiran terpendek dimulai dengan karakter nol, dan menghapusnya.(M)
bendera menyebabkan akhiran yang cocok disimpan dan bukannya dihapus.${1% }
ekspansi menghapus sebagai awalan apa pun yang tersisa.sumber
GNU sed ,
1714 +1 (r flag) = 15 byteSunting: 2 byte lebih sedikit berkat Riley
Ia bekerja dengan menghapus semuanya sampai digit paling kanan bukan nol, yang kemudian dicetak bersama dengan nol trailing yang ada. Script dapat menangani beberapa tes dalam satu kali, masing-masing pada baris terpisah.
Cobalah online! (semua contoh uji)
sumber
Mathematica, 26 byte
Fungsi murni yang mengambil daftar digit dan menampilkan daftar digit:
Penjelasan
Ini berfungsi karena menemukan kecocokan paling kiri untuk
x
, yang harus menjadi elemen bukan nol paling kanan dari daftar karena diikuti oleh urutan nol0
s lebih banyak dan kemudian akhir daftar.sumber
Java 8, 47 byte
ini adalah ekspresi lambda yang ditugaskan untuk
IntUnaryOperator
:PENJELASAN: kalikan m dengan 10 hingga
x%m
tidak 0.return x%m*m/10
memerlukan pembagian karena m adalah urutan besarnya lebih dari hasil yang diinginkan.sumber
Perl 6 , 10 byte
Solusi regex sepele. Input dan output angka.
sumber
MATL ,
107 byte3 byte disimpan berkat @B. Mehta!
Input dan output adalah array angka.
Cobalah online!
Atau verifikasi semua kasus uji .
Penjelasan
sumber
48-
seluruhnya, menghemat 3 byte: Coba online!C #,
3028 byteBerdasarkan jawaban JavaScript ini , jadi saya kira semua kredit agak jatuh ke dia.
Golf
()
sekitara
berkat Emignasumber
i
agar ini berfungsi saat Anda menggunakan rekursi.i
akan dideklarasikan untuk panggilan rekursif).a
tidak diperlukan juga.J, 27 byte
Itu didasarkan dari formula xnor, jadi kredit untuknya.
sumber
Kotlin, 49 byte
lambda, ditugaskan untuk
(List<Int>) -> List<Int>
it
diindexOfLast
..
untuk rentang bangunansumber
Perl 5, 12 byte
11, ditambah 1 untuk
-nE
bukan-e
sumber
05AB1E , 9 byte
Cobalah online! atau sebagai Test suite
Penjelasan
sumber
Japt , 6 byte
Cobalah online!
sumber
Stax , 5 byte
Jalankan dan debug itu
Prosedur:
sumber
05AB1E , 4 byte
I / O sebagai daftar angka.
Cobalah secara online atau verifikasi semua test case (test suite berisi gabungan untuk keterbacaan yang lebih baik).
Penjelasan:
sumber
Pyke,
131110 byteCoba di sini!
11 byte:
Coba di sini!
13 byte:
Coba di sini!
sumber
Haskell 57 Bytes
sumber