Plat nomor Prancis

41

Bak pasir

Pelat Lisensi Perancis

Plat nomor Prancis berurutan, mengikuti pola angka dan huruf tertentu:AB-012-CD

Tantangan

Tulis program atau fungsi yang, untuk nomor yang diberikan, menampilkan nomor plat Perancis yang sesuai . Program Anda tidak boleh menangani kasus khusus apa pun sebagaimana ditentukan dalam halaman tertaut. Seharusnya dapat menghasilkan 26*26*1000*26*26 => 456 976 000piring yang mungkin, atau sejauh bahasa Anda dapat mendukung.

Sistem penomoran berjalan sebagai berikut:

  • AA-000-AA ke AA-999-AA (angka berevolusi lebih dulu);
  • AA-000-AB ke AA-999-AZ (lalu huruf terakhir di sebelah kanan);
  • AA-000-BA ke AA-999-ZZ (kemudian huruf pertama di sebelah kanan);
  • AB-000-AA ke AZ-999-ZZ (lalu huruf terakhir di sebelah kiri);
  • BA-000-AA hingga ZZ-999-ZZ (lalu huruf pertama di sebelah kiri).

Memasukkan

  • Indeks nomor pelat sebagai bilangan bulat

Keluaran

  • Nomor plat Perancis yang sesuai

Informasi tambahan

  • Huruf harus huruf besar
  • Anda dapat menggunakan pengindeksan berbasis-0 dan berbasis-1 untuk menghasilkan lempeng-lempeng (artinya AA-000-AA dapat sesuai dengan 0atau 1, dengan asumsi semua test case lainnya menggunakan pengindeksan yang sama.

Ini adalah kode-golf , jawaban terpendek dalam setiap bahasa menang!

Uji kasus (pengindeksan berbasis 0)

          0 -> AA-000-AA
          1 -> AA-001-AA
        999 -> AA-999-AA
       1000 -> AA-000-AB
    675 999 -> AA-999-ZZ
    676 000 -> AB-000-AA
456 975 999 -> ZZ-999-ZZ
Elcan
sumber
2
Berikut adalah beberapa persyaratan lagi, langsung dari Wikipedia, jika Anda ingin membuat variasi yang lebih sulit: "Angka ini tidak termasuk tiga huruf yang tidak digunakan: I, O dan U, karena dapat dikacaukan dengan masing-masing 1, 0 dan V. Itu juga mengecualikan kombinasi SS karena mengingatkan pada organisasi Nazi dan WW dalam kelompok huruf pertama karena menunjukkan plat sementara. "
Eric Duminil
4
@EricDuminil Saya sengaja mengecualikannya karena itu hanya menambah kendala pada tantangan. Tapi itu benar itu bisa menarik untuk dilakukan, tetapi bahkan dengan "poin bonus", saya ragu itu akan layak untuk menerapkan aturan-aturan ini
Elcan

Jawaban:

17

Bash Murni (tanpa utilitas eksternal), 64

  • 2 byte disimpan berkat @NahuelFouilleul
x={A..Z}
eval f=($x$x-%03d-$x$x)
printf ${f[$1/1000]} $[$1%1000]

Cobalah online! - Dibutuhkan sekitar 10 detik untuk menjalankan 7 testcases.

  • Baris # 1 adalah penugasan sederhana string ke variabel
  • Baris # 2 adalah perluasan penjepit untuk membangun array string format printf, satu untuk semua 456.976 kemungkinan kombinasi huruf, dengan digit yang belum ditentukan. The evaldiperlukan untuk memastikan ekspansi variabel (x) terjadi sebelum ekspansi brace.
  • Baris # 3 mengindeks array untuk mendapatkan format string yang sesuai dan mengambil bagian digit sebagai parameternya.
Trauma Digital
sumber
1
-2bytes
Nahuel Fouilleul
13

Perl 5 (-ap), 47 byte

$_=AAAA000;$_++while$F[0]--;s/(..)(\d+)/-$2-$1/

Cobalah online!


PHP , 74 byte

for($a=AAAA000;$argn--;$a++);echo preg_replace('/(..)(\d+)/','-$2-$1',$a);

Cobalah online!

Grimmy
sumber
2
+1 untuk PHP, saya tahu kami bisa menambah huruf dalam PHP, tapi saya tidak tahu bahwa kami bisa menambah kombinasi huruf dan angka. PHP membuat saya takjub setiap hari! Dan terima kasih saya belajar sesuatu yang baru.
Night2
8

Python 3 , 79 78 77 byte

lambda n:f"%c%c-{n%1000:03}-%c%c"%(*(65+n//1000//26**i%26for i in[3,2,1,0]),)

Cobalah online!

Aku entah bagaimana tidak pernah menyadari bahwa f"string"format shortcut ada sampai melihat jawaban Black Owl Kai.

Matthew Jensen
sumber
78 byte dengan mengganti tupleoleh(*...,)
Black Owl Kai
Menggunakan f"string"membuat jawaban Anda Python 3.6+ eksklusif, hanya agar Anda sadar. Kerja bagus!
connectyourcharger
8

Ruby, 61 59 55 byte

->n{s='AA-AA000-';eval's.succ!;'*n;s[2]+=s[5,4];s[0,9]}

Juga 55 byte:

->n{s='AA-AA000-';eval's.succ!;'*n;s[2]+=s.slice!5,4;s}

Cobalah online!

Ini menginisialisasi penghitung ke AA-AA000-, menambah nwaktu (dengan mengalikan string kode yang melakukannya dengan n dan evaling), dan kemudian memindahkan 4 karakter terakhir setelah 3.

Gagang pintu
sumber
->n{s=('AA-AA000-'..?Z*9).step.take(n)[-1];s[2]+=s.slice!5,4;s}lebih panjang tapi saya ingin tahu apakah mungkin untuk mempersingkat.
Eric Duminil
Secara teori, ->n{s=[*'AA-AA000-'..?Z*9][n];s[2]+=s.slice!5,4;s}harus bekerja dan panjangnya hanya 50 byte, tetapi menghasilkan setiap lempeng yang mungkin terlebih dahulu. : - /
Eric Duminil
1
"s + = s.slice! 3,2" untuk 50 byte
GB
Maka ini juga harus bekerja: 45 byte
GB
7

PHP , 96 84 79 byte

-5 byte terima kasih atas komentar Ismael Miguel yang luar biasa.

for($s=AAAA;$x++^$argn/1e3;)$s++;printf('%.2s-%03u-'.$s[2].$s[3],$s,$argn%1e3);

Cobalah online!

Saya memanfaatkan fakta bahwa Anda dapat menambahkan huruf dalam PHP! Jadi AAAA++akan menjadi AAABdan AAAZ++akan menjadi AABA. Saya menghitung berapa kali huruf harus bertambah dengan mendapatkan bagian bilangan bulat dari input/1000. Kemudian menambah panjang empat karakter yang berkali-kali dan dua karakter pertama dan terakhir terakhir akan secara otomatis menjadi sisi kiri dan kanan plat.

Misalnya untuk input 675999jumlah kenaikan huruf adalah (int)(675999 / 1000) = 675, jadi AAAAakan menjadi AAZZ.

Akhirnya, angka tengah dihitung oleh input%1000dan semuanya dicetak dalam format yang ditentukan dengan bantuan printf . %.2smencetak dua karakter pertama dari string, %03umengisi angka di sebelah kiri dengan 3 nol.

Night2
sumber
2
@ Elcan Maaf, perbaiki masalah dengan biaya 12 byte. Saya punya alasan untuk diserang oleh tiga kucing, untuk mengacaukan saya: P
Night2
1
Alih-alih %0.2sAnda bisa menulis %.2s. Itu menghemat 1 byte. (Sebagai tip kecil: jika Anda ingin menampilkan angka desimal dengan jumlah tempat desimal tertentu, Anda dapat melakukan %.2f(atau pengubah lainnya) karena bekerja dengan cara yang sama)
Ismael Miguel
1
@ IsmaelMiguel Terima kasih, tidak tahu kami bisa membatalkannya 0. Sunting: melihat dokumentasi, sepertinya saya bahkan tidak membutuhkannya di tempat pertama: P
Night2
1
Oh, ya, Anda bisa menjatuhkannya. Selain itu, Anda dapat melakukan $x++^$argn/1e3alih - alih $x++<(0^$argn/1e3)dan Anda harus menyimpan 4 byte. Ini akan berulang sampai ($x++^$argn/1e3) === 0, dan 0kapan $xdan bilangan integer yang$argn/1e3 sama (menggunakan akan melemparkan angka ke bilangan bulat). Anda dapat mencoba ini di sandbox.onlinephpfunctions.com/code/…^
Ismael Miguel
1
@ IsmaelMiguel Terima kasih lagi, ide yang sangat pintar. Anda membuat jawaban ini lebih pendek dari JS dan itu adalah pencapaian: P
Night2
7

C, 88 86 byte

#define d (b) a / b / 1000% 26 + 65
f (a) {printf ("% c% c-% 03d-% c% c", d (17576), d (676), a% 1000, d (26), d (1));}

Cukup sederhana, ia menggunakan pembagian dan modulus untuk mengekstrak bidang, menambahkan 'A' untuk huruf untuk memetakannya ke karakter ASCII, dan format printf untuk angka.

Cobalah online!

Sir_Lagsalot
sumber
6

Haskell, 85 81 79 77 byte

([h++'-':n++'-':t|h<-q"AZ",t<-q"AZ",n<-q"099"]!!)
q g=mapM(\_->[g!!0..g!!1])g

Cobalah online!

nimi
sumber
6

05AB1E , 25 22 20 byte

Au2ããs₄‰`UèX₄+¦'-.øý

-2 byte (dan meningkatkan kinerja dengan tidak menghasilkan seluruh daftar) terima kasih kepada @Grimy .

Pengindeksan berbasis 0.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Au            # Push the lowercase alphabet, and uppercase it
  2ã          # Create all possible pairs by taking the cartesian product with itself:
              #  ["AA","AB","AC",...,"ZY","ZZ"]
    ã         # Get the cartesian product of this list with itself:
              #  [["AA","AA"],["AA","AB"],...,["ZZ","ZZ"]]
s             # Swap to push the (implicit) input
 ₄‰           # Take the divmod-1000 of it
              #  i.e. 7483045 becomes [7483,45]
    `         # Push these values separated to the stack
     U        # Pop and store the remainder part in variable `X`
      è       # Index the integer part into the list of letter-pairs we created earlier
              #  i.e. 7483 will result in ["AL","BV"]
X             # Push the remainder part from variable `X` again
 ₄+           # Add 1000 to it
   ¦          # And remove the leading 1 (so now the number is padded with leading 0s)
              #  i.e. 45 becomes 1045 and then "045"
    '-.ø     '# Surround this with "-" (i.e. "045" becomes "-045-")
        ý     # Join the two pairs of letters by this
              #  i.e. ["AL","BV"] and "-045-" becomes "AL-045-BV"
              # (after which the top of the stack is output implicitly as result)

Bagian terakhir ( s₄‰`UèX₄+¦'-.øý) bisa I₄÷èI₄+3.£.ý'-ýuntuk alternatif yang sama dengan byte:
Cobalah secara online atau verifikasi semua kasus uji .

I₄÷           # Push the input, integer-divided by 1000
   è          # Use it to index into the letter-pairs we created earlier
              #  i.e. 7483045 becomes 7483 and then ["AL","BV"]
I₄+           # Push the input again, and add 1000
   3.£        # Only leave the last three digits
              #  i.e. 7483045 becomes 7484045 and then "045"
            # Intersperse the pair with this
              #  i.e. ["AL","BV"] and "045" becomes ["AL","045","BV"]
        '-ý  '# And join this list by "-"
              #  i.e. ["AL","045","BV"] becomes "AL-045-BV"
              # (after which the top of the stack is output implicitly as result)
Kevin Cruijssen
sumber
1
20 dengan Au2ããI₄‰`UèX₄+¦'-.øýatau Au2ããI₄÷èI₄+3.£'-.øý.
Grimmy
1
@ Terima kasih kotor! Dan sekarang ini juga jauh lebih cepat dengan tidak menghasilkan dan mengindeks ke dalam daftar lengkap. :)
Kevin Cruijssen
6

J , 56 49 46 byte

226950 A.'--',7$_3|.4,@u:65 48+/(4 3#26 10)#:]

Cobalah online!

-3 byte terima kasih kepada FrownyFrog

Semuanya tidak lain adalah 7 kereta bersarang - jika itu tidak menyenangkan, apa itu?

  ┌─ 226950                                            
  ├─ A.                                                
  │        ┌─ '--'                                     
──┤        ├─ ,                                        
  │        │      ┌─ 7                                 
  └────────┤      ├─ $                                 
           │      │   ┌─ _3                            
           └──────┤   ├─ |.                            
                  │   │    ┌─ 4                        
                  └───┤    │     ┌─ ,                  
                      │    ├─ @ ─┴─ u:                 
                      └────┤                           
                           │     ┌─ 65 48              
                           │     ├─ / ───── +          
                           └─────┤                     
                                 │       ┌─ '4 3#26 10'
                                 └───────┼─ #:         
                                         └─ ]         
Jonah
sumber
1
Keren! Menggunakan permutasi adalah cara yang bagus untuk memformat string yang dihasilkan.
Galen Ivanov
1
46
FrownyFrog
Terima kasih @FrownyFrog!
Jonah
5

Ruby , 51 byte

->n{[*?A*4..?Z*4][n/1e3][/../]+"-%03d-"%(n%1e3)+$'}

Cobalah online!

GB
sumber
Impresif. Selamat!
Eric Duminil
5

R , 101 byte

b=0:3;a=scan()%/%c(10^b,1e3*26^b)%%rep(c(10,26),e=4);intToUtf8(c(a[8:7],-20,a[3:1]-17,-20,a[6:5])+65)

Cobalah online!

Hanya melakukan perhitungan aritmatika yang dibutuhkan. Saya menyimpan 5 byte dengan memasukkan nilai ayang tidak berguna pada vektor a[4], memungkinkan saya untuk menggunakan kembali vektor pembantu b.

BAB-012-CD26×26×1000=676000nn %/% 676000 %% 26%/%%%

Robin Ryder
sumber
4

Jelly ,  26  22 byte

ØAṗ2,`ØDṗ3¤ṭŒp⁸ị2œ?j”-

Tautan monadik yang menerima bilangan bulat (1-diindeks) yang menghasilkan daftar karakter ... Gila-lambat karena membangun semua lempeng pertama!

Cobalah online! (tidak selesai)
Atau coba versi alfabet yang dikurangi (hanya "ABC" untuk huruf-huruf itu).


Untuk kode yang selesai tepat waktu, berikut adalah program lengkap 32 byte (0-diindeks) yang membuat plat tunggal alih-alih menggunakan aritmatika modular dan dekompresi basis numerik:

dȷ+“©L§“£ż’µḢṃØAṙ1¤ḊŒHW€jDḊ€$j”-

Coba yang ini!

Jonathan Allan
sumber
Sepertinya
melewatkan
1
Ah, aku benar-benar mengabaikan mereka sebagai semacam pemisah! Membuat perbedaan untuk metode ini :(
Jonathan Allan
Maaf tentang itu: c Masih cukup bagus untuk melihatnya dilakukan di Jelly, bahkan tanpa!
Elcan
Menambahkan 7 byes untuk menambahkannya, cukup yakin ada metode keseluruhan yang lebih pendek sekarang ...
Jonathan Allan
Ups, terima kasih @Grimy - semoga bermain golf pada jam 3 sementara saya di sini: p - Jonathan Allan 1 mnt yang lalu
Jonathan Allan
3

APL + WIN, 61 byte

Anjuran untuk bilangan bulat:

m←⎕av[4↑66+n←((4⍴26),1E3)⊤⎕]⋄(2↑m),'-',(¯3↑'00',⍕4↓n),'-',2↓m

Cobalah online! Atas perkenan Dyalog Classic

Graham
sumber
3

Arang , 33 byte

Nθ¹✂I⁺θφ±³≔⪪⍘⁺X²⁶¦⁵÷θφα²η¹⊟ηM⁹←⊟η

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Nθ

Masukkan nomor.

¹

Cetak a -.

✂I⁺θφ±³

Tambahkan 1000 ke nomor tersebut, lalu masukkan hasilnya ke string, dan cetak tiga digit terakhir.

≔⪪⍘⁺X²⁶¦⁵÷θφα²η

Bagi angka dengan 1000, kemudian tambahkan 26⁵, sehingga konversi ke basis kustom menggunakan alfabet huruf besar menghasilkan string dengan panjang 6, yang kemudian dibagi menjadi pasangan huruf.

¹

Cetak a -.

⊟η

Cetak pasangan huruf terakhir.

M⁹←

Pindah ke awal plat nomor.

⊟η

Cetak sisa surat yang diinginkan.

Neil
sumber
3

Perl 6 , 42 byte

{S/(..)(\d+)/-$1-$0/}o{('AAAA000'..*)[$_]}

Cobalah online!

Solusi Port 5 dari Grimy Perl. Lambat untuk nilai input besar.

nwellnhof
sumber
3

Excel, 183 167 155 147 byte

-16 byte terima kasih kepada @Neil. (6 dengan menggunakan E3)

-12 byte terima kasih kepada @Keeta. ( TRUNCbukannya QUOTIENT)

-8 byte berkat @Jonathan Larouche ( INTbukan TRUNC)

=CHAR(65+INT(A1/17576E3))&CHAR(65+MOD(INT(A1/676E3),26))&"-"&TEXT(MOD(A1,1E3),"000")&"-"&CHAR(65+MOD(INT(A1/26E3),26))&CHAR(65+MOD(INT(A1/1E3),26))

Menggabungkan 5 bagian:

CHAR(65+INT(A1/17576E3))
CHAR(65+MOD(INT(A1/676E3),26))
TEXT(MOD(A1,1E3),"000")
CHAR(65+MOD(INT(A1/26E3),26))
CHAR(65+MOD(INT(A1/1E3),26))
Wernisch
sumber
Tidak MOD(QUOTIENT(A1,1E3),26)bekerja Juga, mengapa 1E3untuk 1000tetapi tidak 26E3dll?
Neil
Simpan lebih banyak lagi dengan menghapus TRUNC sama sekali dan pindahkan divisi ke dalam MOD. = CHAR (65 + A1 / 17576E3) & CHAR (65 + MOD (A1 / 676E3,26)) & "-" & TEXT (MOD (A1,1E3), "000") & "-" & CHAR (65 + MOD (A1 / 26E3,26)) & CHAR (65 + MOD (A1 / 1E3,26)) membuatnya turun menjadi 127 byte.
Keeta
Saya bermaksud menghapus QUOTIENT. Awalnya saya menyarankan untuk mengubah hasil bagi menjadi trunc dengan / bukannya koma.
Keeta
@ Geeta, solusi 127 byte Anda gagal untuk beberapa nilai: misalnya 456 975 996->[Z-996-ZZ
Wernisch
@ Keeta, Sepertinya CHAR(65+)desimal diam - diam memotong hingga %.9999997614649. Lebih besar dari itu ditangkap. Bandingkan CHAR(65+24.9999997614649)dan CHAR(65+24.999999761465).
Wernisch
2

Bersih , 107 byte

import StdEnv
A=['A'..'Z']
N=['0'..'9']
$n=[[a,b,'-',x,y,z,'-',c,d]\\a<-A,b<-A,c<-A,d<-A,x<-N,y<-N,z<-N]!!n

Cobalah online!

Menentukan $ :: Int -> [Char]pemberian plat nomor ke-nol yang diindeks.

Suram
sumber
2

Japt , 21 byte

Sangat lambat! Serius, jangan coba-coba menjalankannya!

Ujung topi untuk Kevin untuk membuat saya menyadari di mana saya salah ketika berjuang untuk mendapatkan ini bekerja tadi malam.

;gBï ï ïq#d0o ùT3 û-5

Cobalah - batasi rentang angka 000-005.

;gBï ï ïq#d0o ùT3 û-5     :Implicit input of integer
 g                        :Index into
; B                       :  Uppercase alphabet
   ï                      :  Cartesian product with itself
     ï                    :  Cartesian product of the result with itself
       ï                  :  Cartesian product of that with
         #d0              :    1000
            o             :    Range [0,1000)
              ùT3         :    Left pad each with 0 to length 3
                  û-5     :    Centre pad each with "-" to length 5
        q                 :  Join the first element (the 2 pairs of letters) with the second (the padded digit string) 
Shaggy
sumber
2

Keempat (gforth) , 94 byte

: x /mod 65 + emit ; : f dup 1000 / 17576 x 676 x ." -"swap 0 <# # # # #> type ." -"26 x 1 x ;

Cobalah online!

Diindeks 0. Input diambil dari atas tumpukan

Penjelasan kode

\ extract out some common logic
: x             \ start a new word definition
  /mod          \ divide first argument by second and get both quotient and remainder
  65 +          \ add 65 (ascii A) to quotient
  emit          \ output
;               \ end word definition

: f             \ start a new word definition
  dup 100 /     \ duplicate input and divide by 1000
  17576 x       \ divide by 26^3 and output ascii char
  676 x         \ divide by 26^2 and output ascii char
  ." -"         \ output "-"
  swap 0        \ grab original number and convert to double-cell number
  <# # # # #>   \ convert last 3 chars of number to a string
  type ." -"    \ output string followed by "-"
  26 x          \ divide result of last mod by 26 and output ascii char
  1 x           \ output ascii char for remaining amount
;               \ end word definition
reffu
sumber
2

q , 78 byte

{sv["-","0"^-4$($:[x mod 1000]),"-"]2 2#(|).Q.A mod[x div 1000*26 xexp(!)4]26}

                                                    x div 1000*26 xexp(!)4     / input (floor) divided by 1000*26 ^ 0 1 2 3
                                                mod[                      ]26  / mod 26
                                           .Q.a                                / alphabet uppercase, indexed into by preceeding lines, for x=1000, we'd get "BAAA"
                                    2 2#(|)                                    / reverse and cut into 2x2 matrix ("AA";"AB")
               ($:[x mod 1000]),"-"                                            / string cast x mod 1000 and append "-"
            -4$                                                                / left pad to length 4, "  0-"
    "-","0"^                                                                   / fill nulls (" ") with "0" and prepend "-"
 sv[              x                ]y                                          / join elems of y by x
tulisan cakar ayam
sumber
2

T-SQL, 135 byte

select concat(CHAR(65+(@i/17576000)),CHAR(65+(@i/676000)%26),'-',right(1e3+@i%1000,3),'-',CHAR(65+(@i/26000)%26),CHAR(65+(@i/1000)%26))
Jonathan Larouche
sumber
1

Python 2 , 88 byte

lambda n:g(n/676000)+'-%03d-'%(n%1000)+g(n/1000)
g=lambda n:chr(65+n/26%26)+chr(65+n%26)

Cobalah online!

Chas Brown
sumber
Simpan dengan mypetition di bawah jawaban saya dapat diterapkan untuk Python 2, juga
Black Owl Kai
1

Merah , 130 127 byte

func[n][g: func[a b c][t: copy""loop a[insert t b +(n % c)n: n / c]t]a: g 3 #"0"10
s: g 4 #"A"26 rejoin[s/1 s/2"-"a"-"s/3 s/4]]

Cobalah online!

Galen Ivanov
sumber
1

Python 3 , 89 byte

lambda n:h(n//676)+f"-{n%1000:03}-"+h(n)
h=lambda x:'%c%c'%(x//26000%26+65,x//1000%26+65)

Cobalah online!

-1 byte terima kasih kepada mypetlion

Black Owl Kai
sumber
1
Ubah chr(x//26000%26+65)+chr(x//1000%26+65)ke '%c%c'%(x//26000%26+65,x//1000%26+65)untuk menyimpan 1 byte.
mypetlion
1

MATLAB , 113 byte

c=@(x,p)char(mod(idivide(x,1000*26^p),26)+65);
s=@(n)[c(n,3),c(n,2),num2str(mod(n,1000),'-%03d-'),c(n,1),c(n,0)]

Penjelasan:

Baris pertama mendefinisikan fungsi yang akan menghasilkan char (dari Ake Z), fungsi 2 input. Nomor indeks xuntuk dikonversi menjadi nomor pelat, dan bilangan bulat pyang akan digunakan sebagai eksponen untuk 26 (yaitu 26^p). Input kedua ini memungkinkan untuk menyesuaikan perhitungan untuk digit pelat alfanumerik pertama ( p=3) hingga yang terakhir ( p=0).

Misalnya, untuk digit kedua, bersepeda setiap 1000 * 26 * 26 iterasi, operasi: mod(idivide(x,1000*26^2),26)mengembalikan indeks antara 0 dan 25, yang kemudian dikonversi ke ASCII chardengan menambahkan 65 (karena indeks 0didasarkan)

Baris kedua hanya menggabungkan karakter bersama. Setiap karakter alfanumerik dihitung dengan menggunakan fungsi c(x,p), karakter numerik hanya dihitung dengan modulooperasi dan dikonversi ke string.

Setiap komponen string yang menyusun nomor pelat adalah sebagai berikut:

digit #     |    how often is it cycled             |  code
----------------------------------------------------------------
digit 1     | cycle every 1000*26*26*26=1000*26^3   | c(n,3) 
digit 2     | cycle every 1000*26*26   =1000*26^2   | c(n,2) 
digit 3,4,5 | cycle every iteration                 | num2str(mod(n,1000),'-%03d-')
digit 6     | cycle every 1000*26      =1000*26^1   | c(n,1) 
digit 7     | cycle every 1000         =1000*26^0   | c(n,0) 

Karena saya tidak dapat membiarkan Anda mencoba MATLAB online ( sunting: sebenarnya Anda dapat mencobanya secara online ), saya akan membiarkan pengguna MATLAB kemungkinan untuk memverifikasi kasus pengujian:

% chose some test cases
n = uint32([0;1;999;1000;675999;676000;456975999]) ;

% work out their plate numbers
plates = s(n) ;

% display results
fprintf('\n%10s | Plate # \n','Index')
for k=1:numel(n)
    fprintf('%10d : %s\n',n(k),plates(k,:))
end

output:

     Index | Plate # 
         0 : AA-000-AA
         1 : AA-001-AA
       999 : AA-999-AA
      1000 : AA-000-AB
    675999 : AA-999-ZZ
    676000 : AB-000-AA
 456975999 : ZZ-999-ZZ

Varian: Perhatikan bahwa opsi untuk membiarkan sprintfatau fprintfmenangani konversi angka ke karakter dimungkinkan. Ini memungkinkan untuk menyederhanakan fungsi c, tetapi secara keseluruhan menghasilkan beberapa byte lagi dalam implementasi ini (119 byte):

c=@(x,p)mod(idivide(x,1000*26^p),26)+65 ;
s=@(n)sprintf('%c%c-%03d-%c%c\n',[c(n,3),c(n,2),mod(n,1000),c(n,1),c(n,0)]')
Hoki
sumber
1

C (gcc) , 136 106 105 byte

#define P(i)s[i]=65+x%26;x/=26;
z;s[]=L"  -%03d-  ";f(x){z=x%1000;x/=1e3;P(9)P(8)P(1)P(0)wprintf(s,z);}

Cobalah online!

-7 byte dari celingcat 's solusi , dengan tambahan -23 terinspirasi olehnya

-1 byte dari solusi ceilingcat dengan mengubah char[]ke wchar_t[]cast secara implisitint[]

Menggunakan pengindeksan berbasis 0.

Penjelasan / Tidak Diundang:

int s[] = L"  -%03d-  "; // Pre-made wide-string with dashes and ending null byte
                         // and wprintf directive for digits
int z;                   // Temporary variable to store the digit part
void f(int x) {
    z = x % 1000;        // The digits represent x % 1000
    x /= 1000;           
    s[9] = 'A' + x % 26; // Place least significant letter
    x /= 26;             // Divide off least significant letter
    s[8] = 'A' + x % 26; // Place second letter
    x /= 26;             // Divide off second letter
    s[1] = 'A' + x % 26; // Place third letter
    x /= 26;             // Divide off third letter
    s[0] = 'A' + x;      // Place fourth letter (Don't need to % 26 because x < 26 now)
    wprintf(s, z); // Print finished string (with x%1000 replacing %03d)
}
pizzapants184
sumber
@ceilingcat Terima kasih! Menggunakan ide itu saya menghapus adan bparameter dari makro dan turun ke 106 byte
pizzapants184
0

Kotlin , 93 byte

{i:Int->val c={v:Int->'A'+i/v/1000%26}
""+c(17576)+c(676)+"-%03d-".format(i%1000)+c(26)+c(1)}

Cobalah online!

JohnWells
sumber
0

Python 3 , 161 byte

i,t,u,v,a,c,f=int(input()),1000,676,26,ord('A'),chr,lambda x:c(a+x//v)+c(a+x%v)
m,n=i%t,i//t
e,o=n%u,n//u
print('-'.join([f(o),(3-len(str(m)))*'0'+str(m),f(e)]))

Cobalah online!

Koishore Roy
sumber