ป้ายทะเบียนรถฝรั่งเศส


41

Sandbox

ป้ายทะเบียนรถฝรั่งเศส

ป้ายทะเบียนรถแบบฝรั่งเศสเรียงตามลำดับตามรูปแบบตัวเลขและตัวอักษรโดยเฉพาะ:AB-012-CD

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ส่งออกหมายเลขทะเบียนรถของฝรั่งเศสตามจำนวนที่กำหนด โปรแกรมของคุณไม่ควรจัดการกับกรณีพิเศษใด ๆ ตามที่ระบุไว้ในหน้าเชื่อมโยง มันควรจะสามารถสร้าง26*26*1000*26*26 => 456 976 000แผ่นเต็มไปได้หรือเท่าที่ภาษาของคุณสามารถรองรับ

ระบบเลขจะเป็นดังนี้:

  • AA-000-AA ถึง AA-999-AA (ตัวเลขวิวัฒนาการก่อน);
  • AA-000-AB ถึง AA-999-AZ (ตามด้วยตัวอักษรตัวสุดท้ายทางขวา);
  • AA-000-BA ถึง AA-999-ZZ (ตามด้วยตัวอักษรตัวแรกทางขวา);
  • AB-000-AA ถึง AZ-999-ZZ (ตามด้วยตัวอักษรตัวสุดท้ายทางซ้าย);
  • BA-000-AA ถึง ZZ-999-ZZ (ตามด้วยตัวอักษรตัวแรกทางซ้าย)

อินพุต

  • ดัชนีของหมายเลขแผ่นเป็นจำนวนเต็ม

เอาท์พุต

  • หมายเลขทะเบียนรถที่สอดคล้องกันของฝรั่งเศส

ข้อมูลเพิ่มเติม

  • ตัวอักษรต้องเป็นตัวพิมพ์ใหญ่
  • คุณสามารถใช้การจัดทำดัชนีทั้งแบบ 0 และ 1 เพื่อสร้างเพลต (หมายถึง AA-000-AA สามารถสอดคล้อง0หรือ1สมมติว่ากรณีทดสอบอื่น ๆ ทั้งหมดใช้ดัชนีเดียวกัน

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในทุกภาษาชนะ!

กรณีทดสอบ (การจัดทำดัชนีตาม 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

2
นี่คือข้อกำหนดเพิ่มเติมโดยตรงจาก Wikipedia หากคุณต้องการสร้างรูปแบบที่ยากขึ้น: "รูปนี้ยกเว้นตัวอักษรสามตัวที่ไม่ได้ใช้: I, O และ U เนื่องจากพวกเขาสับสนกับ 1, 0 และ V ตามลำดับ นอกจากนี้ยังยกเว้นชุดค่าผสมของ SS เนื่องจากเป็นการระลึกถึงองค์การนาซีและ WW ในกลุ่มตัวอักษรกลุ่มแรกเนื่องจากระบุจานชั่วคราว "
Eric Duminil

4
@EricDuminil ฉันตั้งใจแยกมันออกไปเพราะมันเพิ่งเพิ่มข้อ จำกัด ที่ไม่เป็นไปตามความท้าทาย แต่มันก็เป็นความจริงที่น่าสนใจที่จะทำ แต่ถึงแม้จะมี "คะแนนโบนัส" ฉันสงสัยว่ามันจะคุ้มค่าที่จะใช้กฎเหล่านี้
Elcan

คำตอบ:


17

Pure Bash (ไม่มีสิ่งของภายนอก), 64

  • บันทึก 2 ไบต์ด้วย @NahuelFouilleul
x={A..Z}
eval f=($x$x-%03d-$x$x)
printf ${f[$1/1000]} $[$1%1000]

ลองออนไลน์! - ใช้เวลาประมาณ 10 วินาทีในการทดสอบ 7 ครั้ง

  • Line # 1 คือการกำหนดสตริงให้กับตัวแปรอย่างง่าย
  • Line # 2 คือส่วนเสริมรั้งเพื่อสร้างอาร์เรย์ของสตริงรูปแบบ printf หนึ่งชุดสำหรับตัวอักษรที่เป็นไปได้ทั้งหมด 456,976 ชุดโดยตัวเลขยังไม่ได้ระบุ evalเป็นสิ่งจำเป็นเพื่อให้แน่ใจว่าการขยายตัวของตัวแปร (จาก x) เกิดขึ้นก่อนที่จะขยายตัวรั้ง
  • Line # 3 จะทำดัชนีอาร์เรย์เพื่อให้ได้สตริงรูปแบบที่เหมาะสมและนำส่วนตัวเลขมาเป็นพารามิเตอร์


13

Perl 5 (-ap), 47 ไบต์

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

ลองออนไลน์!


PHP , 74 ไบต์

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

ลองออนไลน์!


2
+1 สำหรับ PHP ฉันรู้ว่าเราสามารถเพิ่มตัวอักษรใน PHP ได้ แต่ฉันไม่รู้ว่าเราสามารถเพิ่มตัวอักษรและตัวเลขร่วมกันได้ PHP ทำให้ฉันประหลาดใจทุกวัน! และขอบคุณฉันได้เรียนรู้สิ่งใหม่
คืน

8

Python 3 , 79 78 77 ไบต์

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

ลองออนไลน์!

ฉันไม่เคยรู้เลยว่ามีf"string"ทางลัดในการฟอร์แมตจนกระทั่งเห็นคำตอบของ Black Owl Kai


78 bytesโดยแทนที่tupleโดย(*...,)
Black Owl Kai

การใช้f"string"ทำให้คำตอบของคุณ Python 3.6+ เป็นเอกสิทธิ์เพียงเพื่อให้คุณรับรู้ แม้ว่าจะทำงานได้ดี!
connectyourcharger

8

Ruby, 61 59 55 ไบต์

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

ยัง 55 ไบต์:

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

ลองออนไลน์!

นี่เป็นการเริ่มต้นตัวนับเพื่อAA-AA000-เพิ่มจำนวนnครั้ง (โดยการคูณสตริงของโค้ดที่ทำเช่นนั้นด้วย n และevaling) จากนั้นย้ายอักขระ 4 ตัวหลังสุดหลัง 3nd


->n{s=('AA-AA000-'..?Z*9).step.take(n)[-1];s[2]+=s.slice!5,4;s}อีกต่อไป แต่ฉันสงสัยว่าเป็นไปได้ที่จะย่อให้สั้นลงหรือไม่
Eric Duminil

ในทางทฤษฎี->n{s=[*'AA-AA000-'..?Z*9][n];s[2]+=s.slice!5,4;s}ควรทำงานและมีความยาวเพียง 50 ไบต์ แต่จะสร้างแผ่นที่เป็นไปได้ทุกครั้งก่อน : - /
Eric Duminil

1
"s + = s.slice! 3,2" สำหรับ 50 ไบต์
GB

ดังนั้นจึงควรใช้งานได้: 45 ไบต์
GB

7

PHP , 96 84 79 ไบต์

-5 ไบต์ขอบคุณข้อคิดเห็นที่ยอดเยี่ยมของIsmael Miguel

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

ลองออนไลน์!

ฉันใช้ประโยชน์จากความจริงที่ว่าคุณสามารถเพิ่มตัวอักษรใน PHP! ดังนั้นAAAA++ก็จะกลายเป็นAAABและจะกลายเป็นAAAZ++ ฉันจะคำนวณจำนวนครั้งที่ตัวอักษรที่จะต้องมีการเพิ่มขึ้นโดยได้รับส่วนหนึ่งของจำนวนเต็มAABA input/1000จากนั้นเพิ่มความยาวของอักขระสี่ตัวที่หลาย ๆ ครั้งและอักขระสองตัวแรกและอักขระสองตัวสุดท้ายจะกลายเป็นด้านซ้ายและขวาของแผ่นโดยอัตโนมัติ

ตัวอย่างเช่นสำหรับการป้อนข้อมูลของ675999จำนวนเพิ่มขึ้นทีละตัวอักษรเป็น(int)(675999 / 1000) = 675ดังนั้นจะกลายเป็นAAAAAAZZ

สุดท้ายจำนวนกลางคำนวณโดยinput%1000และทุกอย่างจะถูกพิมพ์ในรูปแบบที่กำหนดด้วยความช่วยเหลือของprintf %.2sพิมพ์อักขระสองตัวแรกของสตริง%03uวางตัวเลขในด้านซ้ายด้วย 3 ศูนย์


2
@Elcan ขออภัยแก้ไขปัญหาด้วยราคา 12 ไบต์ ฉันมีข้อแก้ตัวที่ถูกแมวสามตัวโจมตีเพราะฉันยุ่ง: P
Night2

1
แทนที่จะคุณสามารถเขียน%0.2s %.2sที่ช่วยให้คุณประหยัด 1 ไบต์ (เป็นเคล็ดลับเล็ก ๆ : หากคุณต้องการส่งออกจำนวนทศนิยมด้วยจำนวนตำแหน่งทศนิยมที่เฉพาะเจาะจงคุณสามารถทำ%.2f(หรือตัวดัดแปลงอื่น ๆ ) ในขณะที่มันทำงานในลักษณะเดียวกัน)
Ismael Miguel

1
@IsmaelMiguel 0ขอบคุณไม่ได้รู้ว่าเราสามารถวาง แก้ไข: ดูเอกสารดูเหมือนว่าฉันไม่ต้องการแม้แต่ตอนแรก: P
กลางคืน 2

1
โอ้คุณสามารถดร็อปพวกนั้นได้ นอกจากนี้คุณสามารถทำ$x++^$argn/1e3แทน$x++<(0^$argn/1e3)และคุณควรบันทึก 4 ไบต์ นี้จะวนซ้ำจนกระทั่ง($x++^$argn/1e3) === 0และเป็น0เมื่อ$xและ$argn/1e3เป็นจำนวนเต็มเดียวกัน(ใช้^จะโยนหมายเลขเป็นจำนวนเต็ม) คุณสามารถลองใช้งานได้ที่sandbox.onlinephpfunctions.com/code/…
Ismael Miguel

1
@IsmaelMiguel ขอบคุณอีกครั้งความคิดที่ฉลาดมาก คุณทำให้คำตอบนี้สั้นกว่า JS one และนั่นคือความสำเร็จ: P
Night2

7

C, 88 86 ไบต์

#define d (b) a / b / 1000% 26 + 65
f (ก) {printf ( "c%%% c- 03d- c% c%" d (17576) ง (676) เป็น% 1000 d (26), D (1));}

ค่อนข้างง่ายใช้การแบ่งและโมดูลัสเพื่อแยกฟิลด์เพิ่ม 'A' สำหรับตัวอักษรเพื่อจับคู่กับอักขระ ASCII และพิมพ์การจัดรูปแบบตัวเลข

ลองออนไลน์!



6

05AB1E , 25 22 20 ไบต์

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

-2 ไบต์ (และเพิ่มประสิทธิภาพการทำงานโดยไม่ได้สร้างรายการทั้งหมด) ขอบคุณที่@Grimy

การทำดัชนีแบบ 0

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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)

ส่วนสุดท้าย ( s₄‰`UèX₄+¦'-.øý) อาจจะมีI₄÷èI₄+3.£.ý'-ýการเท่ากับไบต์ทางเลือก:
ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

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)

1
20 ด้วยหรือAu2ããI₄‰`UèX₄+¦'-.øý Au2ããI₄÷èI₄+3.£'-.øý
Grimmy

1
@Grimy ขอบคุณ! และตอนนี้ก็เร็วขึ้นมากโดยไม่สร้างและจัดทำดัชนีลงในรายการทั้งหมด :)
Kevin Cruijssen

6

J , 56 49 46 46 ไบต์

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

ลองออนไลน์!

-3 ไบต์ขอบคุณ FrownyFrog

สิ่งทั้งหมดคืออะไร แต่ 7 รถไฟซ้อนกัน - ถ้าไม่สนุกก็คืออะไร?

  ┌─ 226950                                            
  ├─ A.                                                
  │        ┌─ '--'                                     
──┤        ├─ ,                                        
  │        │      ┌─ 7                                 
  └────────┤      ├─ $                                 
           │      │   ┌─ _3                            
           └──────┤   ├─ |.                            
                  │   │    ┌─ 4                        
                  └───┤    │     ┌─ ,                  
                      │    ├─ @ ─┴─ u:                 
                      └────┤                           
                           │     ┌─ 65 48              
                           │     ├─ / ───── +          
                           └─────┤                     
                                 │       ┌─ '4 3#26 10'
                                 └───────┼─ #:         
                                         └─ ]         

1
เย็น! การใช้การเรียงสับเปลี่ยนเป็นวิธีที่ดีในการจัดรูปแบบสตริงผลลัพธ์
Galen Ivanov


ขอบคุณ @FrownyFrog!
โยนาห์



5

R , 101 ไบต์

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)

ลองออนไลน์!

การคำนวณทางคณิตศาสตร์ที่จำเป็นต้องใช้ ฉันบันทึก 5 ไบต์โดยการรวมค่าเวกเตอร์ไว้aในที่ไร้ประโยชน์ที่a[4]ซึ่งทำให้ฉันสามารถใช้เวกเตอร์ตัวช่วยซ้ำbได้

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


4

เยลลี่ ,  26  22 ไบต์

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

Monadic Link ยอมรับจำนวนเต็ม (ดัชนี 1 รายการ) ซึ่งให้รายชื่อตัวละคร ... Crazy-slow เพราะมันสร้างเพลททั้งหมดก่อน!

ลองออนไลน์! (ไม่เสร็จสมบูรณ์)
หรือลองใช้ตัวอักษรลดจำนวนลง (เฉพาะ "ABC" สำหรับตัวอักษร)


สำหรับรหัสที่เสร็จสมบูรณ์ในเวลาที่เหมาะสมนี่คือ 32 ไบต์โปรแกรมเต็มรูปแบบ (0 ดัชนี) ซึ่งสร้างจานเดียวแทนการใช้เลขคณิตแบบแยกส่วนและการบีบอัดฐานตัวเลข:

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

ลองอันนี้!


ดูเหมือนว่าขีดกลางหายไปดังนั้นสำหรับตอนนี้มันไม่เข้ากับกฎของการท้าทาย: P
Elcan

1
อ่าฉันไม่สนใจพวกเขาอย่างสิ้นเชิงว่าเป็นตัวแยกบางชนิด! ทำให้ค่อนข้างแตกต่างสำหรับวิธีการเหล่านี้ :(
Jonathan Allan

ขออภัยเกี่ยวกับที่: c ยังคงสวยที่จะเห็นมันทำในเยลลี่แม้จะไม่มี!
Elcan

เพิ่ม 7 byes เพื่อเพิ่มเข้ามาค่อนข้างแน่ใจว่ามีวิธีโดยรวมที่สั้นกว่าตอนนี้ ...
Jonathan Allan

โอ๊ะขอบคุณ @Grimy - อาจตีกอล์ฟด้วย 3 ในขณะที่ฉันอยู่ที่นี่: p - Jonathan Allan 1 นาทีที่แล้ว
Jonathan Allan


3

ถ่าน 33 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ

ใส่หมายเลข

¹

-พิมพ์

✂I⁺θφ±³

เพิ่ม 1,000 เข้ากับจำนวนจากนั้นส่งผลลัพธ์ไปยังสตริงและพิมพ์ตัวเลขสามหลักสุดท้าย

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

หารตัวเลขด้วย 1,000 แล้วเพิ่ม26⁵ดังนั้นการแปลงเป็นฐานที่กำหนดเองโดยใช้ตัวอักษรตัวพิมพ์ใหญ่จะให้ผลลัพธ์เป็นสตริงที่มีความยาว 6 ซึ่งจะแบ่งออกเป็นคู่ของตัวอักษร

¹

-พิมพ์

⊟η

พิมพ์ตัวอักษรคู่สุดท้าย

M⁹←

ย้ายไปที่จุดเริ่มต้นของป้ายทะเบียน

⊟η

พิมพ์ตัวอักษรที่เหลือ



3

Excel, 183 167 155 147 ไบต์

-16 ไบต์ขอบคุณ @Neil (6 โดยใช้E3)

-12 ไบต์ขอบคุณ @Keeta ( TRUNCแทนQUOTIENT)

-8 ไบต์ขอบคุณ @Jonathan Larouche ( INTแทน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))

เชื่อม 5 ส่วนเข้าด้วยกัน:

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))

ใช้งานไม่MOD(QUOTIENT(A1,1E3),26)ได้? นอกจากนี้เหตุผล1E3สำหรับ1000แต่ไม่26E3etc?
Neil

ประหยัดมากยิ่งขึ้นด้วยการลบ TRUNC ไปพร้อม ๆ กันและย้ายส่วนไปไว้ใน MOD = CHAR (65 + A1 / 17576E3) และ CHAR (65 + MOD (A1 / 676E3,26)) และ "-" และข้อความ (MOD (A1,1E3), "000") และ "-" & CHAR (65 + MOD (A1 / 26E3,26)) & CHAR (65 + MOD (A1 / 1E3,26)) นำมันลงไปที่ 127 ไบต์
Keeta

ฉันหมายถึงการลบ QUOTIENT เดิมทีฉันแนะนำให้เปลี่ยนความฉลาดทางเพื่อตัดด้วย a / แทนเครื่องหมายจุลภาค
Keeta

@Keeta โซลูชั่น 127 ไบต์ของคุณล้มเหลวในบางค่าเช่น456 975 996->[Z-996-ZZ
Wernisch

@Keeta, ดูเหมือนว่าตัดทอนเงียบทศนิยมขึ้นไปCHAR(65+) %.9999997614649ใหญ่กว่านั้นคือปัดเศษขึ้น เปรียบเทียบและCHAR(65+24.9999997614649) CHAR(65+24.999999761465)
Wernisch


2

Japt , 21 ไบต์

ช้าหยาบคาย! อย่างจริงจังอย่าพยายามเรียกใช้!

เคล็ดลับของหมวกที่ทำให้เควินทำให้ฉันรู้ว่าฉันผิดตรงไหนเมื่อต้องต่อสู้เพื่อให้มันทำงานได้เมื่อคืนนี้

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

ลองใช้ - จำกัด ช่วงตัวเลข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) 

2

Forth (gforth) , 94 ไบต์

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

ลองออนไลน์!

0 การจัดทำดัชนี อินพุตถูกนำมาจากด้านบนของสแต็ก

คำอธิบายรหัส

\ 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





1

MATLAB , 113 ไบต์

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)]

คำอธิบาย:

บรรทัดแรกกำหนดฟังก์ชั่นที่จะสร้าง char (จากAถึงZ) ฟังก์ชั่นของ 2 อินพุต หมายเลขดัชนีที่xจะแปลงเป็นเลขเพลตและจำนวนเต็มpซึ่งจะใช้เป็นเลขชี้กำลังสำหรับ 26 (เช่น26^p) การป้อนข้อมูลที่สองนี้อนุญาตให้มีการปรับการคำนวณสำหรับครั้งแรกจานหลักและตัวเลข ( p=3) ลงไปเป็นคนสุดท้าย ( p=0)

ตัวอย่างเช่นสำหรับตัวเลขตัวที่สองการวนซ้ำทุก ๆ 1,000 * 26 * 26 การดำเนินการ: mod(idivide(x,1000*26^2),26)ส่งคืนดัชนีระหว่าง 0 ถึง 25 ซึ่งจะถูกแปลงเป็น ASCII charโดยเพิ่ม 65 (เพราะดัชนี0อิง)

บรรทัดที่สองเชื่อมต่อกันเพียงอักขระเข้าด้วยกัน อักขระตัวอักษรผสมตัวเลขแต่ละตัวถูกคำนวณด้วยการใช้ฟังก์ชันc(x,p)ตัวอักษรตัวเลขนั้นคำนวณด้วยการmoduloดำเนินการและแปลงเป็นสตริง

แต่ละองค์ประกอบของสตริงที่ประกอบด้วยหมายเลขเพลทมีดังต่อไปนี้:

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) 

เนื่องจากฉันไม่สามารถให้คุณลองใช้ MATLAB ออนไลน์ได้ ( แก้ไข:จริง ๆ แล้วคุณสามารถลองออนไลน์ได้ ) ฉันจะให้ผู้ใช้ MATLAB สามารถตรวจสอบกรณีทดสอบได้:

% 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

เอาท์พุท:

     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

Variant: โปรดทราบว่าตัวเลือกในการอนุญาตsprintfหรือfprintfดูแลการแปลงตัวเลขเป็นตัวอักษรนั้นเป็นไปได้ อนุญาตให้ทำฟังก์ชั่นให้ง่ายขึ้นcแต่ผลลัพธ์โดยรวมจะมีอีกไม่กี่ไบต์ในการติดตั้งนี้ (119 ไบต์):

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)]')

1

q , 78 ไบต์

{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

1

C (gcc) , 136 106 105 ไบต์

#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);}

ลองออนไลน์!

-7 ไบต์จากcelingcat 's วิธีการแก้ปัญหาด้วยการเพิ่มเติม -23 แรงบันดาลใจจากมัน

-1 ไบต์จาก ceilingcat ของการแก้ปัญหาโดยการเปลี่ยนchar[]ไปwchar_t[]โยนไปโดยปริยายint[]

ใช้การจัดทำดัชนีแบบ 0

คำอธิบาย / Ungolfed:

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)
}

@ceilingcat ขอบคุณ! การใช้ความคิดนั้นฉันได้ลบพารามิเตอร์aและbจากแมโครและลดลงเหลือ106 ไบต์
pizzapants184



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.