法国车牌


41

沙盒

法国车牌

法国车牌按特定顺序的数字和字母顺序排列: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可以对应于01,假设所有其他测试用例都使用相同的索引。

这是代码高尔夫球,每种语言的最短答案胜出!

测试用例(基于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混淆。它也排除了党卫军组合,因为它使人联想到纳粹组织和第一组字母中的WW,因为它表示一个临时盘子。”
埃里克·杜米尼尔

4
@EricDuminil我故意将其排除在外,因为它只是增加了对挑战的无用限制。但这确实是很有趣的事情,但是即使有“加分”,我也怀疑实施这些规则是否值得
Elcan

Answers:


17

Bash(无外部使用程序),64

  • @NahuelFouilleul节省了2个字节
x={A..Z}
eval f=($x$x-%03d-$x$x)
printf ${f[$1/1000]} $[$1%1000]

在线尝试!-需要大约10秒钟来运行7个测试用例。

  • 第1行是将字符串简单分配给变量
  • 第2行是对括号的扩展,以构建一系列printf格式的字符串,其中一个用于所有456,976个可能的字母组合,而数字尚未指定。的eval需要,以确保(的x)的变量扩展括号扩展前发生。
  • 第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每天让我惊讶!谢谢,我学到了一些新东西。
2


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),然后将第3个字符移动到第3个字符之后。


->n{s=('AA-AA000-'..?Z*9).step.take(n)[-1];s[2]+=s.slice!5,4;s}更长,但我想知道是否可以缩短它。
埃里克·杜米尼尔

从理论上讲,它->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

PHP96 84 79字节

-5字节,感谢Ismael Miguel的出色评论。

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

在线尝试!

我利用您可以在PHP中递增字母的事实!所以AAAA++会成为AAABAAAZ++也将会成为AABA。我计算了要获取的整数部分,必须将字母递增多少次input/1000。然后将四个字符的长度增加很多倍,其前两个字符和后两个字符将自动成为板的左侧和右侧。

例如,输入的675999字母增量为(int)(675999 / 1000) = 675,因此AAAA将变为AAZZ

最后,通过计算中间数,input%1000并借助printf以指定格式打印所有内容。%.2s打印字符串的前两个字符,%03u在左边用3个零填充数字。


2
@Elcan抱歉,已修复此问题,但花费了12个字节。我有被三只猫攻击的借口,因为我搞砸了:P
Night2

1
代替%0.2s你可以写%.2s。这样可以为您节省1个字节。(作为一个小技巧:如果您要输出具有特定小数位数的十进制数字,则可以执行%.2f(或任何其他修饰符),因为它的工作方式相同)
Ismael Miguel

1
@IsmaelMiguel谢谢,不知道我们可以放弃0。编辑:查看文档,似乎我一开始甚至都不需要它:P
Night2

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答案,这是一个成就:P
Night2

7

C,88 86字节

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

非常简单,它使用除法和模数提取字段,为字母添加“ A”以将它们映射到ASCII字符,并为数字设置printf格式。

在线尝试!



6

05AB1E25 22 20 字节

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

@Grimy使得 -2字节(并通过不生成整个列表提高了性能)。

基于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
@肮脏的谢谢!现在,通过不生成完整索引并将其编入索引,它也变得更快。:)
凯文·克鲁伊森

6

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

在线尝试!

只是进行所需的算术运算。通过在向量中a包含一个无用的值,我节省了5个字节a[4],从而可以重用辅助向量b

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


4

果冻 26  22 字节

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

一个接受整数(1索引)的单子链接,它产生一个字符列表...疯狂慢,因为它首先建立了所有板块!

在线尝试!(不会完成)
或尝试使用简化的字母版本字母仅使用“ ABC”)。


对于及时完成的​​代码,这里有一个32字节的完整程序(0索引),它使用模块化算术和数字基数解压缩来创建单板:

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

试试这个!


似乎错过了破折号,所以现在它不符合挑战的规则:P
Elcan

1
啊,我完全把它们当作分隔符而忽略了!这些方法有很大不同:(
乔纳森·艾伦

抱歉:c即使在没有Jelly的情况下也能很好地完成它!
Elcan

添加了7个byes来添加它们,非常确定现在有一个较短的整体方法...
Jonathan Allan

糟糕,谢谢@Grimy-我还是在这里打3球:p –乔纳森·艾伦1分钟前
乔纳森·艾伦


3

木炭,33字节

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

在线尝试!链接是详细版本的代码。说明:

Nθ

输入号码。

¹

打印一个-

✂I⁺θφ±³

将数字加1000,然后将结果转换为字符串,并输出最后三位数字。

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

将数字除以1000,然后加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)不行?此外,为什么要这样做1E31000但不可以26E3呢?
尼尔

通过完全删除TRUNC并将分部移动到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))将其减小到127个字节。
Keeta

我的意思是删除QUOTIENT。最初,我建议使用/而不是逗号将商数更改为trunc。
Keeta

@Keeta,您的127字节解决方案对于某些值失败:例如456 975 996->[Z-996-ZZ
Wernisch

@Keeta,似乎CHAR(65+)无声地将小数点截断为%.9999997614649。大于此的值将被四舍五入。比较CHAR(65+24.9999997614649)CHAR(65+24.999999761465)
维尔尼施

2

干净,107字节

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

在线尝试!

定义$ :: Int -> [Char]给出第n个零索引车牌。


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

第四(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

Python 3 3,89个字节

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

在线尝试!

-1字节归功于mypetlion


1
更改chr(x//26000%26+65)+chr(x//1000%26+65)'%c%c'%(x//26000%26+65,x//1000%26+65)保存1个字节。
mypetlion

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(从Ato Z)的2个输入函数。索引号x将转换为车牌号,以及一个整数p,该整数将用作26的指数(即26^p)。第二个输入允许将第一个字母数字标牌数字(p=3)的计算向下调整到最后一个(p=0)。

例如,对于第二个数字,每1000 * 26 * 26次迭代循环一次,该操作:mod(idivide(x,1000*26^2),26)返回0到25之间的索引,然后char通过加65将其转换为ASCII (因为索引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

变体: 请注意,选项,让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溶液,用另外的-23通过它的启发

从ceilingcat的-1字节的解决方案,通过改变char[]一个wchar_t[]隐式转换int[]

使用基于0的索引。

解释/取消声明:

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谢谢!使用这个想法,我从宏中删除了ab参数,并减少到106个字节
pizzapant184



0

Python 3,161字节

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

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.