Перевести цифры на французский

46

Французы пишут цифры по-особенному.

  • 1-16 "нормальные"
  • 17-19 прописаны 10 + 7. 10 + 8, 10 + 9 .
  • 20-69 "нормальных" (ОК, ОК! Не совсем, но они в этом вызове)
  • 70-79 - это 60 + 10, 60 + 11 ... 60 + 10 + 7, 60 + 10 + 8, 60 + 10 + 9 .
  • 80-99 : 4 * 20, 4 * 20 + 1, 4 * 20 + 2 ... 4 * 20 + 16, 4 * 20 + 10 + 7, 4 * 20 + 10 + 8, 4 * 20 + 10 +. 9

Вызов:

Возьмите положительное целое число в диапазоне [1100] и выведите его «по-французски». Вы должны вывести его точно так , как это показано ниже, с *и +, так 97это 4*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
Каждый язык , который я знаю , есть переход в «подростковом», как один из 16к 10+7выше. (В английском это происходит между 12и 10+3с немного более морфологической маскировкой.) Я всегда был немного переоценен с тем фактом, что разные языки делают этот переход в разном количестве.
Грег Мартин
25
Почему «vingt-deux» должен быть, 22когда «dix-huit» 10+8?
Тит,
11
К счастью, это сайт, посвященный программированию, а не сайт с лингвистическими мелочами. В противном случае люди могут раздражаться, когда ОП делает глупые ошибки. Уф!
Стьюи Гриффин
4
@StewieGriffin Люди все еще раздражались.
Утренняя монахиня
2
Как французский я нахожу это вполне нормально: D.
Вальфрат,

Ответы:

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 все еще отстой.

Не могу найти здесь конкретного ответа, не уверен в правилах игры в гольф. Могу ли я использовать несколько ячеек в Excel и добавить количество байтов для каждой?

то есть. Для входа в ячейку А1

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?

qoou
источник
Я думаю, что должно быть разрешено писать код в нескольких ячейках. ИМХО, это как иметь промежуточные переменные или функции в других языках программирования.
pajonk
Я чувствую, что должно быть определенное наказание за использование нескольких ячеек, точно так же, как есть наказание за использование функций на других языках (это набор шаблонов для объявления функции). Возможно, самая краткая поддерживаемая кодировка (т.е. CSV), поэтому необходимое количество запятых и (если требуется) кавычек?
Музер
Я не знаю ни одного формата, в котором файлы Excel могут быть сохранены с узнаваемым выводом. CSV-файлы по умолчанию не поддерживают такие функции, как эти, и разбивают любую функцию, использующую запятую. Если сохранить в виде чистого текста в одном столбце с новой строкой между ячейками, он может быть скопирован непосредственно в Excel и функции. В этом случае 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
В Libreoffice calc вы можете пропустить )в конце, вы можете сделать то же самое в Excel? Таким образом, вы можете сохранить 5 «байтов» (на самом деле есть UCS2-символы, поэтому, если вы скажете Byte == октет, вы должны считать его в два раза). И вы должны изменить ,в;
12431234123412341234123
8

Retina , 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+

Это обрабатывает случаи 17, 18и 19, путем замены 1в каждой с 10+.

\+0

Наконец, никогда не должно быть +0в конце, поэтому удалите его, если оно есть.

Бизнес Кот
источник
Конечно, вместо этого вы можете использовать группы захвата
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'
ETHproductions
источник
1
терпит неудачу для многих входов; на самом деле это работает только для 1..20, 30, 40, 50, 60, 80 и 100.
Тит
@ Titus Я думаю, вы неправильно понимаете большинство результатов. 23Например, должен выводить 23, а не 20+3.
ETHproductions
Сохраните два байта с(m=n%20)
Титус
@ Титус Спасибо, но я уже пробовал это, и он не работает на 70-99, потому что mсбрасывается 0в f(n-n%20)вызове. (Это глобальная переменная)
ETHproductions
Вы можете сохранить байт, изменив 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.
Тит
5

PHP, 99 байт (хочу быть счастливой версией)

прямой порт ETHproductions´SS , 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
;}
Titus
источник
4

Python 2, 130 108 байт

22 байта сохранено благодаря @mathjunkie

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=потому что вы использовали это в лямбде.
Утренняя монахиня
@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. Генерация и удаление лидирующих +экономит 1 байт над специальным регистром 80. Редактировать: 3 байта сохранены благодаря @ ConorO'Brien.

Нил
источник
Вы можете сохранить 3 байта, удалив @echo offвсе @
Конор О'Брайен,
@ ConorO'Брайен Ха, интересно, почему я забыл сделать это на этот раз ...
Нил
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
Утренняя монахиня
@]b}17 19}b}17 19
Утренняя монахиня
+"10+"ebj\+,Teb
Утренняя монахиня
@LeakyNun Спасибо за помощь в игре в гольф! Я сделал изменения, которые вы предложили.
К Чжан
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! Я полагаю, что обсуждалась мета об отправке массивов в виде отображений из целых чисел в объекты, но я не могу найти это в данный момент. Я дам вам знать, если я это сделаю (и каков был результат этого обсуждения). В любом случае, вам не понадобится f=, потому что безымянные функции (то есть выражения, которые оценивают переданную функцию) хороши, если имя не требуется для чего-то вроде рекурсии.
Мартин Эндер
Четкого консенсуса нет, но ответ с минимальным количеством голосов позволяет предложить ваше решение.
Мартин Эндер
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));
    }
  }
}
Кевин Круйссен
источник