Yapboz programlarım, kod yazarım


21

Arka fon

(İngilizce tekabül İtalyan kesin makale :) yedi farklı formları vardır l' , IL , lo , GLI , i , la , le . Hangisini kullanmak üç değişkene bağlıdır:

  • Cinsiyet: eril / dişil.
  • Sayı: tekil / çoğul.
  • Sonraki kelimenin ilk harfi: ünlü / ünsüz tip A / ünsüz tip B
    • Ünlüler bunlardan herhangi biri: aeiou .
    • Sessiz tip B, bu durumda herhangi biridir: S- bir ünsüz, ardından z- , Gnjilane , pn- , ps , x , i- sesli harf, ardından (bu i bir semivowel olarak işlev görür).
    • Ünsüz türü A, B türü olmayan bir ünsüz türüdür.

Tablo, yukarıdaki üç değişkenin on iki kombinasyonunun her birinde kullanılacak makale formunu göstermektedir. L ' formunun aşağıdaki kelimeye tek bir alıntı ile ve boşluk olmadan eklendiğini unutmayın .

görüntü tanımını buraya girin

Meydan okuma

Girdi bir kelime ve bir veya iki dizeleri, belirten numaraları veya gibi Boolean cinsiyet ve sayı . (İlk harflerin giriş sözcüğünden alınması gerekir).

Giriş sözcüğü küçük harfli ASCII harflerinin bir sırası olacaktır. Aksanlı sesli harf (örneğin, kendi-olmayan vurgulu alternatifler ile değiştirilecektir realtà olarak girilmesi olacaktır Realta ).

Cinsiyet ve sayı girişleri ayrı sayılar, Boolean'lar veya dizgiler veya kombine bir sayı dizisi olabilir (örneğin, eril tekiller için 1, dişil tekiller için 2, vb.).

Herhangi bir makul format ve ayırıcı, cevapta belirtildiği sürece kullanılabilir.

Gerekirse, boşluk veya tek alıntı ile , makalenin uygun biçiminden önce gelen kelimeyi çıktılayın . Çıktı da küçük harf olmalıdır. İzler veya başlarında boşluk bırakılabilir.

Kod golf, en kısa sürede kazanır.

Test durumları

Ben girdi harfleri kullanmak Aşağıda m, fcinsiyet ayrımı, ve s, p(bu sadece bir olası giriş biçimidir) sayısı için.

Input               Output              Comment

macchina f s        la macchina         Initial letter is cons. A
zio m s             lo zio              Initial letter is cons. B
libri m p           i libri             Initial letter is cons. A
ieri m s            lo ieri             Initial letter is cons. B
aquile f p          le aquile           Initial letter is vowel
spagnoli m p        gli spagnoli        Initial letter is cons. B
golf m s            il golf             Initial letter is cons. A
ombra f s           l'ombra             Initial letter is vowel
impossibili m p     gli impossibili     Initial letter is vowel

Ayrıca, düzenli fiillerin çekimi konusunda da bir meydan okuma yapmak isteyebilirsiniz.
user6245072

@ user6245072 Peki, zaten bu var ... fark muhtemelen çok küçük olurdu
Luis Mendo

1
Bir küçük teknik eleyip: / j / normalde denir semivowel İngilizce olarak değil, bir semiconsonant . Çözümlerin, [k] yerine [ʃ] 'ı temsil eden ⟨ch like ( lo chef , lo chardonnay ) yerine [names] , Fransız isimlerindeki ( l'Havet ama lo Hugo ) gibi likech cases gibi kenar durumları hesaba katarsa ​​ne olacağını merak ediyorum. fosilleşmiş formlar ( gli dei , per lo meno ), soyadları ile anılan kadınlar ( l'Antonia ama la Antonini ), vb. .
Janus Bahs Jacquet

1
İtalyanca olarak sizden ierisınava girmenizi rica ediyorum; (BTW resmen doğru oldu) Lütfen!
Giacomo Garabello 18:16

1
Biz usally ki: "Non pensare bir ieri, Pensa bir Domani"
Giacomo Garabello

Yanıtlar:


7

Retina, 138 133 129 113 bayt

^.(s[^aeiou]|z|gn|pn|ps|x|i[aeiou])
B$&
^.[aeiou]
V$&
^\d.
A$&
V[02]
l'
A0
il 
B0
lo 
A1
i 
.1
gli 
.2
la 
.3
le 

Test odası. ( %(G`\ntüm test vakalarını aynı anda yürütmeye hazır)

Giriş formatı: bunun yerine macchina f solur 2macchina.

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

Dönüşüm tablosu sayesinde Kevin Lau .


4

Python 3.5, 238 235 192 181 178 bayt:

( -13 byte, Leaky Nun'un önerileri sayesinde! )

import re;R=re.match;lambda a,b:(R('s[^aeiou]|(z|gn|pn|ps|x|i)[aeiou]',a)and['lo ','gli ','la '][b]or R('[aeiou]',a)and["l'",'gli '][b%2]or['il ','i ','la '][b]if b<3else'le ')+a

Şeklinde argümanları alan adsız bir lambda işlevi (<String>, <Integer Gender-Plurality mapping>)Eşleştirmenin şu şekilde olduğu, :

0 -> Masculine Singular
1 -> Masculine Plural
2 -> Feminine Singular
3 -> Feminine Plural

Aramak için, işleve herhangi bir geçerli ad verin ve ardından print deyiminin içine sarılmış normal bir işlev gibi çağırın. Bu nedenle, eğer soru isimlendirilseydiU , basitçe onu arayın print(U(<String>, <Integer Gender-Plurality mapping>)).

Çevrimiçi Deneyin! (Ideone)


zzz and yyy or xxxiki bayttan daha kısadır[xxx,yyy][bool(zzz)]
Leaky Nun

@LeakyNun Bunu yapabilir miyim? Vay, bilmiyordum bile. Teşekkürler! :)
R. Kap

yyyTruthy olduğu sürece çalışır .
Sızdıran Rahibe,

@LeakyNun Evet, elbette.
R. Kap,

["l'",'gli '][b%2]["l'",'gli ',"l'"][b]
şundan

4

Java, 227 208 195 bayt

Sızdıran Rahibe sayesinde -13 bayt

String f(String a,int o){boolean v=a.matches("^([aeou]|i[^aeiou]).*"),b=a.matches("^([ixz]|gn|pn|ps|s[^aeiou]).*");return(o>1?o>2?"le ":v?"l'":"la ":o>0?v||b?"gli ":"i ":v?"l'":b?"lo ":"il ")+a;}

Aşağıdaki eşlemeyi temel alarak dizginizi ve int'nizi alır:

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

Sonuç ile birlikte bir dize döndürür.

Test durumlarıyla ve üçlü operatörlerin olmadığı bir şekilde (şu an için gerçek):

class Test {

    public static String f(String a, int o) {
        boolean v = a.matches("^([aeou]|i[^aeiou]).*");
        boolean b = a.matches("^([ixz]|gn|pn|ps|s[^aeiou]).*");
        String r;
        if(o > 1)
            if(o > 2)
                r = "le ";
            else
                if(v)
                    r = "l'";
                else
                    r = "la ";
        else
            if(o > 0)
                if(v || b)
                    r = "gli ";
                else
                    r = "i ";
            else
                if(v)
                    r = "l'";
                else if(b)
                    r = "lo ";
                else
                    r = "il ";
        return r + a;
    }

    public static void main(String[] args) {
        System.out.println(f("macchina", 2));
        System.out.println(f("zio", 0));
        System.out.println(f("libri", 1));
        System.out.println(f("ieri", 0));
        System.out.println(f("aquile", 3));
        System.out.println(f("spagnoli", 1));
        System.out.println(f("golf", 0));
        System.out.println(f("ombra", 2));
        System.out.println(f("impossibili", 1));
    }
}

Biraz regex sihri kullanır ve belirtilen iki boole bağlı olarak hareket eder. Benim için sürpriz, hiçbir ithalat gerekli, hangi kod boyutu ile yardımcı olur!


1
Benimki ... JAVA'dan daha mı uzun ?! Benimkine biraz daha golf oynamalıyım! Yine de iyi iş! +1
R. Kap

Argümanlarımı komut satırından veya stdin'den almak zorunda olsaydım, inan bana çok daha uzun olurdu: P

Evet, Booleans da kabul etti. Bunu da düzenledim
Luis Mendo

Bunun 0/1yerine bir false/truekaç bayttan tasarruf etmemiz gerektiğini kullanabilirsiniz .
Leaky Nun

String e = "[^aeiou]).*";Aslında kullanmamak size 5 byte kazandırır.
Leaky Nun

3

Ruby, 147 146 bayt

Online dene?

Hangi makalenin kullanılacağını belirlemek için daha iyi bir yöntem kullanmak mümkün olabilir, ancak hiçbirinden haberdar değilim.

Spesifikasyona göre, tanımlayıcı aşağıdaki gibi bir sayıdır:

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

->w,i{(%w"lo gli la le l' gli l' le il i la le"[(0..2).find{|r|[/^(i[aeiou]|s[^aeiou]|z|x|[gp]n|ps)/,/^[aeiou]/,//][r]=~w}*4+i]+' '+w).sub"' ",?'}

2

Toplu, 446 390 385 380 bayt

@echo off
set w=%2
call:l %1 l' gli_ l' le_ il_ i_ la_ le_ lo_ gli_ le_ le_
exit/b
:l
for /l %%a in (0,1,%1)do shift
set o=%5
for %%a in (gn pn ps)do if %%a==%w:~,2% set o=%9
for %%a in (s z x)do if %%a==%w:~,1% set o=%9
for %%a in (a e i o u)do if %%a==%w:~,1% set o=%1
for %%a in (a e i o u)do if i%%a==%w:~,2% (set o=%9)else if s%%a==%w:~,2% set o=%1
echo %o:_= %%w%

Yeni sürüm 0-3, cinsiyet ve sayı için diğer bazı cevaplarla aynı kodlamayı kullanır . 1 boyutlu bir dizi oluşturarak çalışır %2..%13 Sonra, formların ilk çıkar kayması 1+%1ilgi formları haline böylece elemanları %1, %5ve %9(Toplu yukarıda gitmeyecek kadar şanslı olan %9kayması olmadan). Daha sonra zahmetle hangi formun kullanılması gerektiğini bulmak için önek listelerini kontrol eder. _kelime çıktısı alınana kadar bir alanı temsil etmek için yer tutucu olarak kullanılır.


Baytları kurtarmak için tek bir basamağa (ya da gerekirse harf, gerekirse harf) kodlanmış olabilir. Her şey baytların iyiliği için!
Value Ink,

@ KevinLau-notKenny Rakam kodlamasına geçmek, cinsiyet ve sayı işlemeyi yeniden yazarak tam bir 56 byte tasarruf etmeme izin verdi!
Neil,

1

Python 3, 235 bayt

Python'da bunu regexler olmadan ne kadar kısa süre içinde alabileceğimi görmek ilgimi çekti. En iyi seçenek bu olmadığı ortaya çıktı ...

lambda s,c,v='aeiou':[["l'",'il','lo'],['gli','i','gli'],["l'",'la','la'],['le']*3][c][[[1,2][s[0]=='s'and s[1]not in v or s[0]in'zx'or s[:2]in['gn','pn','ps']or s[0]=='i'and s[1]in v],0][s[0]in v and not(s[0]=='i'and s[1]in v)]]+' '+s

Aşağıdaki eşleştirmeyi kullanarak sözcüğün argümanı sve cinsiyet numarası kodunu cbir tamsayı olarak girerek alan adsız bir işlev :

0 - Masculine Singular
1 - Masculine Plural
2 - Feminine Singular
3 - Feminine Plural

ve doğru makale ile sözcüğü döndürür.

Nasıl çalışır

Her biri ciçin ayrı listeler olarak olasılıkları içeren bir liste oluşturulur. Liste daha sonra değeri kullanılarak indekslenir cve ilgili seçeneklerle birlikte 3 elementli bir liste elde edilir. Boolean ifadelerinin sonuçlarıyla birlikte başka bir iç içe listeye dizine alınmak suretiyle bir liste dizini seçildi. İlk karakteri sbir ünlü ise ve ibunu bir sesli harf takip etmiyorsa vowel, endeksin geri döndürülmesiyle seçenek sunulur 0. Else, dönen bir Boole ifadesi Trueiçin cons. Bve Falseiçin cons. Aindeksleri hasıl değerlendirilir 2ve1 sırasıyla. Son olarak, dizin döndürülmeden önce bir boşlukla ve orijinal dizeyle birleştirilen makaleyi elde etmek için kullanılır.

Ideone'da dene


1

JavaScript 210 bayt

(s,p)=>{var c=i=>!("aeiou".indexOf(s[i])+1),r=["z","gn","pn","ps","x"].some(t=>!s.indexOf(t))||(c(1)?s[0]=="s":s[0]=="i")?2:c(0)?1:0;return (p&1?(p&2?"le ":r&1?"i ":"gli "):!r?"l'":p&2?"la ":r&1?"il ":"lo ")+s}

İki parametre s ve p alarak anonim bir işlev

s  is the input string
p  is plurality (bit 0, set=plural) and gender (bit 1, set=f) combined as
    0 = masculine singular
    1 = masculine plural
    2 = feminine singular
    3 = feminine plural

Fonksiyonu bir değişkene ve bazı paket açma işlemlerine atadıktan sonra), olarak test edilebilir.

var f=(s,p)=>{
    var c = i=>!("aeiou".indexOf(s[i])+1),
        r = ["z","gn","pn","ps","x"].some(t=>!s.indexOf(t))
             || ( c(1)? s[0]=="s":s[0]=="i" )
             ?   2 : c(0) ? 1 : 0;

     return (p&1?(p&2?"le ":r&1?"i ":"gli "):!r?"l'":p&2?"la ":r&1?"il ":"lo ")+s;
}

console.log("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
 f("macchina",2),
 f("zio",0),
 f("libri",1),
 f("ieri", 0),
 f("aquile",3),
 f("spagnoli",1),
 f("golf",0),
 f("ombra",2),
 f("impossibili",1))

nerede

  • cskonumunda bir ünsüz testi yapmak için bir fonksiyondur i.
  • r sesli harfle başlamak için 0, A tipi ünsüz ile başlamak için 1, B tipi ünsüz ile başlamak için 2 olarak değerlendirilir (ters sırada test edilir).
  • Return ifadesinde bit bit onu bir araya getirir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.