Недосконалість dans mon français


13

Для сполучення дієслова в l'imparfait потрібно виконати наступні дії:

  1. Знайдіть «стебло» слова; це досягається опущенням -onsіз сполучно-сполученої форми слова. Наприклад, vivre - це nous vivons ; вилучення врожаїв -onsвід вивонівviv- .
  2. Візьміть стебло і додайте відповідне закінчення відповідно до теми. Ось закінчення:

    je         -ais
    tu         -ais
    il/elle    -ait
    
    nous       -ions
    vous       -iez
    ils/elles  -aient
    

Мета Дано дієслово та предмет, виведіть недосконалу форму цього дієслова відносно предмета. Формат введення може бути у будь-якому зручному для вашої мови форматі. Подання може бути програмою, фрагментом або функцією. (Зверніть увагу, що дієслово не повинно бути справжнім дієсловом.)

Можна припустити, що дієслово - це звичайне дієслово, тобто такі предмети, як Avoir , трактуються як -irдієслово, а не як неправильне. Єдине дієслово, яке ви повинні кількісно оцінити як неправильне, це être ; вона сполучена як така:

j'étais
tu étais
il/elle était

nous étions
vous étiez
ils/elles étaient

Ось відмінювання для -er, -reі -irдієслова в НГО формах

-ER => (e)ons           ; e is added after a 'g'
-RE => ons
-IR => issons

Все, що на цьому не закінчується, не потрібно обробляти.

(Зверніть увагу, що je зливається з наступною голосною, якщо така є. Напр je acheter -> j'achetais. h, Для наших цілей буде вважатися голосною.)

Приклад IO

input: tu vivre
output: tu vivais

input: elles nager
output: elles nageaient

input: je morter
output: je mortais     ; incorrect in real life, but correct for our purposes

input: vous finir
output: vous finissiez

input: il croire
output: il croiait

input: nous jouer
output: nous jouions

Бонуси

  • -5N байт для всіх Nзайвих неправильних дієслів.
  • -10%, якщо ви також виведете кожне сполучення дієслова в недосконалому відмінку.

Це , тому виграє найкоротша програма в байтах.


@ CᴏɴᴏʀO'Bʀɪᴇɴ Does je habiterстати j' habiteабо j'habite?
користувач41805

@KritixiLithos Або добре.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Для бонуса -10% чи вхід все ще повинен мати займенник, чи це може бути просто дієслово?
користувач41805

MorterНе існує, я припускаю, що ви посилаєтесь на те, to dieщо є mourir, що дасть результат, je mouraisякий насправді є правильним.
Фаталізувати

@Fatalize я мав на увазі morter. Це технічно неправильно, оскільки це не слово.
Conor O'Brien

Відповіді:


2

Обробка, 342-10% (бонус) = 307,8

Я створив функцію. Для виклику функції включте займенник як перший параметр, а дієслово - як другий. Наприклад,a("je","habiter")

Зауважте, що моя програма сполучає дієслово для всіх займенників, тому я отримав 10% бонус.

void a(String a,String b){String[]e={"ais","ais","ait","ait","ions","iez","aient","aient"},p={"je","tu","il","elle","nous","vous","ils","elles"};if("aehiou".contains(b.charAt(0)+""))p[0]="j'";for(String i:p)println(i+" "+b.substring(0,b.length()-2)+(b.endsWith("ger")?"e":b.endsWith("ir")?"iss":"")+e[java.util.Arrays.asList(p).indexOf(i)]);}

Читальна форма:

void a(String a,String b){
  String[]e={"ais","ais","ait","ait","ions","iez","aient","aient"},p={"je","tu","il","elle","nous","vous","ils","elles"};
  if("aehiou".contains(b.charAt(0)+""))p[0]="j'";
  for(String i:p)
    println(i+" "+b.substring(0,b.length()-2)+(b.endsWith("ger")?"e":b.endsWith("ir")?"iss":"")+e[java.util.Arrays.asList(p).indexOf(i)]);
}

Вихід (для a("je", "habiter"))

j' habitais
tu habitais
il habitait
elle habitait
nous habitions
vous habitiez
ils habitaient
elles habitaient

Вітаємо!
Conor O'Brien

1
Так! Так! Так! Моя перша перемога в коді-гольфі! Так! Так! [очищає горло] @ CᴏɴᴏʀO'Bʀɪᴇɴ Дякую.
користувач41805

Не всі дієслова з провідним ч витікть займенник. Тільки ті, хто мовчить h. Прикладами лічильників є haïr (je hais) (все одно нерегулярно), hacher, haleter, halter, hérisser та багато іншого. Ви також пропускаєте дієслова, що закінчуються на -cer, де "nous форма" стає -çons.
Урхіксидур

4

Haskell, 366 362 352 байт

s#v=m++g++d++t
 where
 m|v=="être"="ét"|i/="rio"&&i/="erd"&&i/="eri"=r 2 v|otherwise=r 3 v
 g=if(last m=='g'&&head t/='i')then"e"else""
 d|init i=="ri"="iss"|i=="eri"="y"|otherwise=""
 t|s=="je"||s=="tu"="ais"|elem s["il","elle","on"]="ait"|s=="nous"="ions"|s=="vous"="iez"|s=="ils"||s=="elles"="aient"
 r i=reverse.drop i.reverse
 i=take 3$reverse v

Ви можете скласти це в ghci і використовувати його так, "je"#"choisir"щоб отримати "choisissais".

Цей код працює з деякими неправильними дієсловами. Він може пов'язаний croire ( JE croyais , ту croyais ...) або prendre , а також всі його похідні ( apprendre , Comprendre і т.д.).

Я не міг знайти короткий спосіб сполучити інші дієслова, що закінчуються на -ire (наприклад, lire , rire , dire тощо) або на -dre (наприклад, craindre , soudre тощо).


Чи не повинно бути 352 байти через êі é?
користувач41805

2

Java , 389 385 383 382 352,7 443-10% (бонус) = 398,7 байт

Кількість байтів зменшилась завдяки @PeterTaylor та @Fatalize.
Зверніть увагу, що моя програма сполучає дієслово для всіх займенників, тому я отримав 10% бонус.

class A{public static void main(String[]a){String[]e={"ais","ais","ait","ait","ions","iez","aient","aient"},p={"je","tu","il","elle","nous","vous","ils","elles"},w=new java.util.Scanner(System.in).nextLine().split(" ");if("aehiou".contains(w[1].charAt(0)+""))p[0]="j'";for(String i:p)System.out.println(i+" "+w[1].substring(0,w[1].length()-2)+(w[1].endsWith("ger")?"e":w[1].endsWith("ir")?"iss":"")+e[java.util.Arrays.asList(p).indexOf(i)]);}}

Читальна форма (все ще досить безладна):

 1| class A{
 2|   public static void main(String[]a){
 3|     String[]e={"ais","ais","ait","ait","ions","iez","aient","aient"};
 4|     String[]p={"je","tu","il","elle","nous","vous","ils","elles"};
 5|     String[]w=new java.util.Scanner(System.in).nextLine().split(" ");
 6|     if("aehiou".contains(w[1].charAt(0)+""))p[0]="j'";
 7|     for(String i: p) {
 8|       System.out.print(i+" "+w[1].substring(0,w[1].length()-2)+(w[1].endsWith("ger")?"e":w[1].endsWith("ir")?"iss":"")+e[java.util.Arrays.asList(p).indexOf(i)]);
 9|     }
10|   }
11| }

Пояснення:

Lines 3-4: Initialisation of arrays.
Line    5: Read a line as input and split it into words
Line    6: Shorten the `je` to `j'` in presence of a succeeding vowel or a `h`.
Line    7: Create a for-loop iterating through all of the pronouns .
Line    8: Conjugate the verb(remove the ending from the infinite form of the verb and add ending accordingly) and print the result, along with the pronoun.



(Стара версія) 393-10% = 352,7 байт

Зауважте також, що моя стара програма не підкоряється новому правилу щодо jeоб'єднання в j'.

class A{public static void main(String[]a){String[]e={"ais","ais","ait","ait","ions","iez","aient","aient"},p={"je","tu","il","elle","nous","vous","ils","elles"},w=new java.util.Scanner(System.in).nextLine().split(" ");for(String i:p)System.out.println(i+" "+w[1].substring(0,w[1].length()-2)+(w[1].endsWith("ger")?"e":w[1].endsWith("ir")?"iss":"")+e[java.util.Arrays.asList(p).indexOf(i)]);}}

2
Чому у вас і те, kі інше l?
Пітер Тейлор

@PeterTaylor Gee, дякую, що помітили це!
користувач41805

Тут у вас є марний простір:w[1].substring(0, w[1].length()-2)
Підписано

@Fatalize У останньому редагуванні я видалив марний простір.
користувач41805

1

Пітон 3 , 258-10% = 232,2 223-10% = 200,7

Величезне спасибі @WW за те, що врятував мені 35 байт!

def t(x,y):
 z=y[-2:];y=y[:-2];y+='e'*(y[-1]=='g');y+='iss'*(z=='ir')
 return[('j'+"e'"[y[0]in'aeiouh']+' tu il elle nous vous ils elles').split()[i]+' '+y+'ais ais ait ait ions iez aient aient'.split()[i]for i in range(8)]

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


1
Ви можете використовувати splitдля стиснення списків трохи більше. Також використання ;може допомогти вам уникнути деяких відступів.
Ad Hoc Hunter Hunter

1
Також вам не потрібні паролі навколо умовника в ifs.
Ad Hoc Hunter Hunter

1
Схоже, що у вашому поданні буде пробіл j', який, можливо, не відповідає специфікації.
Ad Hoc Hunter Hunter

1
@WW Дякую! а в коментарях до головної публікації ОП каже, що "j '" з пробілом чудово
JathOsh

1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.