ฉันเขียนโปรแกรมปริศนารหัสกอล์ฟ


21

พื้นหลัง

แน่นอนบทความอิตาลี (ตรงกับภาษาอังกฤษ) มีเจ็ดรูปแบบที่แตกต่างกัน: L' , อิลลินอยส์ , ทองหล่อ , gli , ฉัน , ลา , le ตัวเลือกใดที่ใช้ขึ้นอยู่กับตัวแปรสามตัว:

  • เพศ: ชาย / หญิง
  • จำนวน: เอกพจน์ / พหูพจน์
  • ตัวอักษรเริ่มต้นของคำต่อมา: สระ / พยัญชนะประเภท A / พยัญชนะประเภท B
    • เสียงสระเป็นใด ๆ เหล่านี้: Aeiou
    • พยัญชนะประเภท B เป็นกรณีใด ๆ เหล่านี้: s-ตามด้วยพยัญชนะอื่น, z- , gn- , pn- , ps- , x- , i-ตามด้วยสระ (นี้ฉันทำหน้าที่เป็น semivowel)
    • พยัญชนะประเภทกเป็นพยัญชนะที่ไม่ใช่แบบบี

ตารางแสดงรูปแบบบทความที่จะใช้ในการรวมกันสิบสองของตัวแปรทั้งสามข้างต้น โปรดทราบว่าแบบฟอร์มl 'แนบมากับคำต่อไปนี้โดยมีเครื่องหมายคำพูดเดี่ยวและไม่มีช่องว่าง

ป้อนคำอธิบายรูปภาพที่นี่

ความท้าทาย

การป้อนคำและหนึ่งหรือสองสตริงตัวเลขหรือ Booleans บ่งบอกเพศและจำนวน (ตัวอักษรเริ่มต้นจะต้องได้รับจากคำที่ป้อน)

คำที่ป้อนจะเป็นลำดับของตัวอักษร ASCII ตัวพิมพ์เล็ก สระที่เน้นเสียงจะถูกแทนที่ด้วยรุ่นที่ไม่เน้นเสียง (ตัวอย่างเช่นrealtàจะถูกป้อนเป็นrealta )

อินพุตเพศและหมายเลขสามารถแยกตัวเลขบูลีนหรือสตริงหรือจำนวนสตริงรวมกัน (ตัวอย่างเช่น 1 สำหรับเอกพจน์ชาย, 2 สำหรับเอกพจน์ผู้หญิง ฯลฯ )

สามารถใช้รูปแบบและตัวคั่นที่สมเหตุสมผลได้ตราบใดที่ระบุไว้ในคำตอบ

เอาท์พุทคำที่นำหน้าด้วยรูปแบบที่เหมาะสมของบทความโดยมีช่องว่างหรือเครื่องหมายคำพูดเดี่ยวตามต้องการ เอาต์พุตควรเป็นตัวพิมพ์เล็ก อนุญาตให้ใช้ Trailing หรือ Space blank

รหัสกอล์ฟชนะที่สั้นที่สุด

กรณีทดสอบ

ในต่อไปนี้ฉันจะใช้ตัวอักษรที่ป้อนเข้าm, fการระบุเพศและs, pจำนวน (นี้เป็นเพียงรูปแบบการป้อนข้อมูลที่เป็นไปได้อย่างใดอย่างหนึ่ง)

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

คุณอาจต้องการทำสิ่งที่ท้าทายในการผันคำกริยาปกติ
user6245072

@ user6245072 ดีมีอยู่แล้วนี้ ... ที่แตกต่างกันอาจจะมีขนาดเล็กเกินไป
หลุยส์ Mendo

1
รองลงมาง่องแง่งทางเทคนิค: / / j เป็นปกติเรียกว่าเสียงกึ่งสระในภาษาอังกฤษไม่ได้เป็นsemiconsonant ฉันสงสัยว่าการแก้ปัญหาจะเป็นอย่างไรหากพวกเขาคำนึงถึงคดีขอบเช่นlikech⟩ซึ่งเป็นตัวแทน [ʃ] แทนที่จะเป็น [k] ( พ่อครัว , lo chardonnay ) การเปลี่ยนแปลงที่มีชื่อภาษาฝรั่งเศส ( l'Havetแต่lo Hugo ) รูปแบบซากดึกดำบรรพ์ ( gli dei , per meno ), ผู้หญิงที่อ้างถึงโดยนามสกุลของพวกเขา ( l'Antoniaแต่la Antonini ) เป็นต้นซึ่งจะเป็นสิ่งที่น่าเกรงขามสำหรับรหัสกอล์ฟ
Janus Bahs Jacquet

1
ในฐานะชาวอิตาลีฉันขอให้คุณถอดieriเคสทดสอบเพราะเป็นคำวิเศษณ์และไม่ใช่คำนาม! (BTW มันถูกต้องเป็นทางการ) โปรด!
Giacomo Garabello

1
เรามักจะพูดว่า: "ไม่ใช่ Pensare a ieri, Pensa a Domani"
Giacomo Garabello

คำตอบ:


7

เรติน่า, 138 133 129 113 ไบต์

^.(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 

ชุดทดสอบ (เตรียมที่%(G`\nจะเรียกใช้กรณีทดสอบทั้งหมดในครั้งเดียว)

รูปแบบอินพุต: macchina f sกลายเป็น2macchinaแทน

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

ขอบคุณตารางการแปลงไปเควิน Lau


4

Python 3.5, 238 235 192 181 178 ไบต์:

( -13 ไบต์ขอบคุณคำแนะนำจาก Leaky Nun! )

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

ฟังก์ชั่นแลมบ์ดานิรนามที่รับอาร์กิวเมนต์ในรูปแบบของ(<String>, <Integer Gender-Plurality mapping>)ซึ่งการทำแผนที่เป็นดังนี้:

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

หากต้องการเรียกใช้เพียงตั้งชื่อที่ถูกต้องให้กับฟังก์ชั่นแล้วเรียกมันว่าเป็นฟังก์ชั่นปกติที่อยู่ในคำสั่งพิมพ์ ดังนั้นหากคำถามถูกตั้งชื่อUให้เรียกมันว่าชอบprint(U(<String>, <Integer Gender-Plurality mapping>))แต่เรียกมันเหมือน

ลองออนไลน์! (Ideone)


zzz and yyy or xxxสั้นกว่าสองไบต์[xxx,yyy][bool(zzz)]
Leaky Nun

@LeakyNun ฉันทำได้ใช่ไหม? ว้าวฉันไม่รู้ด้วยซ้ำ ขอบคุณ! :)
R. Kap

มันทำงานได้นานเท่าที่yyyเป็นจริง
Leun Nun

@LeakyNun Yeah แน่นอน
R. Kap

["l'",'gli '][b%2]สั้นกว่า 3 ไบต์["l'",'gli ',"l'"][b]
Leaky Nun

4

Java, 227 208 195 ไบต์

-13 ไบต์ขอบคุณ Leaky Nun

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;}

รับสายของคุณและ int ตามแผนที่ต่อไปนี้:

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

ส่งคืนสตริงพร้อมผลลัพธ์

Ungolfed กับกรณีทดสอบและไม่มีผู้ประกอบการที่สาม (สำหรับจริงตอนนี้):

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));
    }
}

ใช้เวทย์มนตร์ Regex เล็กน้อยและทำหน้าที่ขึ้นอยู่กับสองบูลีนที่ระบุ ด้วยความประหลาดใจของฉันไม่จำเป็นต้องมีการนำเข้าซึ่งช่วยในเรื่องขนาดรหัส!


1
ของฉันคือ ... นานกว่า JAVA! ฉันต้องตีกอล์ฟลงให้เร็วขึ้น! ทำได้ดีมาก! +1
R. Kap

ถ้าฉันต้องเอาข้อโต้แย้งของฉันจาก command line หรือ stdin เชื่อฉันมันคงจะนานกว่านี้อีกแล้ว: P

ใช่ Booleans ก็ยอมรับเช่นกัน ฉันแก้ไขแล้วใน
Luis Mendo

ฉันคิดว่าคุณสามารถใช้0/1แทนfalse/trueซึ่งจะช่วยให้คุณประหยัดบางไบต์
Leun Nun

การไม่ใช้String e = "[^aeiou]).*";จริงช่วยให้คุณประหยัด 5 ไบต์
Leun Nun

3

ทับทิม, 147 146 ไบต์

ลองออนไลน์หรือไม่

อาจเป็นไปได้ที่จะใช้วิธีที่ดีกว่าในการพิจารณาว่าจะใช้บทความใด แต่ฉันไม่ทราบเลย

ตามข้อมูลจำเพาะตัวระบุคือตัวเลขดังต่อไปนี้:

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

แบตช์446 390 385 380 ไบต์

@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%

เวอร์ชันใหม่ใช้การ0-3เข้ารหัสเดียวกันสำหรับเพศและหมายเลขเป็นคำตอบอื่น ๆ ทำงานโดยการสร้างอาร์เรย์ 1 มิติ%2.. %13รูปแบบแล้วขยับออกมาครั้งแรก1+%1องค์ประกอบเพื่อให้รูปแบบที่น่าสนใจกลายเป็น%1, %5และ%9(ซึ่งเป็นโชคดีเป็นรุ่นที่จะไม่ไปข้างต้น%9โดยไม่ต้องขยับ) จากนั้นจะตรวจสอบรายการคำนำหน้าอย่างลำบากเพื่อค้นหาว่าต้องใช้แบบฟอร์มใด _ถูกใช้เป็นตัวยึดตำแหน่งเพื่อแทนช่องว่างจนกว่าคำจะถูกส่งออก


พวกเขาอาจมีการเข้ารหัสเป็นหลักเดียว (หรือตัวอักษรหากจำเป็นเนื่องจาก spec ช่วยให้มัน) เพื่อบันทึกไบต์ ทุกอย่างเพื่อประโยชน์ของไบต์!
หมึกมูลค่า

@ KevinLau-notKenny การเปลี่ยนไปใช้การเข้ารหัสหลักทำให้ฉันสามารถบันทึกได้ถึง 56 ไบต์ด้วยการเขียนเพศและหมายเลข!
Neil

1

Python 3, 235 ไบต์

ฉันสนใจที่จะดูว่าฉันจะได้รับ Python เพียงสั้น ๆ โดยไม่ต้อง regexes ปรากฎว่านี่ไม่ใช่ตัวเลือกที่ดีที่สุด ...

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

ฟังก์ชันที่ไม่ระบุตัวตนที่รับอินพุตผ่านอาร์กิวเมนต์ของคำsและรหัสเพศหมายเลขcเป็นจำนวนเต็มโดยใช้การจับคู่ดังต่อไปนี้:

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

และส่งคืนคำด้วยบทความที่ถูกต้อง

มันทำงานอย่างไร

มีการสร้างรายการที่มีความเป็นไปได้สำหรับแต่ละcรายการแยกกัน จากนั้นรายการจะถูกจัดทำดัชนีโดยใช้ค่าcซึ่งให้รายการ 3 องค์ประกอบพร้อมตัวเลือกที่เกี่ยวข้อง ตอนนี้ดัชนีรายการจะถูกเลือกโดยการทำดัชนีไปยังรายการที่ซ้อนอยู่อีกรายการด้วยผลลัพธ์ของนิพจน์บูลีน ถ้าตัวอักษรตัวแรกของsเป็นเสียงสระและไม่ได้iตามด้วยสระตัวเลือกสำหรับการจะส่งผลให้ผู้ผ่านการกลับมาของดัชนีvowel 0อื่นนิพจน์บูลีนกลับมาTrueสำหรับcons. BและFalseสำหรับcons. Aการประเมินผลผลิตดัชนี2และ1ตามลำดับ ในที่สุดดัชนีจะถูกใช้เพื่อให้ได้ผลลัพธ์ของบทความซึ่งต่อกันกับช่องว่างและสตริงเดิมก่อนที่จะถูกส่งคืน

ลองใช้กับ Ideone


1

JavaScript 210 ไบต์

(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}

ฟังก์ชั่นที่ไม่ระบุชื่อรับสองพารามิเตอร์ s และ p ที่ไหน

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

หลังจากกำหนดฟังก์ชั่นให้กับตัวแปรและการเอาออกบางส่วน) จะสามารถทดสอบได้

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))

ที่ไหน

  • cเป็นฟังก์ชั่นในการทดสอบสำหรับพยัญชนะที่ตำแหน่งsi
  • r ประเมินเป็น 0 สำหรับการเริ่มต้นด้วยเสียงสระ 1 สำหรับการเริ่มต้นด้วยพยัญชนะประเภท A และ 2 สำหรับการเริ่มต้นด้วยพยัญชนะประเภท B (ทดสอบในลำดับที่กลับกัน)
  • การทุบตีบิตในข้อความสั่ง return จะรวมเข้าด้วยกัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.