Duolingo, aplikasi pembelajaran bahasa, memiliki banyak hal untuk itu, tetapi ada satu masalah besar yang membuat saya gila. Ini memberitahu saya berapa hari berturut-turut saya telah menggunakan aplikasi dengan pesan seperti Anda dalam 7 hari berturut-turut! Mengesampingkan tanda hubung dan apakah nomor harus dijabarkan, ini berfungsi dengan baik untuk sebagian besar angka, tetapi tidak dapat disangkal salah ketika dikatakan Anda sedang dalam 8 hari berturut-turut! Saya tidak menggunakannya untuk belajar bahasa Inggris tetapi ini masih merupakan perilaku yang tidak menguntungkan untuk aplikasi bahasa.
Anda akan membantu tim Duolingo dengan menulis program atau fungsi lengkap yang menentukan apakah angka yang diberikan harus diawali dengan a atau a . Sejumlah didahului oleh suatu jika pengucapan dalam bahasa Inggris lisan dimulai dengan suara konsonan atau semivokal , dan didahului oleh sebuah jika pengucapannya dimulai dengan suara vokal. Jadi satu-satunya angka yang didahului oleh a adalah mereka yang pengucapannya dimulai dengan delapan , sebelas , delapan belas , atau delapan puluh .
Agaknya tim dev Duolingo meninggalkan bug ini karena mereka kehabisan ruang untuk lebih banyak kode sumber di aplikasi, jadi Anda perlu membuat kode ini sesingkat mungkin dengan harapan mereka dapat memerasnya.
Kode Anda harus mengambil bilangan bulat dari 0 hingga 2.147.483.647 dan menghasilkan a
atau an
. Baris baru tambahan adalah opsional. Untuk keperluan tantangan ini, tahun 1863 dibaca sebagai seribu delapan ratus enam puluh tiga , bukan delapan belas ratus enam puluh tiga .
Kasus uji:
0 → a
8 → an
11 → an
18 → an
84 → an
110 → a
843 → an
1111 → a
1863 → a
8192 → an
11000 → an
18000 → an
110000 → a
180000 → a
1141592 → a
1897932 → a
11234567 → an
18675309 → an
Jawaban:
Pyth, 23 byte
Ini memilih berapa banyak huruf untuk memotong akhir
"an"
dengan memeriksa apakah huruf pertama bukan8
dan bahwa digit pertama dari angka ketika dianggap dalam basis 1000 bukan 11 atau 18. Boolean yang dihasilkan adalah jumlah karakter yang harus dipotong. tamat.sumber
Python 2, 60 byte
Fungsi anonim. Menambahkan
n
jika:sumber
n
> = '8' `` menyimpan tiga byte.GNU Sed, 32
Skor termasuk +1 untuk
-E
opsi sed.Cobalah online.
an
a
Terima kasih kepada @ MartinBüttner untuk pendekatan retinanya yang menyelamatkan 10 byte.
sumber
Shell + bsd-games, 30
Masukan dibaca dari STDIN.
number
mengubah string desimal menjadi kata-kata. Maka masalah sederhana untuk memutuskan apakah hasilnya dimulai atau tidake
.sumber
Retina , 27 byte
Ini tidak jauh berbeda dari jawaban Retina DigitalTrauma, tetapi mereka bersikeras saya memposting ini sendiri.
Cobalah online.
Regex pertama menggantikan semua angka yang relevan dengan
an
, dan yang kedua menggantikan semua angka yang tersisa dengana
. Ini bekerja untuk byte yang sama:sumber
C ++, 101
Ini adalah tantangan saya, jadi ini tidak dimaksudkan untuk menjadi jawaban yang kompetitif. Hanya ingin melihat betapa singkatnya saya bisa mendapatkannya di C ++. Operasi string terlalu bertele-tele sehingga ini dilakukan dengan matematika. Saya merasa harus ada cara untuk memperkecil kondisi itu, tetapi saya tidak bisa mengatasinya.
sumber
Mathematica, 53 byte
Solusi menggunakan pemrosesan string sebenarnya akan menjadi lebih lama.
sumber
PostScript,
119113 karakterDengan kode uji:
sumber
JavaScript (ES6)
70614638 byteKomunitas wiki karena solusi saat ini sangat berbeda dengan yang asli saya. Terimakasih semuanya!
Demo: http://www.es6fiddle.net/iio40yep/
sumber
eval
triknya! Saya tahu harus ada ekspresi reguler yang lebih baik juga, tetapi saya tidak tahu apa yang lebih pendek. Terima kasih!n=>/^8|^(?=1[18])..(\d{3})*$/.test(n)?'an':'a'
( es6fiddle.net/iiehl1ex ). Panjangnya 46 byte.8
, apakah dimulai dengan1[18]
dan apakah panjang angka2 * (3n)
. Pada dasarnya, ini adalah seluruh kode Anda, tetapi dalam ekspresi reguler.Serius,
4340 byteStrategi di sini adalah hanya melihat angka 1, 2, atau 3 paling signifikan, dengan integer-membagi input dengan nilai terbesar
10^(3n)
yang kurang dari input.Cobalah online
Penjelasan:
sumber
Retina , 34
Terjemahan langsung dari jawaban sed saya :
Cobalah online.
Satu byte disimpan berkat @Timwi.
sumber
Perl 6 ,
3130 byte(Perl 6 kegunaan
[ ]
di regex untuk non-menangkap( )
, dan kegunaan<[ ]>
untuk set karakter)Pemakaian:
sumber
PostScript, 109 byte
Kode memverifikasi apakah nomor dimulai dengan awalan tertentu. Awalan
8
selalu dicentang ( delapan , delapan puluh sesuatu , delapan ratusan dan ), tetapi11
dan18
( sebelas dan delapan belas ) diperiksa hanya ketika jumlah digit adalah kelipatan dari 3 ditambah 2.Kami mulai dengan hasil sementara
a
dan ketika awalan ditemukan hasilnya diganti denganan
.anchorsearch
digunakan untuk menghindari penggalian awalan dari string. Bahkan jika kecocokan ditemukan, kami terus memverifikasi sisa awalan - mengapa membuang 5 byte untukexit
? -, tetapi karena string asli diganti dengana
kami yakin tidak akan mendapatkan positif palsu.Untuk mengembalikan
a
-atau-an
hasil pada tumpukan operan alih-alih mencetaknya, hapus trailing=
(panjang yang dihasilkan: 107 byte).Kode uji:
sumber
PostScript (dengan token biner), 63 byte
The
’
adalah byte dengan nilai 146 (desimal),¥
adalah 165 dan$
merupakan 3. Semua orang lain yang dicetak 7-bit karakter ASCII.Ini sama dengan versi PostScript [ASCII murni] saya, tetapi menggunakan token biner di mana ini membantu mengurangi panjang total. Saya mempostingnya secara terpisah karena 3 alasan:
sumber
Python 3,
11093917674706564 byteIni yang panjang, tapi yang sederhana.
Sunting: Dikoreksi dengan terima kasih kepada isaacg . Menyimpan beberapa ruang kosong setelah perbandingan. Banyak byte yang disimpan berkat Timwi , Mego , benpop dan Alissa .
atau untuk jumlah byte yang sama.
Tidak Terkumpul:
sumber
843
, "delapan ratus empat puluh tiga", yang seharusnyaan
.(-~len(n)%3)<1
bukannyalen(n)%3==2
?(n[:2]=="11"or n[:2]=="18")
disingkat menjadi"118".contains(n[:2])
?n[:2]in"118"
?Java 10, 102 byte
Cobalah online.
Penjelasan:
sumber
Japt ,
2827 byteCobalah online!
Dibongkar & Cara kerjanya
sumber
1e3
denganA³
GNU
sed -r
+ BSDnumber
, 34 bytePertama kita mengonversi ke nomor bahasa Inggris. Kemudian hapus semuanya kecuali kemungkinan awal
e
, dan awali dengana
. Kemudian konversikane
(jika ada) ken
. Satu-satunya trik golf adalah mencocokkan opsie
di substitusi pertama, sehingga kita dapat menggunakan kembali pola di baris berikut.Demo
sumber
TeaScript , 35 byte
Coba di sini.
Penjelasan
sumber
Python 2.7, 66
Jelas tidak sesingkat yang
lambda
ada.sumber
05AB1E , 26 byte
Mungkin bisa bermain golf sedikit lebih, tetapi ini bekerja.
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
QuadS , 32 byte
Cobalah online!
sumber
Stax , 25 byte
Jalankan dan debug itu
Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.
Jalankan yang ini
sumber
Ruang putih , 243 byte
Huruf
S
(spasi),T
(tab), danN
(baris baru) ditambahkan hanya sebagai penyorotan.[..._some_action]
ditambahkan sebagai penjelasan saja.Cobalah online (dengan spasi, tab, dan baris baru saja).
Program berhenti dengan kesalahan: Tidak ditemukan jalan keluar.
Penjelasan dalam pseudo-code:
sumber
C ++,
8079 byteTernyata 4 byte lebih pendek untuk secara eksplisit menguji 8xx dan 8x daripada memiliki
/=10
loop lain , seperti ini:Demo
sumber
i/=1000
menjadii/=1e3
, dan semua bisa&&
menjadi&
?&&
semua bisa&
, karena pengurangan menghasilkan bilangan bulat dan bukan boolean - misalnya19-11
8, dan19-18
1; lihat itu8 && 1
benar, tetapi8 & 1
itu salah. Kita bisa menggunakan&
tapi kami perlu mengubah-
untuk!=
dan juga menambahkan tanda kurung.&
memang tidak bekerja di sini, salahku. Btw, mengapa Anda tidak menambahkan tautan TIO ke jawaban Anda juga?Perl 5
-p
, 26 byteCobalah online!
sumber
Perl,
715549 byteSaya tahu operator ternary akan membantu suatu hari ...
Biarkan saya memecah ini.
$_=<>
menerima nomor sebagai masukan.$_=...
Blok besar akan menetapkan nilai$_
setelah digunakan....?...:...
adalah operator ternary. Jika kondisi (argumen pertama) benar, ia mengembalikan argumen kedua. Kalau tidak, ia mengembalikan yang ketiga./^8/||(/^1[18]/&&length%3==2)
memeriksa untuk melihat apakah nomor dimulai dengan 8 atau dimulai dengan 11 atau 18 (1[18]
menerima salah satu) dan memiliki panjang mod 3 dari 2.$_
diatur kean
. Kalau tidak, ini diatur kea
.$_
(baika
atauan
) dengansay
.Perubahan
sumber
$_=<>;$_=(/^8/)||/^1[18]/&&length($_)%3==1?'an':'a';say
menghemat beberapa byte. (Meskipun jumlah untuk membandingkannya tergantung pada apa karakter baris baru Anda, tetapi itu tidak mengubah jumlah byte.)length($_)
menjadilength
(atau setidaknya membatalkan parens) tetapi itu tidak berhasil untuk saya karena suatu alasan.($_)
mendapatkan$_=<>;$_=/^8/||/^1[18]/&&length%3==1?'an':'a';say
, yang hanya 49 byte.-p
alih-alih$_=<>
dansay
,y///c
alih-alihlength
, dan menjatuhkan tanda kutip di sekitara
danan
:perl -pe'$_=/^8/||/^1[18]/&&y///c%3==2?an:a'
(34 byte + 1 untuk-p
). Perhatikan bahwa masukan tidak bisa diakhiri dengan baris baru:echo -n 11 | perl -pe'...'
. Ini juga memperbaiki bug:length%3==2
diuraikan sebagailength(%3)==2
, bukan sebagailength($_)%3==2
, sehingga selalu mengembalikan false.Pyth,
2931Balikkan string, pisahkan menjadi tiga bagian, balikkan lagi, lalu pilih akhir yang sesuai.
sumber
111
- ini memberikanan