将数字翻译成法语


46

法国人用一种特殊的方式拼写数字

  • 1-16是“正常”
  • 17-19拼出了10 + 7。10 + 8、10 + 9
  • 20-69岁是“正常”(好吧,好吧!不是真的,但是他们正在挑战中)
  • 70-7960 + 10、60 + 11 ... 60 + 10 + 7、60 + 10 + 8、60 + 10 + 9
  • 80-994 * 20、4 * 20 + 1、4 * 20 + 2 ... 4 * 20 + 16、4 * 20 + 10 + 7、4 * 20 + 10 + 8、4 * 20 + 10 + 9

挑战:

[1,100]范围内的正整数,然后以“法国方式”输出。你必须将它输出正是因为它的下面所示,用*+,所以974*20+10+7不是[4 20 10 7]还是其他什么东西。

测试用例:

1  - 1
.. - ..
16 - 16
17 - 10+7
18 - 10+8
19 - 10+9
20 - 20
21 - 21
.. - ..
69 - 69
70 - 60+10
71 - 60+11
72 - 60+12
77 - 60+10+7
78 - 60+10+8
79 - 60+10+9
80 - 4*20
81 - 4*20+1
82 - 4*20+2
.. - ..
90 - 4*20+10
91 - 4*20+11
96 - 4*20+16
97 - 4*20+10+7
98 - 4*20+10+8
99 - 4*20+10+9
100 - 100

14
我知道,每一种语言都有在“青少年”的转变,就像从一个1610+7上面。(用英语,它发生在12和之间10+3,并带有一些形态上的伪装。)我一直对这样的事实过于着迷,因为不同的语言以不同的数字进行转换。
格雷格·马丁

25
为什么22“ dix-huit”为“ vent -deux” 10+8
泰特斯

11
幸运的是,这是一个编程难题网站,而不是语言琐事网站。否则,OP犯了愚蠢的错误时,人们可能会感到烦恼。!
Stewie Griffin

4
@StewieGriffin人们仍然很生气。
Leaky Nun

2
作为法国人,我确实觉得还不错:D。
Walfrat

Answers:


13

Excel中,153个 149字节

=IF(OR(A1<17,A1>99,AND(A1>19,A1<70)),A1,IF(A1<20,"10+"&A1-10,IF(A1<80,"60","4*20")&IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))))

我相信这会更好,我努力寻找一种有效的方法来解释#80。

编辑:合并'普通'情况更好地保存4个字节。#80仍然很烂。

在此处找不到具体答案,不确定代码高尔夫球tbh的规则。我可以在Excel中使用多个单元格,并添加每个单元格的字节数吗?

即。对于单元格A1中的输入

A2:11个字节

=MOD(A1,20)

A3(结果):125字节

=IF(OR(A1<17,A1>99,AND(A1>19,A1<70)),A1,IF(A1<20,"10+"&A1-10,IF(A1<80,"60","4*20")&IF(A1=80,,IF(A2>16,"+10+"&A2-10,"+"&A2))))

总共136吗?


我认为应该允许在多个单元格中编写代码。恕我直言,这就像在其他编程语言中具有中间变量或函数一样。
pajonk

我觉得使用多个单元格应该受到一些惩罚,就像使用其他语言的函数(通过输入样板来声明函数)要受到惩罚一样。也许是最受支持的编码(即CSV),所以需要一定数量的逗号和(如果需要)引号吗?
Muzer

我不知道可以使用可识别的输出来保存excel文件的任何格式。默认情况下,CSV文件不支持此类功能,并且会破坏使用逗号的所有功能。如果将其保存为纯文本格式,并且在单元格之间使用新行的一列中,则可以将其直接复制到excel和function中。在这种情况下,将为每个其他单元添加1个字节。
qoou

通过转换IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))IFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
Greedo '17

在Libreoffice calc中,您可以)在最后跳过,可以在excel中做同样的事情吗?因此,您可以节省5个“字节”(实际上是UCS2-Chars,因此如果您说Byte == octet,则必须将其计数为两倍)。并且您必须,;
12431234123412341234123

8

视网膜52 48字节

尼尔节省了4个字节

^7\B
60+1
^9\B
81
^8\B
4*20+
1(?=7|8|9)
10+
\+0

在线尝试!验证所有输入(由尼尔提供)

说明

^7\B
60+1
^9\B
81
^8\B
4*20+

首先,我们处理70、80和90的翻译。在这前3个阶段中,开头为7的字符之后是另一个字符60+1。类似地,9被替换81,和8通过4*20+1。的替换9实际上是将其更改为“八十”,以此类推,8然后由下一次替换处理,这样可以节省4*20+1两次写入操作所产生的字节数。

1(?=7|8|9)
10+

该处理的情况下1718以及19,通过更换1在每个10+

\+0

最后,+0结尾永远不应该有a ,因此请删除它(如果有的话)。


当然,如果回头看看,可以使用捕获组
Downgoat

不适用于7-9,但我认为您不需要任何后顾之忧:在线试用!
尼尔,

@Neil我意识到我不在的时候:P但是感谢新版本!
Business Cat

@Downgoat我可以用捕获组替换前瞻性,但是不会保存任何字节,因为它的$1长度仅为?=
Business Cat


7

JavaScript(ES6),73 71字节

f=n=>n>16&n<20?'10+'+n%10:n<70|n>99?n:n%20?f(n-n%20)+'+'+f(n%20):'4*20'

奖励版本,可打印数字,因为它们实际上是额外拼写的2个字节:

f=n=>n<17|n>99?n:n<20?'10+'+n%10:n%20?f(n-n%20)+'+'+f(n%20):n-80?n:'4*20'

1
大量输入失败;实际上它仅适用于1..20、30、40、50、60、80和100。–
Titus

@Titus我认为您会误解大多数输出​​。23例如,应该输出23,而不是20+3
ETHproductions

使用(m=n%20)
Titus

@Titus谢谢,但是我已经尝试过了,它在70-99上不起作用,因为在通话中m被重置为。(这是一个全局变量)0f(n-n%20)
ETHproductions'Apr

您可以通过更改n<70|n>99为保存一个字节n%100<70。另外,您可以添加测试编译器吗?
凯文·克鲁伊森

5

R,110字节

i=scan()
r=i%%10;paste0(ifelse(i>16&i<20,"10+",ifelse(i>69&i<80,"60+10+",ifelse(i>16&i<20,"4*20+",i-r/10))),r)

尝试(i-r)/10代替floor(i/10)。并且i>15应该是i>16
泰特斯(Titus),

5

PHP,99个字节(我想成为快乐的版本)

ETHproductions JS的直端口,打了 4个字节。打印OP要求的数字。

function f($n){return$n<17|$n>19?$n>60&$n<100?($m=$n%20)?f($n-$m)."+".f($m):'4*20':$n:"10+".$n%10;}

分解

function f($n){return
    $n<17|$n>19
        ?$n>69&$n<100
            ?($m=$n%20)
                ?f($n-$m)."+".f($m) # 70..79, 81..99
                :'4*20'             # 80
            :$n                     # 1..16, 20..69
        :"10+".$n%10                # 17..19
    ;
}

我想要正确的版本,114 98字节

ETHproductions启发的新方法会打印出实际拼写的数字。

function f($n){return$n>16&$n<100?$n-80?($m=$n%($n>60?20:10))?f($n-$m)."+".f($m):$n-$m:'4*20':$n;}

在线试用

分解

function f($n){return
    $n>16&$n<100
        ?$n-80
            ?($m=$n%($n>60?20:10))
                ?f($n-$m)."+".f($m) # $n%$m>0
                :$n-$m              # 10,20,30,40,50,60
            :'4*20'                 # 80
        :$n                         # 1..16, 100
;}

4

Python 2中,130 108个字节

@mathjunkie节省了22个字节

f=lambda x:79<x<100and('4*20'+('+'+f(x-80))*(x>80))or 69<x<100and'60+'+f(x-60)or 16<x<20and'10+'+`x-10`or`x`

在线尝试!


108字节:TIO
数学迷

1
您需要计数,f=因为您在lambda中使用了它。
Leaky Nun

@LeakyNun固定
乌列尔

3

分批,220个 217字节

@set/pn=
@set s=
@if %n% gtr 99 goto g
@if %n% gtr 79 set s=+4*20&set/an-=80
@if %n% gtr 69 set s=+60&set/an-=60
@if %n% gtr 16 if %n% lss 20 set s=%s%+10&set/an-=10
:g
@if %n% gtr 0 set s=%s%+%n%
@echo %s:~1%

在STDIN上输入。生成和删除前导+比特殊情况下的80节省了1个字节。编辑:感谢@ ConorO'Brien,节省了3个字节。


您可以删除@echo off所有语句,并在所有语句之前加上前缀,以@
Conor O'Brien

@ ConorO'Brien Huh,我想知道为什么我这次忘记这样做了吗?
Neil

2

果冻,55 字节

⁹
’,ṃ60Ṁ€
⁹%80“4*20”,
Dj⁾0+µ¹e?“×ØŒ‘
%ȷ2:“FP‘S‘ŀḟ0Ç€j”+

在线尝试!或查看测试套件

毫无疑问,这是更短的方法!

怎么样?

+ - Link 1, helper for 1-69&100: number s=0, number n
⁹ - link's right argument, n

’,ṃ60Ṁ€ - Link 2, helper for 70-79: number s=1, number n
’       - decrement s -> 0
 ,      - pair -> [0,n]
  ṃ60   - base decompress (vectorises) using [1,2,...60]  effectively -> [60,[1,n%60]]
     Ṁ€ - maximum for €ach effectively -> [60,n%60]

⁹%80“4*20”, - Link 3, helper for 80-99: number s=2, number n
⁹           - link's right argument, n
 %80        - mod 80
    “4*20”  - literal ['4','*','2','0']
          , - pair -> [['4','*','2','0'],n]

Dj⁾0+µ¹e?“×ØŒ‘ - Link 4, reformat 17-19: element v (may be char list or number)
        ?      - if
       e       - v exists in
         “×ØŒ‘ - literal [17,18,19]
               - then:
D              -   convert to decimal list  e.g. [1,7]
  ⁾0+          -   literal ['0','+']
 j             -   join                          [1,'0','+',7]
     µ         - else:
      ¹        -   identity, v

%ȷ2:“FP‘S‘ŀḟ0Ç€j”+ - Main link: number n in [1,100]
 ȷ2                - literal 100
%                  - mod (convert 100 to 0)
    “FP‘           - literal [70,80]
   :               - integer division (vectorises)
        S          - sum (0 for 1-69&100; 1 for 70-79; 2 for 80-99)
         ‘         - increment (...1, 2 or 3)
          ŀ        - call link at index (1, 2 or 3) as a dyad(sum, n)
           ḟ0      - filter out zeros (remove 0 from 4*20+0)
             ǀ    - call the last link (4) as a monad for each
                ”+ - literal '+'
               j   - join

2

Pyth,61 56字节

L?}b}17 19++T\+eb|bk?}/QTr6T.s+?<Q80"60+""4*20+"y%Q20\+y

在线测试!

感谢Leaky Nun改进了5个字节!

说明:

                     | Implicit: Q=eval(input())
L                    | Define y(b):
 ?}b}17 19           |  If b is in the inclusive range from 17 to 19:
          ++T\+eb    |   Return "10+" + (last digit of b)
                 |b  |  Else: if b!=0: return b
                   k |   Else: return an empty string (Leaves a trailing '+' for case 80)
_____________________|________________
?}/QTr6T                              | If 70<=Q<100:
          +                           |  Concatenate the next two expressions:
           ?<Q80                      |   If Q<80:
                "60+"                 |    Evaluate to "60+"
                     "4*20+"          |    Else: Evaluate to "4*20+"
                            y%Q20     |   y(Q%20)
        .s                       \+   |  Strip off trailing '+', if present (for case 80)
                                   y  | Else: return y(Q)
                                   (Q)| Trailing Q is implicitly added

*-Q100>Q69}/QTr6T
Leaky Nun

@]b}17 19}b}17 19
Leaky Nun

+"10+"ebj\+,Teb
Leaky Nun

@LeakyNun感谢您对高尔夫的帮助!我已经做了您建议的更改。
K张

1

Python3,127个字节

m,r=map,range;l=[*r(1,17),*m("10+{}".format,(7,8,9))];f=[0,*l,*r(20,61),*m("60+{}".format,l),"4*20",*m("4*20+{}".format,l),100]

每个数组元素都包含其表示形式:

for i in range(1,101):
    print(i, f[i])

该代码实际上并没有创建一个函数,而只是创建一个数组-我不知道是否允许这样做。否则,我必须通过添加来使这139个字节有效f=[...].__getitem__


欢迎来到PPCG!我相信关于meta的讨论是关于将数组作为从整数到对象的映射来提交的,但是我现在似乎找不到。我会告诉你我是否愿意(以及讨论的结果是什么)。无论哪种方式,您都不需要f=,因为未命名的函数(即计算结果为提交的函数的表达式)是可以的,除非递归之类需要该名称。
Martin Ender

目前尚无明确的共识,但票数最高的答案建议允许您采用解决方案。
Martin Ender

0

Java 7,97 96 109字节

String c(int i){return i>16&i<20?"10+"+(i-10):i%100<70?i+"":i<80?"60+"+c(i-60):"4*20"+(i<81?"":"+"+c(i-80));}

+13个字节用于修正错误的情况80.. :(

说明:

String c(int i){      // Method with integer parameter and String return-type
  return i>16&i<20?   //  If 17..19:
    "10+"+(i-10)      //   Return "10+" + `i`-10
   :i%100<70?         //  Else if 1..16; 20..69; 100:
    i+""              //   Return `i`
   :i<80?             //  Else if 70..79:
    "60+"+c(i-60)     //   Return "60+" + recursive-call with `i`-60
   :                  //  Else (80..99):
    "4*20"+           //   Return "4*20" +
     (i<81?           //   If 80:
      ""              //    nothing
     :                //   Else (81..99)
      "+"+c(i-80));   //    recursive-call with `i`-80
}                     // End of method

测试代码:

在这里尝试。

class M{
  static String c(int i){return i>16&i<20?"10+"+(i-10):i%100<70?i+"":i<80?"60+"+c(i-60):"4*20"+(i<81?"":"+"+c(i-80));}

  public static void main(String[] a){
    for (int i = 1; i <= 100; i++) {
      System.out.println(c(i));
    }
  }
}
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.