Перекладіть номери французькою мовою


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

Виклик:

Візьміть додатне ціле число в діапазоні [1,100] і виведіть його «французьким шляхом». Ви повинні вивести його точно так , як це показано нижче, з *і +, так 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 Люди все ще дратуються.
Leaky Nun

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 все ще смокче.

Не можете знайти конкретну відповідь тут, не впевнені в правилах коду-гольфу tbh. Чи можна використовувати декілька комірок в 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?


Я думаю, що слід дозволити писати код у декілька комірок. IMHO - це як мати проміжні змінні або функції в інших мовах програмування.
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))
Гредо

У calbre Libreoffice ви можете пропустити )кінець, чи можете це зробити в excel? Таким чином, ви можете зберегти 5 "байт" (дійсно є UCS2-Chars, тому якщо ви скажете байт == октет, ви повинні порахувати його вдвічі). І ви повинні змінити ,в;
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+

Це обробляє випадки 17, 18і 19, шляхом заміни 1в кожної з 10+.

\+0

Нарешті, ніколи не повинно бути +0кінця, тому видаліть його, якщо він є.


Безумовно, замість того, якщо дивитись на спинки та лукади, ви можете використовувати групи захоплення
Пуховик

Це не працює 7-9, але я не думаю, що вам потрібно це дивитися позаду: Спробуйте в Інтернеті!
Ніл

@Neil Я зрозумів, що поки мене не було: P Але дякую за нову версію!
Ділова кішка

@Downgoat Я міг би замінити lookahead групою захоплення, але це не збереже жодних байтів, оскільки $1так само є ?=.
Ділова кішка


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 Я думаю, ви нерозумієте більшість результатів. 23Наприклад, передбачається вихід 23, а не 20+3.
ETHproductions

Збережіть два байти(m=n%20)
Тит

@Titus Дякую, але я вже пробував це, і він не працює на 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 'JS , 4 байти в гольф. Друкує номери, як вимагає ОП.

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 байт

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`

Спробуйте в Інтернеті!



1
Вам потрібно порахувати, f=тому що ви використовували його всередині лямбда.
Лина монашка

@LeakyNun виправлено
Uriel

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та встановивши префікси всіх операторів, за винятком оператора циклу hte за допомогою@
Conor O'Brien

@ ConorO'Brien Huh, мені цікаво, чому я цього разу забув це зробити ...
Ніл

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 Дякуємо за допомогу в гольфі! Я вніс запропоновані вами зміни.
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! Я вважаю, що було обговорено мета про те, як представити масиви як відображення з цілих чисел на об'єкти, але я, здається, не можу його знайти на даний момент. Я дам вам знати, якщо я це зробити (і який результат цього обговорення). Так чи інакше, вам не знадобиться 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));
    }
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.