Anda berada di 8 hari beruntun!

82

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 aatau 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
Luke
sumber
31
Apakah ini didukung oleh Duolingo? Jika tidak, Anda harus meminta mereka membayar kami untuk meningkatkan bahasa di situs pembelajaran bahasa.
Arc676
10
Apakah 1100 (an) seribu seratus atau (a) seribu satu ratus ?
user3819867
11
Bilbo akan tidak setuju dengan beberapa kasus uji Anda. :)
Martin Ender
9
@Zaibis: "satu" di sini diucapkan seperti "wun", yang memiliki suara konsonan. Oleh karena itu, " seorang salah satu ribu seratus hari beruntun".
El'endia Starman
31
Mereka mungkin meninggalkan bug ini karena mereka pikir tidak ada yang akan mencapai 8 hari berturut-turut.
PNDA

Jawaban:

14

Pyth, 23 byte

<>n\8hz}hjsz^T3,hT18"an

Ini memilih berapa banyak huruf untuk memotong akhir "an"dengan memeriksa apakah huruf pertama bukan 8dan bahwa digit pertama dari angka ketika dianggap dalam basis 1000 bukan 11 atau 18. Boolean yang dihasilkan adalah jumlah karakter yang harus dipotong. tamat.

isaacg
sumber
3
Sangat kreatif. Juga menakutkan.
Hellreaver
29

Python 2, 60 byte

lambda n:'a'+'n'[:`n`[0]=='8'or`n`[:2]in len(`n`)%3/2*'118']

Fungsi anonim. Menambahkan njika:

  • Digit pertama adalah 8
  • Dua digit pertama adalah 11 atau 18, dan panjangnya adalah 2 modulo 3.
Tidak
sumber
Saya tahu ini adalah pertanyaan yang sangat lama, tapi saya pikir `` n> = '8' `` menyimpan tiga byte.
Lynn
@ Lynn bukankah itu mengacaukan sembilan?
xnor
Oh tentu! Saya tertipu oleh test suite :)
Lynn
12

GNU Sed, 32

Skor termasuk +1 untuk -Eopsi sed.

s/^8.*|^1[18](...)*$/an/
t
ca
:

Cobalah online.

  • Hapus grup yang terdiri dari 3 digit dari akhir setiap angka hingga hanya tersisa 1 hingga 3 digit
  • Cocokkan angka apa pun yang dimulai dengan 8 atau tepatnya 11 atau 18 dan ubah ke an
  • Ubah semua nomor lainnya menjadi a

Terima kasih kepada @ MartinBüttner untuk pendekatan retinanya yang menyelamatkan 10 byte.

Trauma Digital
sumber
11

Shell + bsd-games, 30

number -l|sed '/^e/{can
q};ca'

Masukan dibaca dari STDIN.

numbermengubah string desimal menjadi kata-kata. Maka masalah sederhana untuk memutuskan apakah hasilnya dimulai atau tidak e.

Trauma Digital
sumber
2
+1 untuk menggunakan bsd-games, saya tidak benar-benar berpikir mereka akan berguna :)
ASCIIThenANSI
@ASCIIThenANSI ya, bsd-game berguna di sana - sini :)
Digital Trauma
9

Retina , 27 byte

Ini tidak jauh berbeda dari jawaban Retina DigitalTrauma, tetapi mereka bersikeras saya memposting ini sendiri.

^8.*|^1[18](...)*$
an
\d+
a

Cobalah online.

Regex pertama menggantikan semua angka yang relevan dengan an, dan yang kedua menggantikan semua angka yang tersisa dengan a. Ini bekerja untuk byte yang sama:

^8.*|^1[18](...)*$
n
^\d*
a
Martin Ender
sumber
1
+1 ini hampir tingkat yang sama dari penyalahgunaan regex sebagai pengujian awal :)
cat
1
Dan hal baiknya adalah, Duolingo sebenarnya ditulis dalam Retina sehingga harus mudah untuk mengintegrasikan ini. Atau tunggu, bahasa apa itu?
lagi mengaktifkan counterclockw
1
@ceasedtoturncounterclockwisaya diberi tahu bahwa itu sebenarnya ditulis dalam Hexagony, tetapi mereka menulis sebuah transpiler Retina-to-Hexagony, jadi ini seharusnya tidak menjadi masalah.
Martin Ender
6

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.

const char*f(int i){int n=0,d=0;for(;i;(!(d++%3)&(i==18|i==11))|i==8?n=1:0,i/=10);return n?"an":"a";}
Luke
sumber
4

Mathematica, 53 byte

If[#~IntegerName~"Words"~StringStartsQ~"e","an","a"]&

Solusi menggunakan pemrosesan string sebenarnya akan menjadi lebih lama.

LegionMammal978
sumber
3

PostScript, 119 113 karakter

10 string cvs dup 0 get 56 eq exch dup length 3 mod 2 eq{0 2 getinterval dup(11)eq exch(18)eq or or}{pop}ifelse

Dengan kode uji:

/An
{
    10 string cvs dup 0 get 56 eq exch dup length 3 mod 2 eq{0 2 getinterval dup(11)eq exch(18)eq or or}{pop}ifelse
} def

/ShouldBeFalse [ 0 110 1111 1863 110000 180000 1141592 1897932 ] def
/ShouldBeTrue [ 8 11 18 84 843 8192 11000 18000 11234567 18675309 ] def

() = (ShouldBeFalse) = ShouldBeFalse {An =} forall
() = (ShouldBeTrue)  = ShouldBeTrue  {An =} forall
jdaw1
sumber
3

JavaScript (ES6) 70 61 46 38 byte

n=>/^8|^1[18](...)*$/.test(n)?'an':'a'

Komunitas wiki karena solusi saat ini sangat berbeda dengan yang asli saya. Terimakasih semuanya!

Demo: http://www.es6fiddle.net/iio40yep/

Scott Kaye
sumber
1
itu masuk akal. Terima kasih telah menjelaskan.
Daniel F
1
@Pavlo Sangat bagus, saya lupa tentang ekspresi tunggal setelah menemukan evaltriknya! Saya tahu harus ada ekspresi reguler yang lebih baik juga, tetapi saya tidak tahu apa yang lebih pendek. Terima kasih!
Scott
1
@Pavlo Sweet, diperbarui lagi! Belajar banyak, terima kasih banyak :)
Scott
2
URGH! Lupa mencukur 2 byte! Ini yang terakhir: n=>/^8|^(?=1[18])..(\d{3})*$/.test(n)?'an':'a'( es6fiddle.net/iiehl1ex ). Panjangnya 46 byte.
Ismael Miguel
2
@ScottKaye Kode ini sangat sederhana: Memeriksa apakah dimulai dengan 8, apakah dimulai dengan 1[18]dan apakah panjang angka 2 * (3n). Pada dasarnya, ini adalah seluruh kode Anda, tetapi dalam ekspresi reguler.
Ismael Miguel
2

Serius, 43 40 byte

9⌐9τk,;;$l3@\3*╤@\(íub)$#p'8=)XkΣ'n*'a+

Strategi 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:

9⌐9τk,;;$l3@\3*╤@\(íub)$#p'8=)XkΣ'n*'a+
9⌐9τk                                    push [11, 18]
     ,;;                                 push 3 copies of input (n)
        $l                               get length of n as string (effectively floor(log(n,10)))
          3@\3*╤                         get largest 10^(3n) less than the length
                @\                       get most significant digits of n (x)
                  (í                     bring list from back, push the index of x in the list or -1 if not in list
                    ub)                  increment by 1, convert to boolean, shove to bottom
                       $#p               push first digit from n (as string)
                          '8=            push 1 if "8" else 0
                             )X          shove to bottom of stack, discard remaining digits
                               kΣ'n*     push sum of stack, push a string containing that many "n"s
                                    'a+  push "a", concatenate
Mego
sumber
2

Perl 6 ,  31   30 byte

{'a'~'n'x?/^8|^1<[18]>[...]*$/} # 31 bytes
{<a an>[?/^8|^1<[18]>[...]*$/]} # 31 bytes
{<a an>[?/^8|^[11|18][...]*$/]} # 31 bytes

{'a'~'n'x?/^8|^1[1|8][...]*$/} # 30 bytes
{<a an>[?/^8|^1[1|8][...]*$/]} # 30 bytes

(Perl 6 kegunaan [ ]di regex untuk non-menangkap ( ), dan kegunaan <[ ]>untuk set karakter)

Pemakaian:

# store it in a lexical code variable for ease of use
my &code = {...}

my @a  = <0 110 1111 1863 110000 180000 1141592 1897932>;
my @an = <8 11 18 843 8192 11000 18000 11234567 18675309>;

say @a.map: &code;
say @an.map: &code;
(a a a a a a a a)
(an an an an an an an an an)
Brad Gilbert b2gills
sumber
2

PostScript, 109 byte

(a)exch 10 string cvs dup[exch length 3 mod 2 eq{(11)(18)}if(8)]{anchorsearch{pop pop(an)exch}if}forall pop =

Kode memverifikasi apakah nomor dimulai dengan awalan tertentu. Awalan 8selalu dicentang ( delapan , delapan puluh sesuatu , delapan ratusan dan ), tetapi 11dan 18( sebelas dan delapan belas ) diperiksa hanya ketika jumlah digit adalah kelipatan dari 3 ditambah 2.

Kami mulai dengan hasil sementara adan ketika awalan ditemukan hasilnya diganti dengan an. anchorsearchdigunakan untuk menghindari penggalian awalan dari string. Bahkan jika kecocokan ditemukan, kami terus memverifikasi sisa awalan - mengapa membuang 5 byte untuk  exit? -, tetapi karena string asli diganti dengan akami yakin tidak akan mendapatkan positif palsu.

Untuk mengembalikan a-atau- anhasil pada tumpukan operan alih-alih mencetaknya, hapus trailing  =(panjang yang dihasilkan: 107 byte).

Kode uji:

/DO {
    ... the code above ...
} def

(Should be "a"s:)  = {0 110 1111 1863 110000 180000 1141592 1897932}     { DO } forall
(Should be "an"s:) = {8 11 18 84 843 8192 11000 18000 11234567 18675309} { DO } forall
flush
melorot
sumber
2

PostScript (dengan token biner), 63 byte

(a)’>10’¥’1’8[’>’b3’j2’={(11)(18)}if(8)]{’${’u’u(an)’>}if}’I’u=

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:

  • Dalam kasus umum, implementasi yang meminimalkan kode ASCII tidak harus sama dengan yang meminimalkan versi biner. Beberapa potongan kode PostScript ASCII yang lebih panjang dapat mengkompres lebih baik daripada yang lain dan versi biner yang terkait menjadi lebih pendek.
  • Kode biner tidak cocok di mana-mana, jadi jawaban ASCII murni mungkin lebih disukai bahkan jika lebih lama.
  • Tidaklah adil untuk membandingkan panjang jawaban PostScript ASCII murni dengan yang menggunakan pengkodean biner.
melorot
sumber
1

Python 3, 110 93 91 76 74 70 65 64 byte

Ini 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 .

n=input();print("a"+"n"*(len(n)%3>1and n[:2]in"118"or"8"==n[0]))

atau untuk jumlah byte yang sama.

n=input();print("a"+"n"[:len(n)%3>1and n[:2]in"118"or"8"==n[0]])

Tidak Terkumpul:

def a():
    n=input()
    if "8"==n[:1]:
        a = "n"
    elif len(n)%3 == 2 and (n[:2] in ["11", "18"]):
        a = "n"
    else:
        a = ""
    return "a"+a
Sherlock9
sumber
Ini salah pada input 843, "delapan ratus empat puluh tiga", yang seharusnya an.
isaacg
@isaacg Tidak hanya Anda benar, tetapi ini sangat menyederhanakan kode saya. Terima kasih! Ternyata saya hanya melihat delapan, delapan ribu, delapan juta, sementara mengabaikan kasus seperti delapan puluh delapan ratus.
Sherlock9
Kenapa (-~len(n)%3)<1bukannya len(n)%3==2?
Timwi
Bisa (n[:2]=="11"or n[:2]=="18")disingkat menjadi "118".contains(n[:2])?
Timwi
Atau bahkan n[:2]in"118"?
Timwi
1

Java 10, 102 byte

n->{var N=n+"";return(n>9&&"118".contains(N.substring(0,2))&N.length()%3>1)|N.charAt(0)==56?"an":"a";}

Cobalah online.

Penjelasan:

n->{                  // Method with integer parameter and String return-type
  var N=n+"";         //  Input integer as String
  return(n>9&&        //  If the input has at least two digits,
    "118".contains(N.substring(0,2))
                      //  and the first two digits are "11" or "18",
    &N.length()%3>1)  //  and the length modulo-3 is 2
   |N.charAt(0)==56?  //  Or if the first digit is an '8':
     "an"             //   Return "an"
   :                  //  Else:
     "a";}            //   Return "a"
Kevin Cruijssen
sumber
1

Japt , 28 27 byte

'a+'npUì v ¥8ª[B18]d¥UìA³ v

Cobalah online!

Dibongkar & Cara kerjanya

'a+'npUì v ==8||[B18]d==UìAp3  v

'a+'np  "a" + "n".repeat(...)
Uì v ==8    First digit in decimal == 8
||          or...
[B18]d      [11,18].some(...)
==UìAp3  v  == First digit in base 10**3
Bubbler
sumber
Anda dapat menggantinya 1e3dengan
Oliver
1

GNU sed -r+ BSD number, 34 byte

s/(e?).*/number &/e
s//a\1/
y/e/n/

Pertama kita mengonversi ke nomor bahasa Inggris. Kemudian hapus semuanya kecuali kemungkinan awal e, dan awali dengan a. Kemudian konversikan e(jika ada) ke n. Satu-satunya trik golf adalah mencocokkan opsi edi substitusi pertama, sehingga kita dapat menggunakan kembali pola di baris berikut.

Demo

for i in 0 8 11 18 84 110 843 1111 1863 8192 \
    11000 18000 110000 180000 1141592 1897932 11234567 18675309
do printf "%'10d → %s\n" $i $(./66841.sed <<<$i)
done
         0 → a
         8 → an
        11 → an
        18 → an
        84 → an
       110 → a
       843 → an
     1,111 → a
     1,863 → a
     8,192 → an
    11,000 → an
    18,000 → an
   110,000 → a
   180,000 → a
 1,141,592 → a
 1,897,932 → a
11,234,567 → an
18,675,309 → an
Toby Speight
sumber
0

TeaScript , 35 byte

[18,11,8,80]I(+xh(x.n%3¶3©?'an':'a'

Coba di sini.

Penjelasan

               xh(x.n%3¶3           get the relevant digits from the input
                                    xh compiles to x.head which returns the
                                    first n chars of x (implicit input)
                                    ¶ ('\xb6') compiles to ||
              +                     cast the result to an integer since
                                    .includes does a strict comparison
                         ©          ('\xa9') compiles to ))
[18,11,8,80]                        array of the special cases
            I(                      I( is an alias for .includes( which
                                    returns true if the array contains the
                                    argument
                          ?'an':'a' finally, return 'an' if the array
                                    contains the number, 'a' otherwise
Dom Hastings
sumber
0

Python 2.7, 66

s=`input()`
print['a','an'][s[:1]=='8'or s[:2]in len(s)%3/2*'118']

Jelas tidak sesingkat yang lambdaada.

janrn
sumber
0

05AB1E , 26 byte

g3%ô¬D11Qs18Q+I1£8Q+>„ans∍

Mungkin bisa bermain golf sedikit lebih, tetapi ini bekerja.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

g3%                  # Length of the input, modulo-3
                     #  11234567 → 8 → 2
                     #  110000 → 6 → 0
   ô                 # Split the input into chunks of that size
                     #  11234567 and 2 → ['11', '23', '45', '67']
                     #  110000 and 0 → ['110000']
    ¬                # Take the Head (first element)
                     #  ['11', '23', '45', '67'] → '11'
                     #  ['110000'] → '110000'
     D11Q            # Does it equal 11?
                     #  '11' and 11 → 1
                     #  '110000' and 11 → 0
     s18Q            # Or does it equal 18?
                     #  '11' and 18 → 0
                     #  '110000' and 18 → 0
         +           # Add them together (if it was either 11 or 18, this becomes 1)
                     #  1 and 0 → 1
                     #  0 and 0 → 0
I1£                  # Get the first character of the input
                     #  11234567 → '1'
                     #  110000 → '1'
   8Q                # Does it equal 8?
                     #  '1' and 8 → 0
          +          # Add them together
                     #  1 and 0 → 1
                     #  0 and 0 → 0
           >         # Increase it by 1
                     #  1 → 2
                     #  0 → 1
            „ans∍    # Push "an", and shorten it to a size equal to the result above
                     #  "an" and 2 → "an"
                     #  "an" and 1 → "a"
Kevin Cruijssen
sumber
0

QuadS , 32 byte

'a',⍵
^8.*|^1[18](...)*$
⊃⍵L/'n'

Cobalah online!

Uriel
sumber
0

Stax , 25 byte

â-x▬♪°∞▄'δL|÷æ╪║>₧4¢ÿ·7åR

Jalankan dan debug itu

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

Vk|Eh       get the first "digit" after converting to base 1000
AJ|Eh       get the first "digit" after converting to base 100
c20>9*^/    if the result is greater than 20, divide it by 10 again
"AMj"!#     is the result one of [8, 11, 18]?
^           increment by 1
.an(        keep that many characters of the string "an"

Jalankan yang ini

rekursif
sumber
0

Ruang putih , 243 byte

[S S S T    T   S S S S T   N
_Push_97_a][T   N
S S _Print_as_character][S S S T    N
_Push_1][S N
S _Duplicate_1][S N
S _Duplicate_1][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][N
S S S T N
_Create_Label_LOOP][S N
T   _Swap_top_two][S S S T  N
_Push_1][T  S S S _Add][S N
T   _Swap_top_two][S N
S _Duplicate][S S S T   T   S S T   S S N
_Push_100][T    S S T   _Subtract][N
T   T   T   N
_If_negative_jump_to_Label_TWO_DIGITS][S S S T  S ST    S N
_Push_10][T S T S _Integer_division][N
S N
S T N
_Jump_to_Label_LOOP][N
S S T   N
_Create_Label_TWO_DIGITS][S N
S _Duplicate][S S S T   S S S N
_Push_8][T  S S T   _Subtract][N
T   S S S N
_If_zero_jump_to_Label_PRINT_n][S N
S _Duplicate][S S S T   S T T   N
_Push_11][T S S T   _Subtract][N
T   S S N
_If_0_jump_to_Label_2_MOD_3][S N
S _Duplicate][S S S T   S S T   S N
_Push_18][T S S T   _Subtract][N
T   S S N
_If_0_jump_to_Label_2_MOD_3][S S S T    S ST    S N
_Push_10][T S T S _Integer_division][S N
S _Duplicate][N
T   S N
_If_0_jump_to_Label_EXIT][N
S N
T   N
_Jump_to_Label_TWO_DIGITS][N
S S S N
_Create_Label_2_MOD_3][S N
T   _Swap_top_two][S S S T  T   N
_Push_3][T  S T T   _Modulo][S S S T    S M
_Push_2][T  S S T   _Subtract][N
T   T   N
_If_negative_jump_to_Label_EXIT][N
S S S S N
_Create_Label_PRINT_n][S S S T  T   S T T   T   S N
_Push_110_n][T  N
S S _Print_as_character][N
S S N
_Create_Label_EXIT]

Huruf S(spasi), T(tab), dan N(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:

Print "a"
Integer input = STDIN as integer
Integer counter = 1
Start LOOP:
  counter = counter + 1
  If(input < 100)
    Jump to function TWO_DIGITS
  input = input integer-divided by 10
  Go to next iteration of LOOP

function TWO_DIGITS:
  If(input == 8)
    Jump to function PRINT_n
  If(input == 11 or input == 18)
    Jump to function 2_MOD_3
  input = input integer-divided by 10
  If(input == 0)
    Exit program
  Recursive call to TWO_DIGITS

function 2_MOD_3:
  If(counter modulo-3 != 2)
    Exit program
  Jump to function PRINT_n

function PRINT_n:
  Print "n"
  Exit program
Kevin Cruijssen
sumber
0

C ++, 80 79 byte

[](int i){for(;i>999;i/=1e3);return i-11&&i-18&&i/100-8&&i/10-8&&i-8?"a":"an";}

Ternyata 4 byte lebih pendek untuk secara eksplisit menguji 8xx dan 8x daripada memiliki /=10loop lain , seperti ini:

[](int i){for(;i>999;i/=1e3);for(i==11|i==18?i=8:0;i>9;i/=10);return i-8?"a":"an";}

Demo

#include <locale>
#include <cstdio>
int main(int argc, char**argv)
{
    auto const f =
        [](int i){for(;i>999;i/=1e3);return i-11&&i-18&&i/100-8&&i/10-8&&i-8?"a":"an";}
    ;

    std::locale::global(std::locale{""});
    for (int i = 1;  i < argc;  ++i) {
        auto const n = std::stoi(argv[i]);
        printf("%'10d → %s\n", n, f(n));
    }
}
         0 → a
         8 → an
        11 → an
        18 → an
        84 → an
       110 → a
       843 → an
     1,111 → a
     1,863 → a
     8,192 → an
    11,000 → an
    18,000 → an
   110,000 → a
   180,000 → a
 1,141,592 → a
 1,897,932 → a
11,234,567 → an
18,675,309 → an
Toby Speight
sumber
Aku tidak tahu C ++ terlalu baik, tapi bisa i/=1000menjadi i/=1e3, dan semua bisa &&menjadi &?
Kevin Cruijssen
Tampaknya memang berhasil: Coba online.
Kevin Cruijssen
1
@ Kevin - saya lakukan pada satu titik memiliki 1e3 di sana; Saya mengubahnya selama debugging dan lupa untuk mengubahnya kembali. Tidak &&semua bisa &, karena pengurangan menghasilkan bilangan bulat dan bukan boolean - misalnya 19-118, dan 19-181; lihat itu 8 && 1benar, tetapi 8 & 1itu salah. Kita bisa menggunakan &tapi kami perlu mengubah -untuk !=dan juga menambahkan tanda kurung.
Toby Speight
Ah tentu saja .. &memang tidak bekerja di sini, salahku. Btw, mengapa Anda tidak menambahkan tautan TIO ke jawaban Anda juga?
Kevin Cruijssen
-1

Perl, 71 55 49 byte

$_=<>;$_=/^8/||/^1[18]/&&length%3==1?'an':'a';say

Saya 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.
    • Jika itu benar, $_diatur ke an. Kalau tidak, ini diatur ke a.
  • Ini kemudian mencetak konten $_(baik aatau an) dengan say.

Perubahan

  • Disimpan 16 byte berkat msh210.
  • Disimpan 6 byte dengan menghapus parens dan menggunakan default.
ASCIIThenANSI
sumber
$_=<>;$_=(/^8/)||/^1[18]/&&length($_)%3==1?'an':'a';saymenghemat beberapa byte. (Meskipun jumlah untuk membandingkannya tergantung pada apa karakter baris baru Anda, tetapi itu tidak mengubah jumlah byte.)
msh210
@ msh210 Sepertinya itu hanya 55 byte yang berarti menghemat 16 byte. Saya akan menambahkannya. Terima kasih!
ASCIIThenANSI
Sama-sama. Oh, dan Anda dapat menghapus parens pertama (saya berasumsi. Saya belum menguji). Saya pikir Anda juga bisa berubah length($_)menjadi length(atau setidaknya membatalkan parens) tetapi itu tidak berhasil untuk saya karena suatu alasan.
msh210
@ msh210 Ya, Anda dapat melepaskan parens dan ($_)mendapatkan $_=<>;$_=/^8/||/^1[18]/&&length%3==1?'an':'a';say, yang hanya 49 byte.
ASCIIThenANSI
Anda dapat menyimpan beberapa byte dengan menggunakan -palih-alih $_=<>dan say, y///calih-alih length, dan menjatuhkan tanda kutip di sekitar adan an: 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==2diuraikan sebagai length(%3)==2, bukan sebagai length($_)%3==2, sehingga selalu mengembalikan false.
ThisSuitIsBlackNot
-1

Pyth, 29 31

?:_ec_z3"(^18$|^11$|^8)"0"an"\a

Balikkan string, pisahkan menjadi tiga bagian, balikkan lagi, lalu pilih akhir yang sesuai.

Moose
sumber
5
Ini salah pada input 111- ini memberikanan
isaacg
Kamu benar. Tetap.
Moose