Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Challenges

Post History

66%
+2 −0
Challenges Construct the Irish possessive

Python 3.8+, 577 bytes (was 634 than 591 bytes before) V="eéiíaáoóuúEÉIÍAÁOÓUÚ" r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)} s=la...

posted 8mo ago by Arpad Horvath‭  ·  edited 8mo ago by Arpad Horvath‭

Answer
#14: Post edited by user avatar Arpad Horvath‭ · 2024-04-18T09:52:09Z (8 months ago)
small fix
  • # [Python 3.8+], 577 bytes
  • (was 634 than 591 bytes before)
  • <!-- language-all: lang-python -->
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,R=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][R](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • [Try it online!][TIO-lv4qojcl]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qojcl]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9W@OFhcfb7@Y3VQNFdVeK@x26jmrdRo@uj37nb8RU@NeqjoaKr@Ur7Kaq@hGlWFPxb95f1iWo2vYAur/atV25cqmo1ho71q7a2u3u5fX1@9/aVaYv@36zfj2crvb9ooeqoYqGKiirkqlo03xXw8WjZbrf/4zbDgbc8M7ibzKtO6bsNKn/ar@nufVLXfT2Jzn9r966uL6@ZDy7v2m6vW/o4azBZqoVytierdKTNVg9uhupuq@a1aGlq7SrqKfP2D6jP69XofVBfOZm@1o8K4sm1Mf2nsuf@r/nt91eztH6xgP63/Nnt7K/GP0Lr@0dNFv1AH6mqn6W@TtmroRfl96i4mu@Gy1a6gu2k4NBy6W4hDrYaC2oQy6O8wTqtbTU1/4dPdLccT7t5LI9okSwgOZrfldx@bzNTt0F1zM4RGQDBDqNUtQzZBcRpaIXRSEzYVlBB7I8G1kbUZRJlF@XynSSeMhBAFTBJAKQpUexfY1jCfTnIUCHq8BApSBBRFRpt0HREA0V75vETP3tAPuCZhIzFIEtaqx6FNIZuKgoSd3x2fDnoU8HYyoU2yAsektolim0RrE6U2idIGhTaJzoZkNqnKholsUo0Nl9ikChsS2Ijtm9F0Wlq9AAczxDEX4SFTC4ESD2llkoh9ISLLoCYP@UaSlAJhHgvdJM1pU18zCcGH0NeL8AHs@iuujsgwBMKIqk7JmZUsIhREFrokmwpmyKFH8oA2sjin4FLJQef3V9wFkWEIXBBVLpxZySJCF2TBhU0FF@TgwgPayOKcgstghE1jMBzJlgHIcAQugLQajGSriICmoAcgp3E7jPPAAqiXEFgbUZcxNJj19Jgc/EBYIDYSowniassc2hSyqWSEGJzYfLTCBHrxiDbJGoKD3V25meK/0N3QD7gdYSMx2BGu2hKHNoVsKtoR9jcenw5yFAh3nkhok6zAMaiNdNELv0b@imshMgyBEqLq14gzK1lEqIMs/BqxqWCDHH6NeEAbWZxTbAn/zCbVuQa6AgxEY4gBIwPYHmLAdQiZsLWECFCriAnoFqIMNoyYwp4hY9rUlksyYD0uv0@GcHOGa65M1AgKvkS1hPZ1iJpEnSSfDILEvZ4IaLOlfFh7onugNBlqeVsCMhyBDqDqbKblPRkBTUEPQP5YqJPbEVg4D@rkVqwvRns3Cx137wZy/4CNxOQA2BVm0KaQTY0ugINNnE0@wMGIBbR5fXHwmurq9puCGAy4WORGcjCLXCfYbsMoF7n/teIFQC8mwq@UiGizdZGwh9loMLoL/SNccj@ChkOQI1j1DUFtQhlEM6KhX/DpYEYJ6BUiok2yhODYG5/H0Bef5aMZgIkAe@HzGPvgs3wiEyFAve95zPrec/IgBor97jl5CFNZxmD389liid/0Z2o@hCH3YBGTRsCIRbSay4CtB0QJNGQRf@CQZUCUhcKZI0lpU1tNRkC7@oKJzv6S@yIznIEoMi2QfQ2hGzInxiaCFFJvxLE2rxYOaxa98vsSH1Ew4CqRG8lBJ3KdYLsNo1bkTkwUALWY8HIyos3WRWAPA/blEgZCccC@V3KOioP43U1iuw2T4oB/kxQFUHEgvkTKiDZbF4E9jOEBVQkM3bXwA2gERDmAVVmGbILiNLIC6J3iTDQCGnwY1ua1RdFk4uTwEY0joRMTJkmgU0zoNGC3B0gvJryhKIKSMRM8ZUibnywFe5mzJzcMhO6cPbk5R9l5fGpKbLdhEp3zJ7cogJpz8eSWEW22LgJ7YL2yGNa6ZcHaJccoGLtXUWuZHA7rXbPgbbOo981CNM6i3jlfXhy9lqNyMzL9GbrRWOjxlKml0JKndD1kfx4iaZ7y4kkxlOe58AGkQW3@xbKwN3oHWaTvIAt6B1mk7yALfClYJO8gI6i9gyziO8gifQVZsFeQRfoGsr4Y7H3Z13fDse7hc3A5pB9wDxEz9Rg4iZhWyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkdzDt5Jdd8E/BAAmAtAGUJ1JGbGCEEA9IOFMGqeBE1A4kzKsjSjLGJ6oN2M8UrsrcaYGZBjCUzUgd6xmzEoWEZ2sgcHROk7FszVwPFyzgDayOKfgkl2UXz@6i9PdcMltCOYcgg/BTA0FtQllEJ2Ill8v1JTPBikKvOv8mSa0SRbgGLTelV9zb3Wm3nXcNddCmAsIWggz9Y4hm6A4DZUQOqMJmwpCiL2P4NrI2gyizEX59CEjnTASQhTIkwBKUaDau8C2hvl0kqNA0OMlUJAioCgy2qTriACIHpZPl@h52PEDrkk4lxgkCWfqkEObQjYVBQk7vzs@HfQo4O1kQptkBY5JbR3F1onWOkqtE6U1Cq0TnTXJrFOVNRNZpxprLrFOFdYksBbbz48/fiy/ZRfgkHdwzEV4KK@FQImHMpUnEftCRJZBTR7yXSQpBcI8FnpJmtOmvmYSgg/hfXYRPoBdf8XVEeUMgTCiqk1yZiWLCAWReTk2E8QQBynOtZGlGcQH2LcMer6/Eg8wQDlD@AADVIlwZiWLiB5gwLwIm4nPL8BBhHNtZGkGQeToGNvFUedYNgtAOUcgAihTR8eySURAU1ACkHO4HcZ54ADUKwisjajLGBqcHWYn5OAHwgJxLjGaIK62zKFNIZtKRojBic1HK0ygF49ok6whONh9KNcf8V/oQ8cPuB3hXGKwI5ypDxzaFLKpaEfY33V8OshRINx3IqFNsgLHoHacdQ/D75C/4lqIcoZACVH1O8SZlSwi1EHmbdhMkEEcXDjXRpZmEJvB32en1XEG@gEMREuIgVwGsDHEgOsNMmFrCRGgJhEToU@IKtgqYgi6hUxpU1tMRkD5pPx62oHbMlxzX6K5oCBLNJPQvg7Rkagz5JNBj7iXEwFttpQPa59mh6B02snkDQko5wh0AGXqNJN3YwQ0BT0AOYs4CxyAeQMGtXl5Mdp7fpHF3buB3D/gXGJyAOwKM2hTyKZGF8DBJs4mH@BgxALavL44eH3MqtvvI4jBgItFnksOZpFnCbbbMMpF7uxEAdCLCe8nI9psXSTs4ez46PhDaB7hkvsRzDkEOYJV0xDUJpRBNCPqmwWfDWIUCI1CJLRJFuAYu@LTCXTEJ/lEBpBHgF3w6QQ74JN8EBMhQF3v6SR2vKfk8QsQOt1T8uSlohHB1s/PLi7xS/2ZOu/AkEuwSJ5GQIdFMnUuA7YeECVQj0X8IUOWAU0WCueMJKVNbTUZAe3q6yQ6@0vuiyznDESRZQLZ1xC6IXNibCJIIfVGHGvzauGwZvew/HqJDycYcJXIc8lBJ/IswXYbRq3InZgoAGox4eVkRJuti8AejthXSRgIxSP2LZJzVDyK39QkttswKR7x742iACoeia@MMqLN1kVgDyfl3yjYcdfCD2AuIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomp04OH844EjoxkScJdIqJLA3Y7QHSiwlvKIqgZMwETxnS5idLwV7O2TMbBkL3nD2zOUfZ8/i8lNhuwyR6zp/ZogBqnotntoxos3UR2APrld1OrVt2WbvkGAVj9@rWWiaHnXrX7PK22a33za5onN1653x5cfS6PC7Xx/n7M3SjsdDjqbyWQkueyuoh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdEbx276xrFLbxy76RvHLr4C7CZvHCOovXHsxjeO3fSFY5e9cOym7xvri8HeL99nHzon2SE@By879APuIWJ5PQZOIpapyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkfz5LnwYu@6CfwgA8ghAG0B1IGXECkIA9YD4A2mcBUoAw4GUUW1E0YjwLL0@wcO0uxKnaUA5Q3ieBuQO1IxZySKiMzWwcKiOM/FUDRiO1YxrI0sTvPZ/FbfsF8sbPR6Hv3hT/s/jRm3V/NxWD2216Bf342VLjaaqP72f9Bd62W/6v1uDuPvf5OEm5NSB/4NC9dAipouiv1jyyAEUbatB4/Hzl7Z6fPiiiuHsfmzU3ehTXz0GXpHpbKkeaeoX1Xwc7b390mr46vPFaLpsNrLxWBX3vV6/b/qm0drZ2RkN1M3NVE/6NzdutcbNzUSPpjc3jbDjKPzj/w "Python 3.8 (pre-release) – Try It Online"
  • A reference implementation, to understand the details.
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • # Python 3.8+, 577 bytes
  • (was 634 than 591 bytes before)
  • <!-- language-all: lang-python -->
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,R=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][R](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • [Try it online!][TIO-lv4qojcl]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qojcl]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9W@OFhcfb7@Y3VQNFdVeK@x26jmrdRo@uj37nb8RU@NeqjoaKr@Ur7Kaq@hGlWFPxb95f1iWo2vYAur/atV25cqmo1ho71q7a2u3u5fX1@9/aVaYv@36zfj2crvb9ooeqoYqGKiirkqlo03xXw8WjZbrf/4zbDgbc8M7ibzKtO6bsNKn/ar@nufVLXfT2Jzn9r966uL6@ZDy7v2m6vW/o4azBZqoVytierdKTNVg9uhupuq@a1aGlq7SrqKfP2D6jP69XofVBfOZm@1o8K4sm1Mf2nsuf@r/nt91eztH6xgP63/Nnt7K/GP0Lr@0dNFv1AH6mqn6W@TtmroRfl96i4mu@Gy1a6gu2k4NBy6W4hDrYaC2oQy6O8wTqtbTU1/4dPdLccT7t5LI9okSwgOZrfldx@bzNTt0F1zM4RGQDBDqNUtQzZBcRpaIXRSEzYVlBB7I8G1kbUZRJlF@XynSSeMhBAFTBJAKQpUexfY1jCfTnIUCHq8BApSBBRFRpt0HREA0V75vETP3tAPuCZhIzFIEtaqx6FNIZuKgoSd3x2fDnoU8HYyoU2yAsektolim0RrE6U2idIGhTaJzoZkNqnKholsUo0Nl9ikChsS2Ijtm9F0Wlq9AAczxDEX4SFTC4ESD2llkoh9ISLLoCYP@UaSlAJhHgvdJM1pU18zCcGH0NeL8AHs@iuujsgwBMKIqk7JmZUsIhREFrokmwpmyKFH8oA2sjin4FLJQef3V9wFkWEIXBBVLpxZySJCF2TBhU0FF@TgwgPayOKcgstghE1jMBzJlgHIcAQugLQajGSriICmoAcgp3E7jPPAAqiXEFgbUZcxNJj19Jgc/EBYIDYSowniassc2hSyqWSEGJzYfLTCBHrxiDbJGoKD3V25meK/0N3QD7gdYSMx2BGu2hKHNoVsKtoR9jcenw5yFAh3nkhok6zAMaiNdNELv0b@imshMgyBEqLq14gzK1lEqIMs/BqxqWCDHH6NeEAbWZxTbAn/zCbVuQa6AgxEY4gBIwPYHmLAdQiZsLWECFCriAnoFqIMNoyYwp4hY9rUlksyYD0uv0@GcHOGa65M1AgKvkS1hPZ1iJpEnSSfDILEvZ4IaLOlfFh7onugNBlqeVsCMhyBDqDqbKblPRkBTUEPQP5YqJPbEVg4D@rkVqwvRns3Cx137wZy/4CNxOQA2BVm0KaQTY0ugINNnE0@wMGIBbR5fXHwmurq9puCGAy4WORGcjCLXCfYbsMoF7n/teIFQC8mwq@UiGizdZGwh9loMLoL/SNccj@ChkOQI1j1DUFtQhlEM6KhX/DpYEYJ6BUiok2yhODYG5/H0Bef5aMZgIkAe@HzGPvgs3wiEyFAve95zPrec/IgBor97jl5CFNZxmD389liid/0Z2o@hCH3YBGTRsCIRbSay4CtB0QJNGQRf@CQZUCUhcKZI0lpU1tNRkC7@oKJzv6S@yIznIEoMi2QfQ2hGzInxiaCFFJvxLE2rxYOaxa98vsSH1Ew4CqRG8lBJ3KdYLsNo1bkTkwUALWY8HIyos3WRWAPA/blEgZCccC@V3KOioP43U1iuw2T4oB/kxQFUHEgvkTKiDZbF4E9jOEBVQkM3bXwA2gERDmAVVmGbILiNLIC6J3iTDQCGnwY1ua1RdFk4uTwEY0joRMTJkmgU0zoNGC3B0gvJryhKIKSMRM8ZUibnywFe5mzJzcMhO6cPbk5R9l5fGpKbLdhEp3zJ7cogJpz8eSWEW22LgJ7YL2yGNa6ZcHaJccoGLtXUWuZHA7rXbPgbbOo981CNM6i3jlfXhy9lqNyMzL9GbrRWOjxlKml0JKndD1kfx4iaZ7y4kkxlOe58AGkQW3@xbKwN3oHWaTvIAt6B1mk7yALfClYJO8gI6i9gyziO8gifQVZsFeQRfoGsr4Y7H3Z13fDse7hc3A5pB9wDxEz9Rg4iZhWyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkdzDt5Jdd8E/BAAmAtAGUJ1JGbGCEEA9IOFMGqeBE1A4kzKsjSjLGJ6oN2M8UrsrcaYGZBjCUzUgd6xmzEoWEZ2sgcHROk7FszVwPFyzgDayOKfgkl2UXz@6i9PdcMltCOYcgg/BTA0FtQllEJ2Ill8v1JTPBikKvOv8mSa0SRbgGLTelV9zb3Wm3nXcNddCmAsIWggz9Y4hm6A4DZUQOqMJmwpCiL2P4NrI2gyizEX59CEjnTASQhTIkwBKUaDau8C2hvl0kqNA0OMlUJAioCgy2qTriACIHpZPl@h52PEDrkk4lxgkCWfqkEObQjYVBQk7vzs@HfQo4O1kQptkBY5JbR3F1onWOkqtE6U1Cq0TnTXJrFOVNRNZpxprLrFOFdYksBbbz48/fiy/ZRfgkHdwzEV4KK@FQImHMpUnEftCRJZBTR7yXSQpBcI8FnpJmtOmvmYSgg/hfXYRPoBdf8XVEeUMgTCiqk1yZiWLCAWReTk2E8QQBynOtZGlGcQH2LcMer6/Eg8wQDlD@AADVIlwZiWLiB5gwLwIm4nPL8BBhHNtZGkGQeToGNvFUedYNgtAOUcgAihTR8eySURAU1ACkHO4HcZ54ADUKwisjajLGBqcHWYn5OAHwgJxLjGaIK62zKFNIZtKRojBic1HK0ygF49ok6whONh9KNcf8V/oQ8cPuB3hXGKwI5ypDxzaFLKpaEfY33V8OshRINx3IqFNsgLHoHacdQ/D75C/4lqIcoZACVH1O8SZlSwi1EHmbdhMkEEcXDjXRpZmEJvB32en1XEG@gEMREuIgVwGsDHEgOsNMmFrCRGgJhEToU@IKtgqYgi6hUxpU1tMRkD5pPx62oHbMlxzX6K5oCBLNJPQvg7Rkagz5JNBj7iXEwFttpQPa59mh6B02snkDQko5wh0AGXqNJN3YwQ0BT0AOYs4CxyAeQMGtXl5Mdp7fpHF3buB3D/gXGJyAOwKM2hTyKZGF8DBJs4mH@BgxALavL44eH3MqtvvI4jBgItFnksOZpFnCbbbMMpF7uxEAdCLCe8nI9psXSTs4ez46PhDaB7hkvsRzDkEOYJV0xDUJpRBNCPqmwWfDWIUCI1CJLRJFuAYu@LTCXTEJ/lEBpBHgF3w6QQ74JN8EBMhQF3v6SR2vKfk8QsQOt1T8uSlohHB1s/PLi7xS/2ZOu/AkEuwSJ5GQIdFMnUuA7YeECVQj0X8IUOWAU0WCueMJKVNbTUZAe3q6yQ6@0vuiyznDESRZQLZ1xC6IXNibCJIIfVGHGvzauGwZvew/HqJDycYcJXIc8lBJ/IswXYbRq3InZgoAGox4eVkRJuti8AejthXSRgIxSP2LZJzVDyK39QkttswKR7x742iACoeia@MMqLN1kVgDyfl3yjYcdfCD2AuIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomp04OH844EjoxkScJdIqJLA3Y7QHSiwlvKIqgZMwETxnS5idLwV7O2TMbBkL3nD2zOUfZ8/i8lNhuwyR6zp/ZogBqnotntoxos3UR2APrld1OrVt2WbvkGAVj9@rWWiaHnXrX7PK22a33za5onN1653x5cfS6PC7Xx/n7M3SjsdDjqbyWQkueyuoh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdEbx276xrFLbxy76RvHLr4C7CZvHCOovXHsxjeO3fSFY5e9cOym7xvri8HeL99nHzon2SE@By879APuIWJ5PQZOIpapyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkfz5LnwYu@6CfwgA8ghAG0B1IGXECkIA9YD4A2mcBUoAw4GUUW1E0YjwLL0@wcO0uxKnaUA5Q3ieBuQO1IxZySKiMzWwcKiOM/FUDRiO1YxrI0sTvPZ/FbfsF8sbPR6Hv3hT/s/jRm3V/NxWD2216Bf342VLjaaqP72f9Bd62W/6v1uDuPvf5OEm5NSB/4NC9dAipouiv1jyyAEUbatB4/Hzl7Z6fPiiiuHsfmzU3ehTXz0GXpHpbKkeaeoX1Xwc7b390mr46vPFaLpsNrLxWBX3vV6/b/qm0drZ2RkN1M3NVE/6NzdutcbNzUSPpjc3jbDjKPzj/w "Python 3.8 (pre-release) – Try It Online"
  • A reference implementation, to understand the details.
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
#13: Post edited by user avatar Arpad Horvath‭ · 2024-04-18T04:32:49Z (8 months ago)
remove test
  • # [Python 3.8 (pre-release)], 577 bytes (was 634 than 591 before)
  • <!-- language-all: lang-python -->
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,R=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][R](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • [Try it online!][TIO-lv4qojcl]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qojcl]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9W@OFhcfb7@Y3VQNFdVeK@x26jmrdRo@uj37nb8RU@NeqjoaKr@Ur7Kaq@hGlWFPxb95f1iWo2vYAur/atV25cqmo1ho71q7a2u3u5fX1@9/aVaYv@36zfj2crvb9ooeqoYqGKiirkqlo03xXw8WjZbrf/4zbDgbc8M7ibzKtO6bsNKn/ar@nufVLXfT2Jzn9r966uL6@ZDy7v2m6vW/o4azBZqoVytierdKTNVg9uhupuq@a1aGlq7SrqKfP2D6jP69XofVBfOZm@1o8K4sm1Mf2nsuf@r/nt91eztH6xgP63/Nnt7K/GP0Lr@0dNFv1AH6mqn6W@TtmroRfl96i4mu@Gy1a6gu2k4NBy6W4hDrYaC2oQy6O8wTqtbTU1/4dPdLccT7t5LI9okSwgOZrfldx@bzNTt0F1zM4RGQDBDqNUtQzZBcRpaIXRSEzYVlBB7I8G1kbUZRJlF@XynSSeMhBAFTBJAKQpUexfY1jCfTnIUCHq8BApSBBRFRpt0HREA0V75vETP3tAPuCZhIzFIEtaqx6FNIZuKgoSd3x2fDnoU8HYyoU2yAsektolim0RrE6U2idIGhTaJzoZkNqnKholsUo0Nl9ikChsS2Ijtm9F0Wlq9AAczxDEX4SFTC4ESD2llkoh9ISLLoCYP@UaSlAJhHgvdJM1pU18zCcGH0NeL8AHs@iuujsgwBMKIqk7JmZUsIhREFrokmwpmyKFH8oA2sjin4FLJQef3V9wFkWEIXBBVLpxZySJCF2TBhU0FF@TgwgPayOKcgstghE1jMBzJlgHIcAQugLQajGSriICmoAcgp3E7jPPAAqiXEFgbUZcxNJj19Jgc/EBYIDYSowniassc2hSyqWSEGJzYfLTCBHrxiDbJGoKD3V25meK/0N3QD7gdYSMx2BGu2hKHNoVsKtoR9jcenw5yFAh3nkhok6zAMaiNdNELv0b@imshMgyBEqLq14gzK1lEqIMs/BqxqWCDHH6NeEAbWZxTbAn/zCbVuQa6AgxEY4gBIwPYHmLAdQiZsLWECFCriAnoFqIMNoyYwp4hY9rUlksyYD0uv0@GcHOGa65M1AgKvkS1hPZ1iJpEnSSfDILEvZ4IaLOlfFh7onugNBlqeVsCMhyBDqDqbKblPRkBTUEPQP5YqJPbEVg4D@rkVqwvRns3Cx137wZy/4CNxOQA2BVm0KaQTY0ugINNnE0@wMGIBbR5fXHwmurq9puCGAy4WORGcjCLXCfYbsMoF7n/teIFQC8mwq@UiGizdZGwh9loMLoL/SNccj@ChkOQI1j1DUFtQhlEM6KhX/DpYEYJ6BUiok2yhODYG5/H0Bef5aMZgIkAe@HzGPvgs3wiEyFAve95zPrec/IgBor97jl5CFNZxmD389liid/0Z2o@hCH3YBGTRsCIRbSay4CtB0QJNGQRf@CQZUCUhcKZI0lpU1tNRkC7@oKJzv6S@yIznIEoMi2QfQ2hGzInxiaCFFJvxLE2rxYOaxa98vsSH1Ew4CqRG8lBJ3KdYLsNo1bkTkwUALWY8HIyos3WRWAPA/blEgZCccC@V3KOioP43U1iuw2T4oB/kxQFUHEgvkTKiDZbF4E9jOEBVQkM3bXwA2gERDmAVVmGbILiNLIC6J3iTDQCGnwY1ua1RdFk4uTwEY0joRMTJkmgU0zoNGC3B0gvJryhKIKSMRM8ZUibnywFe5mzJzcMhO6cPbk5R9l5fGpKbLdhEp3zJ7cogJpz8eSWEW22LgJ7YL2yGNa6ZcHaJccoGLtXUWuZHA7rXbPgbbOo981CNM6i3jlfXhy9lqNyMzL9GbrRWOjxlKml0JKndD1kfx4iaZ7y4kkxlOe58AGkQW3@xbKwN3oHWaTvIAt6B1mk7yALfClYJO8gI6i9gyziO8gifQVZsFeQRfoGsr4Y7H3Z13fDse7hc3A5pB9wDxEz9Rg4iZhWyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkdzDt5Jdd8E/BAAmAtAGUJ1JGbGCEEA9IOFMGqeBE1A4kzKsjSjLGJ6oN2M8UrsrcaYGZBjCUzUgd6xmzEoWEZ2sgcHROk7FszVwPFyzgDayOKfgkl2UXz@6i9PdcMltCOYcgg/BTA0FtQllEJ2Ill8v1JTPBikKvOv8mSa0SRbgGLTelV9zb3Wm3nXcNddCmAsIWggz9Y4hm6A4DZUQOqMJmwpCiL2P4NrI2gyizEX59CEjnTASQhTIkwBKUaDau8C2hvl0kqNA0OMlUJAioCgy2qTriACIHpZPl@h52PEDrkk4lxgkCWfqkEObQjYVBQk7vzs@HfQo4O1kQptkBY5JbR3F1onWOkqtE6U1Cq0TnTXJrFOVNRNZpxprLrFOFdYksBbbz48/fiy/ZRfgkHdwzEV4KK@FQImHMpUnEftCRJZBTR7yXSQpBcI8FnpJmtOmvmYSgg/hfXYRPoBdf8XVEeUMgTCiqk1yZiWLCAWReTk2E8QQBynOtZGlGcQH2LcMer6/Eg8wQDlD@AADVIlwZiWLiB5gwLwIm4nPL8BBhHNtZGkGQeToGNvFUedYNgtAOUcgAihTR8eySURAU1ACkHO4HcZ54ADUKwisjajLGBqcHWYn5OAHwgJxLjGaIK62zKFNIZtKRojBic1HK0ygF49ok6whONh9KNcf8V/oQ8cPuB3hXGKwI5ypDxzaFLKpaEfY33V8OshRINx3IqFNsgLHoHacdQ/D75C/4lqIcoZACVH1O8SZlSwi1EHmbdhMkEEcXDjXRpZmEJvB32en1XEG@gEMREuIgVwGsDHEgOsNMmFrCRGgJhEToU@IKtgqYgi6hUxpU1tMRkD5pPx62oHbMlxzX6K5oCBLNJPQvg7Rkagz5JNBj7iXEwFttpQPa59mh6B02snkDQko5wh0AGXqNJN3YwQ0BT0AOYs4CxyAeQMGtXl5Mdp7fpHF3buB3D/gXGJyAOwKM2hTyKZGF8DBJs4mH@BgxALavL44eH3MqtvvI4jBgItFnksOZpFnCbbbMMpF7uxEAdCLCe8nI9psXSTs4ez46PhDaB7hkvsRzDkEOYJV0xDUJpRBNCPqmwWfDWIUCI1CJLRJFuAYu@LTCXTEJ/lEBpBHgF3w6QQ74JN8EBMhQF3v6SR2vKfk8QsQOt1T8uSlohHB1s/PLi7xS/2ZOu/AkEuwSJ5GQIdFMnUuA7YeECVQj0X8IUOWAU0WCueMJKVNbTUZAe3q6yQ6@0vuiyznDESRZQLZ1xC6IXNibCJIIfVGHGvzauGwZvew/HqJDycYcJXIc8lBJ/IswXYbRq3InZgoAGox4eVkRJuti8AejthXSRgIxSP2LZJzVDyK39QkttswKR7x742iACoeia@MMqLN1kVgDyfl3yjYcdfCD2AuIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomp04OH844EjoxkScJdIqJLA3Y7QHSiwlvKIqgZMwETxnS5idLwV7O2TMbBkL3nD2zOUfZ8/i8lNhuwyR6zp/ZogBqnotntoxos3UR2APrld1OrVt2WbvkGAVj9@rWWiaHnXrX7PK22a33za5onN1653x5cfS6PC7Xx/n7M3SjsdDjqbyWQkueyuoh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdEbx276xrFLbxy76RvHLr4C7CZvHCOovXHsxjeO3fSFY5e9cOym7xvri8HeL99nHzon2SE@By879APuIWJ5PQZOIpapyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkfz5LnwYu@6CfwgA8ghAG0B1IGXECkIA9YD4A2mcBUoAw4GUUW1E0YjwLL0@wcO0uxKnaUA5Q3ieBuQO1IxZySKiMzWwcKiOM/FUDRiO1YxrI0sTvPZ/FbfsF8sbPR6Hv3hT/s/jRm3V/NxWD2216Bf342VLjaaqP72f9Bd62W/6v1uDuPvf5OEm5NSB/4NC9dAipouiv1jyyAEUbatB4/Hzl7Z6fPiiiuHsfmzU3ehTXz0GXpHpbKkeaeoX1Xwc7b390mr46vPFaLpsNrLxWBX3vV6/b/qm0drZ2RkN1M3NVE/6NzdutcbNzUSPpjc3jbDjKPzj/w "Python 3.8 (pre-release) – Try It Online"
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • # [Python 3.8+], 577 bytes
  • (was 634 than 591 bytes before)
  • <!-- language-all: lang-python -->
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,R=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][R](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • [Try it online!][TIO-lv4qojcl]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qojcl]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9W@OFhcfb7@Y3VQNFdVeK@x26jmrdRo@uj37nb8RU@NeqjoaKr@Ur7Kaq@hGlWFPxb95f1iWo2vYAur/atV25cqmo1ho71q7a2u3u5fX1@9/aVaYv@36zfj2crvb9ooeqoYqGKiirkqlo03xXw8WjZbrf/4zbDgbc8M7ibzKtO6bsNKn/ar@nufVLXfT2Jzn9r966uL6@ZDy7v2m6vW/o4azBZqoVytierdKTNVg9uhupuq@a1aGlq7SrqKfP2D6jP69XofVBfOZm@1o8K4sm1Mf2nsuf@r/nt91eztH6xgP63/Nnt7K/GP0Lr@0dNFv1AH6mqn6W@TtmroRfl96i4mu@Gy1a6gu2k4NBy6W4hDrYaC2oQy6O8wTqtbTU1/4dPdLccT7t5LI9okSwgOZrfldx@bzNTt0F1zM4RGQDBDqNUtQzZBcRpaIXRSEzYVlBB7I8G1kbUZRJlF@XynSSeMhBAFTBJAKQpUexfY1jCfTnIUCHq8BApSBBRFRpt0HREA0V75vETP3tAPuCZhIzFIEtaqx6FNIZuKgoSd3x2fDnoU8HYyoU2yAsektolim0RrE6U2idIGhTaJzoZkNqnKholsUo0Nl9ikChsS2Ijtm9F0Wlq9AAczxDEX4SFTC4ESD2llkoh9ISLLoCYP@UaSlAJhHgvdJM1pU18zCcGH0NeL8AHs@iuujsgwBMKIqk7JmZUsIhREFrokmwpmyKFH8oA2sjin4FLJQef3V9wFkWEIXBBVLpxZySJCF2TBhU0FF@TgwgPayOKcgstghE1jMBzJlgHIcAQugLQajGSriICmoAcgp3E7jPPAAqiXEFgbUZcxNJj19Jgc/EBYIDYSowniassc2hSyqWSEGJzYfLTCBHrxiDbJGoKD3V25meK/0N3QD7gdYSMx2BGu2hKHNoVsKtoR9jcenw5yFAh3nkhok6zAMaiNdNELv0b@imshMgyBEqLq14gzK1lEqIMs/BqxqWCDHH6NeEAbWZxTbAn/zCbVuQa6AgxEY4gBIwPYHmLAdQiZsLWECFCriAnoFqIMNoyYwp4hY9rUlksyYD0uv0@GcHOGa65M1AgKvkS1hPZ1iJpEnSSfDILEvZ4IaLOlfFh7onugNBlqeVsCMhyBDqDqbKblPRkBTUEPQP5YqJPbEVg4D@rkVqwvRns3Cx137wZy/4CNxOQA2BVm0KaQTY0ugINNnE0@wMGIBbR5fXHwmurq9puCGAy4WORGcjCLXCfYbsMoF7n/teIFQC8mwq@UiGizdZGwh9loMLoL/SNccj@ChkOQI1j1DUFtQhlEM6KhX/DpYEYJ6BUiok2yhODYG5/H0Bef5aMZgIkAe@HzGPvgs3wiEyFAve95zPrec/IgBor97jl5CFNZxmD389liid/0Z2o@hCH3YBGTRsCIRbSay4CtB0QJNGQRf@CQZUCUhcKZI0lpU1tNRkC7@oKJzv6S@yIznIEoMi2QfQ2hGzInxiaCFFJvxLE2rxYOaxa98vsSH1Ew4CqRG8lBJ3KdYLsNo1bkTkwUALWY8HIyos3WRWAPA/blEgZCccC@V3KOioP43U1iuw2T4oB/kxQFUHEgvkTKiDZbF4E9jOEBVQkM3bXwA2gERDmAVVmGbILiNLIC6J3iTDQCGnwY1ua1RdFk4uTwEY0joRMTJkmgU0zoNGC3B0gvJryhKIKSMRM8ZUibnywFe5mzJzcMhO6cPbk5R9l5fGpKbLdhEp3zJ7cogJpz8eSWEW22LgJ7YL2yGNa6ZcHaJccoGLtXUWuZHA7rXbPgbbOo981CNM6i3jlfXhy9lqNyMzL9GbrRWOjxlKml0JKndD1kfx4iaZ7y4kkxlOe58AGkQW3@xbKwN3oHWaTvIAt6B1mk7yALfClYJO8gI6i9gyziO8gifQVZsFeQRfoGsr4Y7H3Z13fDse7hc3A5pB9wDxEz9Rg4iZhWyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkdzDt5Jdd8E/BAAmAtAGUJ1JGbGCEEA9IOFMGqeBE1A4kzKsjSjLGJ6oN2M8UrsrcaYGZBjCUzUgd6xmzEoWEZ2sgcHROk7FszVwPFyzgDayOKfgkl2UXz@6i9PdcMltCOYcgg/BTA0FtQllEJ2Ill8v1JTPBikKvOv8mSa0SRbgGLTelV9zb3Wm3nXcNddCmAsIWggz9Y4hm6A4DZUQOqMJmwpCiL2P4NrI2gyizEX59CEjnTASQhTIkwBKUaDau8C2hvl0kqNA0OMlUJAioCgy2qTriACIHpZPl@h52PEDrkk4lxgkCWfqkEObQjYVBQk7vzs@HfQo4O1kQptkBY5JbR3F1onWOkqtE6U1Cq0TnTXJrFOVNRNZpxprLrFOFdYksBbbz48/fiy/ZRfgkHdwzEV4KK@FQImHMpUnEftCRJZBTR7yXSQpBcI8FnpJmtOmvmYSgg/hfXYRPoBdf8XVEeUMgTCiqk1yZiWLCAWReTk2E8QQBynOtZGlGcQH2LcMer6/Eg8wQDlD@AADVIlwZiWLiB5gwLwIm4nPL8BBhHNtZGkGQeToGNvFUedYNgtAOUcgAihTR8eySURAU1ACkHO4HcZ54ADUKwisjajLGBqcHWYn5OAHwgJxLjGaIK62zKFNIZtKRojBic1HK0ygF49ok6whONh9KNcf8V/oQ8cPuB3hXGKwI5ypDxzaFLKpaEfY33V8OshRINx3IqFNsgLHoHacdQ/D75C/4lqIcoZACVH1O8SZlSwi1EHmbdhMkEEcXDjXRpZmEJvB32en1XEG@gEMREuIgVwGsDHEgOsNMmFrCRGgJhEToU@IKtgqYgi6hUxpU1tMRkD5pPx62oHbMlxzX6K5oCBLNJPQvg7Rkagz5JNBj7iXEwFttpQPa59mh6B02snkDQko5wh0AGXqNJN3YwQ0BT0AOYs4CxyAeQMGtXl5Mdp7fpHF3buB3D/gXGJyAOwKM2hTyKZGF8DBJs4mH@BgxALavL44eH3MqtvvI4jBgItFnksOZpFnCbbbMMpF7uxEAdCLCe8nI9psXSTs4ez46PhDaB7hkvsRzDkEOYJV0xDUJpRBNCPqmwWfDWIUCI1CJLRJFuAYu@LTCXTEJ/lEBpBHgF3w6QQ74JN8EBMhQF3v6SR2vKfk8QsQOt1T8uSlohHB1s/PLi7xS/2ZOu/AkEuwSJ5GQIdFMnUuA7YeECVQj0X8IUOWAU0WCueMJKVNbTUZAe3q6yQ6@0vuiyznDESRZQLZ1xC6IXNibCJIIfVGHGvzauGwZvew/HqJDycYcJXIc8lBJ/IswXYbRq3InZgoAGox4eVkRJuti8AejthXSRgIxSP2LZJzVDyK39QkttswKR7x742iACoeia@MMqLN1kVgDyfl3yjYcdfCD2AuIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomp04OH844EjoxkScJdIqJLA3Y7QHSiwlvKIqgZMwETxnS5idLwV7O2TMbBkL3nD2zOUfZ8/i8lNhuwyR6zp/ZogBqnotntoxos3UR2APrld1OrVt2WbvkGAVj9@rWWiaHnXrX7PK22a33za5onN1653x5cfS6PC7Xx/n7M3SjsdDjqbyWQkueyuoh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdEbx276xrFLbxy76RvHLr4C7CZvHCOovXHsxjeO3fSFY5e9cOym7xvri8HeL99nHzon2SE@By879APuIWJ5PQZOIpapyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkfz5LnwYu@6CfwgA8ghAG0B1IGXECkIA9YD4A2mcBUoAw4GUUW1E0YjwLL0@wcO0uxKnaUA5Q3ieBuQO1IxZySKiMzWwcKiOM/FUDRiO1YxrI0sTvPZ/FbfsF8sbPR6Hv3hT/s/jRm3V/NxWD2216Bf342VLjaaqP72f9Bd62W/6v1uDuPvf5OEm5NSB/4NC9dAipouiv1jyyAEUbatB4/Hzl7Z6fPiiiuHsfmzU3ehTXz0GXpHpbKkeaeoX1Xwc7b390mr46vPFaLpsNrLxWBX3vV6/b/qm0drZ2RkN1M3NVE/6NzdutcbNzUSPpjc3jbDjKPzj/w "Python 3.8 (pre-release) – Try It Online"
  • A reference implementation, to understand the details.
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
#12: Post edited by user avatar Arpad Horvath‭ · 2024-04-18T04:29:55Z (8 months ago)
remove duplicate
  • **Python 3.8+, 577 bytes** (was 634 than 591 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,R=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][R](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • ```
  • # [Python 3.8 (pre-release)], 577 bytes
  • <!-- language-all: lang-python -->
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,R=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][R](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • [Try it online!][TIO-lv4qojcl]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qojcl]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9W@OFhcfb7@Y3VQNFdVeK@x26jmrdRo@uj37nb8RU@NeqjoaKr@Ur7Kaq@hGlWFPxb95f1iWo2vYAur/atV25cqmo1ho71q7a2u3u5fX1@9/aVaYv@36zfj2crvb9ooeqoYqGKiirkqlo03xXw8WjZbrf/4zbDgbc8M7ibzKtO6bsNKn/ar@nufVLXfT2Jzn9r966uL6@ZDy7v2m6vW/o4azBZqoVytierdKTNVg9uhupuq@a1aGlq7SrqKfP2D6jP69XofVBfOZm@1o8K4sm1Mf2nsuf@r/nt91eztH6xgP63/Nnt7K/GP0Lr@0dNFv1AH6mqn6W@TtmroRfl96i4mu@Gy1a6gu2k4NBy6W4hDrYaC2oQy6O8wTqtbTU1/4dPdLccT7t5LI9okSwgOZrfldx@bzNTt0F1zM4RGQDBDqNUtQzZBcRpaIXRSEzYVlBB7I8G1kbUZRJlF@XynSSeMhBAFTBJAKQpUexfY1jCfTnIUCHq8BApSBBRFRpt0HREA0V75vETP3tAPuCZhIzFIEtaqx6FNIZuKgoSd3x2fDnoU8HYyoU2yAsektolim0RrE6U2idIGhTaJzoZkNqnKholsUo0Nl9ikChsS2Ijtm9F0Wlq9AAczxDEX4SFTC4ESD2llkoh9ISLLoCYP@UaSlAJhHgvdJM1pU18zCcGH0NeL8AHs@iuujsgwBMKIqk7JmZUsIhREFrokmwpmyKFH8oA2sjin4FLJQef3V9wFkWEIXBBVLpxZySJCF2TBhU0FF@TgwgPayOKcgstghE1jMBzJlgHIcAQugLQajGSriICmoAcgp3E7jPPAAqiXEFgbUZcxNJj19Jgc/EBYIDYSowniassc2hSyqWSEGJzYfLTCBHrxiDbJGoKD3V25meK/0N3QD7gdYSMx2BGu2hKHNoVsKtoR9jcenw5yFAh3nkhok6zAMaiNdNELv0b@imshMgyBEqLq14gzK1lEqIMs/BqxqWCDHH6NeEAbWZxTbAn/zCbVuQa6AgxEY4gBIwPYHmLAdQiZsLWECFCriAnoFqIMNoyYwp4hY9rUlksyYD0uv0@GcHOGa65M1AgKvkS1hPZ1iJpEnSSfDILEvZ4IaLOlfFh7onugNBlqeVsCMhyBDqDqbKblPRkBTUEPQP5YqJPbEVg4D@rkVqwvRns3Cx137wZy/4CNxOQA2BVm0KaQTY0ugINNnE0@wMGIBbR5fXHwmurq9puCGAy4WORGcjCLXCfYbsMoF7n/teIFQC8mwq@UiGizdZGwh9loMLoL/SNccj@ChkOQI1j1DUFtQhlEM6KhX/DpYEYJ6BUiok2yhODYG5/H0Bef5aMZgIkAe@HzGPvgs3wiEyFAve95zPrec/IgBor97jl5CFNZxmD389liid/0Z2o@hCH3YBGTRsCIRbSay4CtB0QJNGQRf@CQZUCUhcKZI0lpU1tNRkC7@oKJzv6S@yIznIEoMi2QfQ2hGzInxiaCFFJvxLE2rxYOaxa98vsSH1Ew4CqRG8lBJ3KdYLsNo1bkTkwUALWY8HIyos3WRWAPA/blEgZCccC@V3KOioP43U1iuw2T4oB/kxQFUHEgvkTKiDZbF4E9jOEBVQkM3bXwA2gERDmAVVmGbILiNLIC6J3iTDQCGnwY1ua1RdFk4uTwEY0joRMTJkmgU0zoNGC3B0gvJryhKIKSMRM8ZUibnywFe5mzJzcMhO6cPbk5R9l5fGpKbLdhEp3zJ7cogJpz8eSWEW22LgJ7YL2yGNa6ZcHaJccoGLtXUWuZHA7rXbPgbbOo981CNM6i3jlfXhy9lqNyMzL9GbrRWOjxlKml0JKndD1kfx4iaZ7y4kkxlOe58AGkQW3@xbKwN3oHWaTvIAt6B1mk7yALfClYJO8gI6i9gyziO8gifQVZsFeQRfoGsr4Y7H3Z13fDse7hc3A5pB9wDxEz9Rg4iZhWyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkdzDt5Jdd8E/BAAmAtAGUJ1JGbGCEEA9IOFMGqeBE1A4kzKsjSjLGJ6oN2M8UrsrcaYGZBjCUzUgd6xmzEoWEZ2sgcHROk7FszVwPFyzgDayOKfgkl2UXz@6i9PdcMltCOYcgg/BTA0FtQllEJ2Ill8v1JTPBikKvOv8mSa0SRbgGLTelV9zb3Wm3nXcNddCmAsIWggz9Y4hm6A4DZUQOqMJmwpCiL2P4NrI2gyizEX59CEjnTASQhTIkwBKUaDau8C2hvl0kqNA0OMlUJAioCgy2qTriACIHpZPl@h52PEDrkk4lxgkCWfqkEObQjYVBQk7vzs@HfQo4O1kQptkBY5JbR3F1onWOkqtE6U1Cq0TnTXJrFOVNRNZpxprLrFOFdYksBbbz48/fiy/ZRfgkHdwzEV4KK@FQImHMpUnEftCRJZBTR7yXSQpBcI8FnpJmtOmvmYSgg/hfXYRPoBdf8XVEeUMgTCiqk1yZiWLCAWReTk2E8QQBynOtZGlGcQH2LcMer6/Eg8wQDlD@AADVIlwZiWLiB5gwLwIm4nPL8BBhHNtZGkGQeToGNvFUedYNgtAOUcgAihTR8eySURAU1ACkHO4HcZ54ADUKwisjajLGBqcHWYn5OAHwgJxLjGaIK62zKFNIZtKRojBic1HK0ygF49ok6whONh9KNcf8V/oQ8cPuB3hXGKwI5ypDxzaFLKpaEfY33V8OshRINx3IqFNsgLHoHacdQ/D75C/4lqIcoZACVH1O8SZlSwi1EHmbdhMkEEcXDjXRpZmEJvB32en1XEG@gEMREuIgVwGsDHEgOsNMmFrCRGgJhEToU@IKtgqYgi6hUxpU1tMRkD5pPx62oHbMlxzX6K5oCBLNJPQvg7Rkagz5JNBj7iXEwFttpQPa59mh6B02snkDQko5wh0AGXqNJN3YwQ0BT0AOYs4CxyAeQMGtXl5Mdp7fpHF3buB3D/gXGJyAOwKM2hTyKZGF8DBJs4mH@BgxALavL44eH3MqtvvI4jBgItFnksOZpFnCbbbMMpF7uxEAdCLCe8nI9psXSTs4ez46PhDaB7hkvsRzDkEOYJV0xDUJpRBNCPqmwWfDWIUCI1CJLRJFuAYu@LTCXTEJ/lEBpBHgF3w6QQ74JN8EBMhQF3v6SR2vKfk8QsQOt1T8uSlohHB1s/PLi7xS/2ZOu/AkEuwSJ5GQIdFMnUuA7YeECVQj0X8IUOWAU0WCueMJKVNbTUZAe3q6yQ6@0vuiyznDESRZQLZ1xC6IXNibCJIIfVGHGvzauGwZvew/HqJDycYcJXIc8lBJ/IswXYbRq3InZgoAGox4eVkRJuti8AejthXSRgIxSP2LZJzVDyK39QkttswKR7x742iACoeia@MMqLN1kVgDyfl3yjYcdfCD2AuIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomp04OH844EjoxkScJdIqJLA3Y7QHSiwlvKIqgZMwETxnS5idLwV7O2TMbBkL3nD2zOUfZ8/i8lNhuwyR6zp/ZogBqnotntoxos3UR2APrld1OrVt2WbvkGAVj9@rWWiaHnXrX7PK22a33za5onN1653x5cfS6PC7Xx/n7M3SjsdDjqbyWQkueyuoh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdEbx276xrFLbxy76RvHLr4C7CZvHCOovXHsxjeO3fSFY5e9cOym7xvri8HeL99nHzon2SE@By879APuIWJ5PQZOIpapyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkfz5LnwYu@6CfwgA8ghAG0B1IGXECkIA9YD4A2mcBUoAw4GUUW1E0YjwLL0@wcO0uxKnaUA5Q3ieBuQO1IxZySKiMzWwcKiOM/FUDRiO1YxrI0sTvPZ/FbfsF8sbPR6Hv3hT/s/jRm3V/NxWD2216Bf342VLjaaqP72f9Bd62W/6v1uDuPvf5OEm5NSB/4NC9dAipouiv1jyyAEUbatB4/Hzl7Z6fPiiiuHsfmzU3ehTXz0GXpHpbKkeaeoX1Xwc7b390mr46vPFaLpsNrLxWBX3vV6/b/qm0drZ2RkN1M3NVE/6NzdutcbNzUSPpjc3jbDjKPzj/w "Python 3.8 (pre-release) – Try It Online"
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • # [Python 3.8 (pre-release)], 577 bytes (was 634 than 591 before)
  • <!-- language-all: lang-python -->
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,R=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][R](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • [Try it online!][TIO-lv4qojcl]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qojcl]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9W@OFhcfb7@Y3VQNFdVeK@x26jmrdRo@uj37nb8RU@NeqjoaKr@Ur7Kaq@hGlWFPxb95f1iWo2vYAur/atV25cqmo1ho71q7a2u3u5fX1@9/aVaYv@36zfj2crvb9ooeqoYqGKiirkqlo03xXw8WjZbrf/4zbDgbc8M7ibzKtO6bsNKn/ar@nufVLXfT2Jzn9r966uL6@ZDy7v2m6vW/o4azBZqoVytierdKTNVg9uhupuq@a1aGlq7SrqKfP2D6jP69XofVBfOZm@1o8K4sm1Mf2nsuf@r/nt91eztH6xgP63/Nnt7K/GP0Lr@0dNFv1AH6mqn6W@TtmroRfl96i4mu@Gy1a6gu2k4NBy6W4hDrYaC2oQy6O8wTqtbTU1/4dPdLccT7t5LI9okSwgOZrfldx@bzNTt0F1zM4RGQDBDqNUtQzZBcRpaIXRSEzYVlBB7I8G1kbUZRJlF@XynSSeMhBAFTBJAKQpUexfY1jCfTnIUCHq8BApSBBRFRpt0HREA0V75vETP3tAPuCZhIzFIEtaqx6FNIZuKgoSd3x2fDnoU8HYyoU2yAsektolim0RrE6U2idIGhTaJzoZkNqnKholsUo0Nl9ikChsS2Ijtm9F0Wlq9AAczxDEX4SFTC4ESD2llkoh9ISLLoCYP@UaSlAJhHgvdJM1pU18zCcGH0NeL8AHs@iuujsgwBMKIqk7JmZUsIhREFrokmwpmyKFH8oA2sjin4FLJQef3V9wFkWEIXBBVLpxZySJCF2TBhU0FF@TgwgPayOKcgstghE1jMBzJlgHIcAQugLQajGSriICmoAcgp3E7jPPAAqiXEFgbUZcxNJj19Jgc/EBYIDYSowniassc2hSyqWSEGJzYfLTCBHrxiDbJGoKD3V25meK/0N3QD7gdYSMx2BGu2hKHNoVsKtoR9jcenw5yFAh3nkhok6zAMaiNdNELv0b@imshMgyBEqLq14gzK1lEqIMs/BqxqWCDHH6NeEAbWZxTbAn/zCbVuQa6AgxEY4gBIwPYHmLAdQiZsLWECFCriAnoFqIMNoyYwp4hY9rUlksyYD0uv0@GcHOGa65M1AgKvkS1hPZ1iJpEnSSfDILEvZ4IaLOlfFh7onugNBlqeVsCMhyBDqDqbKblPRkBTUEPQP5YqJPbEVg4D@rkVqwvRns3Cx137wZy/4CNxOQA2BVm0KaQTY0ugINNnE0@wMGIBbR5fXHwmurq9puCGAy4WORGcjCLXCfYbsMoF7n/teIFQC8mwq@UiGizdZGwh9loMLoL/SNccj@ChkOQI1j1DUFtQhlEM6KhX/DpYEYJ6BUiok2yhODYG5/H0Bef5aMZgIkAe@HzGPvgs3wiEyFAve95zPrec/IgBor97jl5CFNZxmD389liid/0Z2o@hCH3YBGTRsCIRbSay4CtB0QJNGQRf@CQZUCUhcKZI0lpU1tNRkC7@oKJzv6S@yIznIEoMi2QfQ2hGzInxiaCFFJvxLE2rxYOaxa98vsSH1Ew4CqRG8lBJ3KdYLsNo1bkTkwUALWY8HIyos3WRWAPA/blEgZCccC@V3KOioP43U1iuw2T4oB/kxQFUHEgvkTKiDZbF4E9jOEBVQkM3bXwA2gERDmAVVmGbILiNLIC6J3iTDQCGnwY1ua1RdFk4uTwEY0joRMTJkmgU0zoNGC3B0gvJryhKIKSMRM8ZUibnywFe5mzJzcMhO6cPbk5R9l5fGpKbLdhEp3zJ7cogJpz8eSWEW22LgJ7YL2yGNa6ZcHaJccoGLtXUWuZHA7rXbPgbbOo981CNM6i3jlfXhy9lqNyMzL9GbrRWOjxlKml0JKndD1kfx4iaZ7y4kkxlOe58AGkQW3@xbKwN3oHWaTvIAt6B1mk7yALfClYJO8gI6i9gyziO8gifQVZsFeQRfoGsr4Y7H3Z13fDse7hc3A5pB9wDxEz9Rg4iZhWyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkdzDt5Jdd8E/BAAmAtAGUJ1JGbGCEEA9IOFMGqeBE1A4kzKsjSjLGJ6oN2M8UrsrcaYGZBjCUzUgd6xmzEoWEZ2sgcHROk7FszVwPFyzgDayOKfgkl2UXz@6i9PdcMltCOYcgg/BTA0FtQllEJ2Ill8v1JTPBikKvOv8mSa0SRbgGLTelV9zb3Wm3nXcNddCmAsIWggz9Y4hm6A4DZUQOqMJmwpCiL2P4NrI2gyizEX59CEjnTASQhTIkwBKUaDau8C2hvl0kqNA0OMlUJAioCgy2qTriACIHpZPl@h52PEDrkk4lxgkCWfqkEObQjYVBQk7vzs@HfQo4O1kQptkBY5JbR3F1onWOkqtE6U1Cq0TnTXJrFOVNRNZpxprLrFOFdYksBbbz48/fiy/ZRfgkHdwzEV4KK@FQImHMpUnEftCRJZBTR7yXSQpBcI8FnpJmtOmvmYSgg/hfXYRPoBdf8XVEeUMgTCiqk1yZiWLCAWReTk2E8QQBynOtZGlGcQH2LcMer6/Eg8wQDlD@AADVIlwZiWLiB5gwLwIm4nPL8BBhHNtZGkGQeToGNvFUedYNgtAOUcgAihTR8eySURAU1ACkHO4HcZ54ADUKwisjajLGBqcHWYn5OAHwgJxLjGaIK62zKFNIZtKRojBic1HK0ygF49ok6whONh9KNcf8V/oQ8cPuB3hXGKwI5ypDxzaFLKpaEfY33V8OshRINx3IqFNsgLHoHacdQ/D75C/4lqIcoZACVH1O8SZlSwi1EHmbdhMkEEcXDjXRpZmEJvB32en1XEG@gEMREuIgVwGsDHEgOsNMmFrCRGgJhEToU@IKtgqYgi6hUxpU1tMRkD5pPx62oHbMlxzX6K5oCBLNJPQvg7Rkagz5JNBj7iXEwFttpQPa59mh6B02snkDQko5wh0AGXqNJN3YwQ0BT0AOYs4CxyAeQMGtXl5Mdp7fpHF3buB3D/gXGJyAOwKM2hTyKZGF8DBJs4mH@BgxALavL44eH3MqtvvI4jBgItFnksOZpFnCbbbMMpF7uxEAdCLCe8nI9psXSTs4ez46PhDaB7hkvsRzDkEOYJV0xDUJpRBNCPqmwWfDWIUCI1CJLRJFuAYu@LTCXTEJ/lEBpBHgF3w6QQ74JN8EBMhQF3v6SR2vKfk8QsQOt1T8uSlohHB1s/PLi7xS/2ZOu/AkEuwSJ5GQIdFMnUuA7YeECVQj0X8IUOWAU0WCueMJKVNbTUZAe3q6yQ6@0vuiyznDESRZQLZ1xC6IXNibCJIIfVGHGvzauGwZvew/HqJDycYcJXIc8lBJ/IswXYbRq3InZgoAGox4eVkRJuti8AejthXSRgIxSP2LZJzVDyK39QkttswKR7x742iACoeia@MMqLN1kVgDyfl3yjYcdfCD2AuIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomp04OH844EjoxkScJdIqJLA3Y7QHSiwlvKIqgZMwETxnS5idLwV7O2TMbBkL3nD2zOUfZ8/i8lNhuwyR6zp/ZogBqnotntoxos3UR2APrld1OrVt2WbvkGAVj9@rWWiaHnXrX7PK22a33za5onN1653x5cfS6PC7Xx/n7M3SjsdDjqbyWQkueyuoh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdEbx276xrFLbxy76RvHLr4C7CZvHCOovXHsxjeO3fSFY5e9cOym7xvri8HeL99nHzon2SE@By879APuIWJ5PQZOIpapyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkfz5LnwYu@6CfwgA8ghAG0B1IGXECkIA9YD4A2mcBUoAw4GUUW1E0YjwLL0@wcO0uxKnaUA5Q3ieBuQO1IxZySKiMzWwcKiOM/FUDRiO1YxrI0sTvPZ/FbfsF8sbPR6Hv3hT/s/jRm3V/NxWD2216Bf342VLjaaqP72f9Bd62W/6v1uDuPvf5OEm5NSB/4NC9dAipouiv1jyyAEUbatB4/Hzl7Z6fPiiiuHsfmzU3ehTXz0GXpHpbKkeaeoX1Xwc7b390mr46vPFaLpsNrLxWBX3vV6/b/qm0drZ2RkN1M3NVE/6NzdutcbNzUSPpjc3jbDjKPzj/w "Python 3.8 (pre-release) – Try It Online"
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
#11: Post edited by user avatar Arpad Horvath‭ · 2024-04-18T04:28:09Z (8 months ago)
was a long variable name
  • **Python 3.8+, 584 bytes** (was 634 than 591 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][rule](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • ```
  • [Try it online!][TIO-lv4qag6b]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qag6b]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9Ve3I/7B4urz9d/rA6K5qrK7zV2G9XUlRpNH/323aa/6KlRDxUdTdVfyhda7TVUoyryx6K/vF9Mq/EV7GK1f7Vq@1JFszFstFetvdXV2/3r66u3v1RL7P92/WY8W/ktThtFTxUDVUxUMVfFsvGmmI9Hy2ar9R@/GRa87ZnB3WReZVrXbVjp035Vf@@Tqvb7SWzuU7t/feXcrpsPLW/cb65a@ztqMFuohXLlJqp3p8xUDW6H6m6q5rdqaWj5KumK8i0cVB/Tr9f7YLtwQnurHRXGlXBj@ktjz/1f9d/rq2Zv/2AFW2r9t9nbW4l/itb1j54u@oU6UFc7TX@ztFVDL8rvU3cx2Q2XrXYF3a3DoeHQ3UgcajUU1CaUQX@fcVrdcGr6C5/ubjyecHdgGtEmWUJwMLstv/vYZKZuh@6amyE0AoIZQq1uGbIJitPQCqGTmrCpoITYGwmujazNIMosyuc7TTphJIQoYJIASlGg2rvAtob5dJKjQNDjJVCQIqAoMtqk64gAiPbK5yV69oZ@wDUJG4lBkrBWPQ5tCtlUFCTs/O74dNCjgLeTCW2SFTgmtU0U2yRamyi1SZQ2KLRJdDYks0lVNkxkk2psuMQmVdiQwEZs34ym09LqBTiYIY65CA@ZWgiUeEgrk0TsCxFZBjV5yDeSpBQI81joJmlOm/qaSQg@hL5ehA9g119xdUSGIRBGVHVKzqxkEaEgstAl2VQwQw49kge0kcU5BZdKDjq/v@IuiAxD4IKocuHMShYRuiALLmwquCAHFx7QRhbnFFwGI2wag@FItgxAhiNwAaTVYCRbRQQ0BT0AOY3bYZwHFkC9hMDaiLqMocGsp8fk4AfCArGRGE0QV1vm0KaQTSUjxODE5qMVJtCLR7RJ1hAc7O7KzRT/he6GfsDtCBuJwY5w1ZY4tClkU9GOsL/x@HSQo0C480RCm2QFjkFtpIte@DXyV1wLkWEIlBBVv0acWckiQh1k4deITQUb5PBrxAPayOKcYkv4ZzapzjXQFWAgGkMMGBnA9hADrkPIhK0lRIBaRUxAtxBlsGHEFPYMGdOmtlySAetx@X0yhJszXHNlokZQ8CWqJbSvQ9Qk6iT5ZBAk7vVEQJst5cPaE90DpclQy9sSkOEIdABVZzMt78kIaAp6APLHQp3cjsDCeVAnt2J9Mdq7Wei4ezeQ@wdsJCYHwK4wgzaFbGp0ARxs4mzyAQ5GLKDN64uD11RXt98UxGDAxSI3koNZ5DrBdhtGucj9rxUvAHoxEX6lRESbrYuEPcxGg9Fd6B/hkvsRNByCHMGqbwhqE8ogmhEN/YJPBzNKQK8QEW2SJQTH3vg8hr74LB/NAEwE2Aufx9gHn@UTmQgB6n3PY9b3npMHMVDsd8/JQ5jKMga7n88WS/ymP1PzIQy5B4uYNAJGLKLVXAZsPSBKoCGL@AOHLAOiLBTOHElKm9pqMgLa1RdMdPaX3BeZ4QxEkWmB7GsI3ZA5MTYRpJB6I461ebVwWLPold@X@IiCAVeJ3EgOOpHrBNttGLUid2KiAKjFhJeTEW22LgJ7GLAvlzAQigP2vZJzVBzE724S222YFAf8m6QogIoD8SVSRrTZugjsYQwPqEpg6K6FH0AjIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomEyeHj2gcCZ2YMEkCnWJCpwG7PUB6MeENRRGUjJngKUPa/GQp2MucPblhIHTn7MnNOcrO41NTYrsNk@icP7lFAdSciye3jGizdRHYA@uVxbDWLQvWLjlGwdi9ilrL5HBY75oFb5tFvW8WonEW9c758uLotRyVm5Hpz9CNxkKPp0wthZY8pesh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdE7yCJ9B1nQO8gifQdZ4EvBInkHGUHtHWQR30EW6SvIgr2CLNI3kPXFYO/Lvr4bjnUPn4PLIf2Ae4iYqcfAScS0WqYh@1IoKYWuIuaMTVoOxEXQ69eT2rywchqDj@QevpXsugv@IQAwEYA2gOpMyogVhADqAQln0jgNnIDCmZRhbURZxvBEvRnjkdpdiTM1IMMQnqoBuWM1Y1ayiOhkDQyO1nEqnq2B4@GaBbSRxTkFl@yi/PrRXZzuhktuQzDnEHwIZmooqE0og@hEtPx6oaZ8NkhR4F3nzzShTbIAx6D1rvyae6sz9a7jrrkWwlxA0EKYqXcM2QTFaaiE0BlN2FQQQux9BNdG1mYQZS7Kpw8Z6YSREKJAngRQigLV3gW2NcynkxwFgh4vgYIUAUWR0SZdRwRA9LB8ukTPw44fcE3CucQgSThThxzaFLKpKEjY@d3x6aBHAW8nE9okK3BMausotk601lFqnSitUWid6KxJZp2qrJnIOtVYc4l1qrAmgbXYfn788WP5LbsAh7yDYy7CQ3ktBEo8lKk8idgXIrIMavKQ7yJJKRDmsdBL0pw29TWTEHwI77OL8AHs@iuujihnCIQRVW2SMytZRCiIzMuxmSCGOEhxro0szSA@wL5l0PP9lXiAAcoZwgcYoEqEMytZRPQAA@ZF2Ex8fgEOIpxrI0szCCJHx9gujjrHslkAyjkCEUCZOjqWTSICmoISgJzD7TDOAwegXkFgbURdxtDg7DA7IQc/EBaIc4nRBHG1ZQ5tCtlUMkIMTmw@WmECvXhEm2QNwcHuQ7n@iP9CHzp@wO0I5xKDHeFMfeDQppBNRTvC/q7j00GOAuG@EwltkhU4BrXjrHsYfof8FddClDMESoiq3yHOrGQRoQ4yb8Nmggzi4MK5NrI0g9gM/j47rY4z0A9gIFpCDOQygI0hBlxvkAlbS4gANYmYCH1CVMFWEUPQLWRKm9piMgLKJ@XX0w7cluGa@xLNBQVZopmE9nWIjkSdIZ8MesS9nAhos6V8WPs0OwSl004mb0hAOUegAyhTp5m8GyOgKegByFnEWeAAzBswqM3Li9He84ss7t4N5P4B5xKTA2BXmEGbQjY1ugAONnE2@QAHIxbQ5vXFwetjVt1@H0EMBlws8lxyMIs8S7DdhlEucmcnCoBeTHg/GdFm6yJhD2fHR8cfQvMIl9yPYM4hyBGsmoagNqEMohlR3yz4bBCjQGgUIqFNsgDH2BWfTqAjPsknMoA8AuyCTyfYAZ/kg5gIAep6Tyex4z0lj1@A0OmekicvFY0Itn5@dnGJX@rP1HkHhlyCRfI0AjoskqlzGbD1gCiBeiziDxmyDGiyUDhnJCltaqvJCGhXXyfR2V9yX2Q5ZyCKLBPIvobQDZkTYxNBCqk34libVwuHNbuH5ddLfDjBgKtEnksOOpFnCbbbMGpF7sREAVCLCS8nI9psXQT2cMS@SsJAKB6xb5Gco@JR/KYmsd2GSfGIf28UBVDxSHxllBFtti4Cezgp/0bBjrsWfgBzAVEOYFWWIZugOI2sAHqnOBONgAYfhrV5bVE0OXVy@HDGkdCJiTxJoFNMZGnAbg@QXkx4Q1EEJWMmeMqQNj9ZCvZyzp7ZMBC65@yZzTnKnsfnpcR2GybRc/7MFgVQ81w8s2VEm62LwB5Yr@x2at2yy9olxygYu1e31jI57NS7Zpe3zW69b3ZF4@zWO@fLi6PX5XG5Ps7fn6EbjYUeT@W1FFryVFYP2Z@HSJqnvHhSDOV5LnwAaVCbf7Es7I3eOHbTN45deuPYTd84dvEVYDd54xhB7Y1jN75x7KYvHLvshWM3fd9YXwz2fvk@@9A5yQ7xOXjZoR9wDxHL6zFwErFMXaYh@1IoKYWuIuaMTVoOxEXQ69eT2rywchqDj@TPd@HD2HUX/EMAkEcA2gCqAykjVhACqAfEH0jjLFACGA6kjGojikaEZ@n1CR6m3ZU4TQPKGcLzNCB3oGbMShYRnamBhUN1nImnasBwrGZcG1ma4LX/q7hlv1je6PE4/MWb8n8eN2qr5ue2emirRb@4Hy9bajRV/en9pL/Qy37T/90axN3/Jg83IacO/J8VqocWMV0U/cWSRw6gaFsNGo@fv7TV48MXVQxn92Oj7kaf@uox8IpMZ0v1SFO/qObjaO/tl1bDV58vRtNls5GNx6q47/X6fdM3jdbOzs5ooG5upnrSv7lxqzVubiZ6NL25aYQdR@Ef/wc "Python 3.8 (pre-release) – Try It Online"
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • **Python 3.8+, 577 bytes** (was 634 than 591 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,R=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][R](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • ```
  • # [Python 3.8 (pre-release)], 577 bytes
  • <!-- language-all: lang-python -->
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,R=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][R](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • [Try it online!][TIO-lv4qojcl]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qojcl]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9W@OFhcfb7@Y3VQNFdVeK@x26jmrdRo@uj37nb8RU@NeqjoaKr@Ur7Kaq@hGlWFPxb95f1iWo2vYAur/atV25cqmo1ho71q7a2u3u5fX1@9/aVaYv@36zfj2crvb9ooeqoYqGKiirkqlo03xXw8WjZbrf/4zbDgbc8M7ibzKtO6bsNKn/ar@nufVLXfT2Jzn9r966uL6@ZDy7v2m6vW/o4azBZqoVytierdKTNVg9uhupuq@a1aGlq7SrqKfP2D6jP69XofVBfOZm@1o8K4sm1Mf2nsuf@r/nt91eztH6xgP63/Nnt7K/GP0Lr@0dNFv1AH6mqn6W@TtmroRfl96i4mu@Gy1a6gu2k4NBy6W4hDrYaC2oQy6O8wTqtbTU1/4dPdLccT7t5LI9okSwgOZrfldx@bzNTt0F1zM4RGQDBDqNUtQzZBcRpaIXRSEzYVlBB7I8G1kbUZRJlF@XynSSeMhBAFTBJAKQpUexfY1jCfTnIUCHq8BApSBBRFRpt0HREA0V75vETP3tAPuCZhIzFIEtaqx6FNIZuKgoSd3x2fDnoU8HYyoU2yAsektolim0RrE6U2idIGhTaJzoZkNqnKholsUo0Nl9ikChsS2Ijtm9F0Wlq9AAczxDEX4SFTC4ESD2llkoh9ISLLoCYP@UaSlAJhHgvdJM1pU18zCcGH0NeL8AHs@iuujsgwBMKIqk7JmZUsIhREFrokmwpmyKFH8oA2sjin4FLJQef3V9wFkWEIXBBVLpxZySJCF2TBhU0FF@TgwgPayOKcgstghE1jMBzJlgHIcAQugLQajGSriICmoAcgp3E7jPPAAqiXEFgbUZcxNJj19Jgc/EBYIDYSowniassc2hSyqWSEGJzYfLTCBHrxiDbJGoKD3V25meK/0N3QD7gdYSMx2BGu2hKHNoVsKtoR9jcenw5yFAh3nkhok6zAMaiNdNELv0b@imshMgyBEqLq14gzK1lEqIMs/BqxqWCDHH6NeEAbWZxTbAn/zCbVuQa6AgxEY4gBIwPYHmLAdQiZsLWECFCriAnoFqIMNoyYwp4hY9rUlksyYD0uv0@GcHOGa65M1AgKvkS1hPZ1iJpEnSSfDILEvZ4IaLOlfFh7onugNBlqeVsCMhyBDqDqbKblPRkBTUEPQP5YqJPbEVg4D@rkVqwvRns3Cx137wZy/4CNxOQA2BVm0KaQTY0ugINNnE0@wMGIBbR5fXHwmurq9puCGAy4WORGcjCLXCfYbsMoF7n/teIFQC8mwq@UiGizdZGwh9loMLoL/SNccj@ChkOQI1j1DUFtQhlEM6KhX/DpYEYJ6BUiok2yhODYG5/H0Bef5aMZgIkAe@HzGPvgs3wiEyFAve95zPrec/IgBor97jl5CFNZxmD389liid/0Z2o@hCH3YBGTRsCIRbSay4CtB0QJNGQRf@CQZUCUhcKZI0lpU1tNRkC7@oKJzv6S@yIznIEoMi2QfQ2hGzInxiaCFFJvxLE2rxYOaxa98vsSH1Ew4CqRG8lBJ3KdYLsNo1bkTkwUALWY8HIyos3WRWAPA/blEgZCccC@V3KOioP43U1iuw2T4oB/kxQFUHEgvkTKiDZbF4E9jOEBVQkM3bXwA2gERDmAVVmGbILiNLIC6J3iTDQCGnwY1ua1RdFk4uTwEY0joRMTJkmgU0zoNGC3B0gvJryhKIKSMRM8ZUibnywFe5mzJzcMhO6cPbk5R9l5fGpKbLdhEp3zJ7cogJpz8eSWEW22LgJ7YL2yGNa6ZcHaJccoGLtXUWuZHA7rXbPgbbOo981CNM6i3jlfXhy9lqNyMzL9GbrRWOjxlKml0JKndD1kfx4iaZ7y4kkxlOe58AGkQW3@xbKwN3oHWaTvIAt6B1mk7yALfClYJO8gI6i9gyziO8gifQVZsFeQRfoGsr4Y7H3Z13fDse7hc3A5pB9wDxEz9Rg4iZhWyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkdzDt5Jdd8E/BAAmAtAGUJ1JGbGCEEA9IOFMGqeBE1A4kzKsjSjLGJ6oN2M8UrsrcaYGZBjCUzUgd6xmzEoWEZ2sgcHROk7FszVwPFyzgDayOKfgkl2UXz@6i9PdcMltCOYcgg/BTA0FtQllEJ2Ill8v1JTPBikKvOv8mSa0SRbgGLTelV9zb3Wm3nXcNddCmAsIWggz9Y4hm6A4DZUQOqMJmwpCiL2P4NrI2gyizEX59CEjnTASQhTIkwBKUaDau8C2hvl0kqNA0OMlUJAioCgy2qTriACIHpZPl@h52PEDrkk4lxgkCWfqkEObQjYVBQk7vzs@HfQo4O1kQptkBY5JbR3F1onWOkqtE6U1Cq0TnTXJrFOVNRNZpxprLrFOFdYksBbbz48/fiy/ZRfgkHdwzEV4KK@FQImHMpUnEftCRJZBTR7yXSQpBcI8FnpJmtOmvmYSgg/hfXYRPoBdf8XVEeUMgTCiqk1yZiWLCAWReTk2E8QQBynOtZGlGcQH2LcMer6/Eg8wQDlD@AADVIlwZiWLiB5gwLwIm4nPL8BBhHNtZGkGQeToGNvFUedYNgtAOUcgAihTR8eySURAU1ACkHO4HcZ54ADUKwisjajLGBqcHWYn5OAHwgJxLjGaIK62zKFNIZtKRojBic1HK0ygF49ok6whONh9KNcf8V/oQ8cPuB3hXGKwI5ypDxzaFLKpaEfY33V8OshRINx3IqFNsgLHoHacdQ/D75C/4lqIcoZACVH1O8SZlSwi1EHmbdhMkEEcXDjXRpZmEJvB32en1XEG@gEMREuIgVwGsDHEgOsNMmFrCRGgJhEToU@IKtgqYgi6hUxpU1tMRkD5pPx62oHbMlxzX6K5oCBLNJPQvg7Rkagz5JNBj7iXEwFttpQPa59mh6B02snkDQko5wh0AGXqNJN3YwQ0BT0AOYs4CxyAeQMGtXl5Mdp7fpHF3buB3D/gXGJyAOwKM2hTyKZGF8DBJs4mH@BgxALavL44eH3MqtvvI4jBgItFnksOZpFnCbbbMMpF7uxEAdCLCe8nI9psXSTs4ez46PhDaB7hkvsRzDkEOYJV0xDUJpRBNCPqmwWfDWIUCI1CJLRJFuAYu@LTCXTEJ/lEBpBHgF3w6QQ74JN8EBMhQF3v6SR2vKfk8QsQOt1T8uSlohHB1s/PLi7xS/2ZOu/AkEuwSJ5GQIdFMnUuA7YeECVQj0X8IUOWAU0WCueMJKVNbTUZAe3q6yQ6@0vuiyznDESRZQLZ1xC6IXNibCJIIfVGHGvzauGwZvew/HqJDycYcJXIc8lBJ/IswXYbRq3InZgoAGox4eVkRJuti8AejthXSRgIxSP2LZJzVDyK39QkttswKR7x742iACoeia@MMqLN1kVgDyfl3yjYcdfCD2AuIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomp04OH844EjoxkScJdIqJLA3Y7QHSiwlvKIqgZMwETxnS5idLwV7O2TMbBkL3nD2zOUfZ8/i8lNhuwyR6zp/ZogBqnotntoxos3UR2APrld1OrVt2WbvkGAVj9@rWWiaHnXrX7PK22a33za5onN1653x5cfS6PC7Xx/n7M3SjsdDjqbyWQkueyuoh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdEbx276xrFLbxy76RvHLr4C7CZvHCOovXHsxjeO3fSFY5e9cOym7xvri8HeL99nHzon2SE@By879APuIWJ5PQZOIpapyzRkXwolpdBVxJyxScuBuAh6/XpSmxdWTmPwkfz5LnwYu@6CfwgA8ghAG0B1IGXECkIA9YD4A2mcBUoAw4GUUW1E0YjwLL0@wcO0uxKnaUA5Q3ieBuQO1IxZySKiMzWwcKiOM/FUDRiO1YxrI0sTvPZ/FbfsF8sbPR6Hv3hT/s/jRm3V/NxWD2216Bf342VLjaaqP72f9Bd62W/6v1uDuPvf5OEm5NSB/4NC9dAipouiv1jyyAEUbatB4/Hzl7Z6fPiiiuHsfmzU3ehTXz0GXpHpbKkeaeoX1Xwc7b390mr46vPFaLpsNrLxWBX3vV6/b/qm0drZ2RkN1M3NVE/6NzdutcbNzUSPpjc3jbDjKPzj/w "Python 3.8 (pre-release) – Try It Online"
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
#10: Post edited by user avatar Arpad Horvath‭ · 2024-04-18T04:18:52Z (8 months ago)
try it online after the code
  • **Python 3.8+, 584 bytes** (was 634 than 591 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][rule](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Try it online!][TIO-lv4qag6b]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qag6b]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9Ve3I/7B4urz9d/rA6K5qrK7zV2G9XUlRpNH/323aa/6KlRDxUdTdVfyhda7TVUoyryx6K/vF9Mq/EV7GK1f7Vq@1JFszFstFetvdXV2/3r66u3v1RL7P92/WY8W/ktThtFTxUDVUxUMVfFsvGmmI9Hy2ar9R@/GRa87ZnB3WReZVrXbVjp035Vf@@Tqvb7SWzuU7t/feXcrpsPLW/cb65a@ztqMFuohXLlJqp3p8xUDW6H6m6q5rdqaWj5KumK8i0cVB/Tr9f7YLtwQnurHRXGlXBj@ktjz/1f9d/rq2Zv/2AFW2r9t9nbW4l/itb1j54u@oU6UFc7TX@ztFVDL8rvU3cx2Q2XrXYF3a3DoeHQ3UgcajUU1CaUQX@fcVrdcGr6C5/ubjyecHdgGtEmWUJwMLstv/vYZKZuh@6amyE0AoIZQq1uGbIJitPQCqGTmrCpoITYGwmujazNIMosyuc7TTphJIQoYJIASlGg2rvAtob5dJKjQNDjJVCQIqAoMtqk64gAiPbK5yV69oZ@wDUJG4lBkrBWPQ5tCtlUFCTs/O74dNCjgLeTCW2SFTgmtU0U2yRamyi1SZQ2KLRJdDYks0lVNkxkk2psuMQmVdiQwEZs34ym09LqBTiYIY65CA@ZWgiUeEgrk0TsCxFZBjV5yDeSpBQI81joJmlOm/qaSQg@hL5ehA9g119xdUSGIRBGVHVKzqxkEaEgstAl2VQwQw49kge0kcU5BZdKDjq/v@IuiAxD4IKocuHMShYRuiALLmwquCAHFx7QRhbnFFwGI2wag@FItgxAhiNwAaTVYCRbRQQ0BT0AOY3bYZwHFkC9hMDaiLqMocGsp8fk4AfCArGRGE0QV1vm0KaQTSUjxODE5qMVJtCLR7RJ1hAc7O7KzRT/he6GfsDtCBuJwY5w1ZY4tClkU9GOsL/x@HSQo0C480RCm2QFjkFtpIte@DXyV1wLkWEIlBBVv0acWckiQh1k4deITQUb5PBrxAPayOKcYkv4ZzapzjXQFWAgGkMMGBnA9hADrkPIhK0lRIBaRUxAtxBlsGHEFPYMGdOmtlySAetx@X0yhJszXHNlokZQ8CWqJbSvQ9Qk6iT5ZBAk7vVEQJst5cPaE90DpclQy9sSkOEIdABVZzMt78kIaAp6APLHQp3cjsDCeVAnt2J9Mdq7Wei4ezeQ@wdsJCYHwK4wgzaFbGp0ARxs4mzyAQ5GLKDN64uD11RXt98UxGDAxSI3koNZ5DrBdhtGucj9rxUvAHoxEX6lRESbrYuEPcxGg9Fd6B/hkvsRNByCHMGqbwhqE8ogmhEN/YJPBzNKQK8QEW2SJQTH3vg8hr74LB/NAEwE2Aufx9gHn@UTmQgB6n3PY9b3npMHMVDsd8/JQ5jKMga7n88WS/ymP1PzIQy5B4uYNAJGLKLVXAZsPSBKoCGL@AOHLAOiLBTOHElKm9pqMgLa1RdMdPaX3BeZ4QxEkWmB7GsI3ZA5MTYRpJB6I461ebVwWLPold@X@IiCAVeJ3EgOOpHrBNttGLUid2KiAKjFhJeTEW22LgJ7GLAvlzAQigP2vZJzVBzE724S222YFAf8m6QogIoD8SVSRrTZugjsYQwPqEpg6K6FH0AjIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomEyeHj2gcCZ2YMEkCnWJCpwG7PUB6MeENRRGUjJngKUPa/GQp2MucPblhIHTn7MnNOcrO41NTYrsNk@icP7lFAdSciye3jGizdRHYA@uVxbDWLQvWLjlGwdi9ilrL5HBY75oFb5tFvW8WonEW9c758uLotRyVm5Hpz9CNxkKPp0wthZY8pesh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdE7yCJ9B1nQO8gifQdZ4EvBInkHGUHtHWQR30EW6SvIgr2CLNI3kPXFYO/Lvr4bjnUPn4PLIf2Ae4iYqcfAScS0WqYh@1IoKYWuIuaMTVoOxEXQ69eT2rywchqDj@QevpXsugv@IQAwEYA2gOpMyogVhADqAQln0jgNnIDCmZRhbURZxvBEvRnjkdpdiTM1IMMQnqoBuWM1Y1ayiOhkDQyO1nEqnq2B4@GaBbSRxTkFl@yi/PrRXZzuhktuQzDnEHwIZmooqE0og@hEtPx6oaZ8NkhR4F3nzzShTbIAx6D1rvyae6sz9a7jrrkWwlxA0EKYqXcM2QTFaaiE0BlN2FQQQux9BNdG1mYQZS7Kpw8Z6YSREKJAngRQigLV3gW2NcynkxwFgh4vgYIUAUWR0SZdRwRA9LB8ukTPw44fcE3CucQgSThThxzaFLKpKEjY@d3x6aBHAW8nE9okK3BMausotk601lFqnSitUWid6KxJZp2qrJnIOtVYc4l1qrAmgbXYfn788WP5LbsAh7yDYy7CQ3ktBEo8lKk8idgXIrIMavKQ7yJJKRDmsdBL0pw29TWTEHwI77OL8AHs@iuujihnCIQRVW2SMytZRCiIzMuxmSCGOEhxro0szSA@wL5l0PP9lXiAAcoZwgcYoEqEMytZRPQAA@ZF2Ex8fgEOIpxrI0szCCJHx9gujjrHslkAyjkCEUCZOjqWTSICmoISgJzD7TDOAwegXkFgbURdxtDg7DA7IQc/EBaIc4nRBHG1ZQ5tCtlUMkIMTmw@WmECvXhEm2QNwcHuQ7n@iP9CHzp@wO0I5xKDHeFMfeDQppBNRTvC/q7j00GOAuG@EwltkhU4BrXjrHsYfof8FddClDMESoiq3yHOrGQRoQ4yb8Nmggzi4MK5NrI0g9gM/j47rY4z0A9gIFpCDOQygI0hBlxvkAlbS4gANYmYCH1CVMFWEUPQLWRKm9piMgLKJ@XX0w7cluGa@xLNBQVZopmE9nWIjkSdIZ8MesS9nAhos6V8WPs0OwSl004mb0hAOUegAyhTp5m8GyOgKegByFnEWeAAzBswqM3Li9He84ss7t4N5P4B5xKTA2BXmEGbQjY1ugAONnE2@QAHIxbQ5vXFwetjVt1@H0EMBlws8lxyMIs8S7DdhlEucmcnCoBeTHg/GdFm6yJhD2fHR8cfQvMIl9yPYM4hyBGsmoagNqEMohlR3yz4bBCjQGgUIqFNsgDH2BWfTqAjPsknMoA8AuyCTyfYAZ/kg5gIAep6Tyex4z0lj1@A0OmekicvFY0Itn5@dnGJX@rP1HkHhlyCRfI0AjoskqlzGbD1gCiBeiziDxmyDGiyUDhnJCltaqvJCGhXXyfR2V9yX2Q5ZyCKLBPIvobQDZkTYxNBCqk34libVwuHNbuH5ddLfDjBgKtEnksOOpFnCbbbMGpF7sREAVCLCS8nI9psXQT2cMS@SsJAKB6xb5Gco@JR/KYmsd2GSfGIf28UBVDxSHxllBFtti4Cezgp/0bBjrsWfgBzAVEOYFWWIZugOI2sAHqnOBONgAYfhrV5bVE0OXVy@HDGkdCJiTxJoFNMZGnAbg@QXkx4Q1EEJWMmeMqQNj9ZCvZyzp7ZMBC65@yZzTnKnsfnpcR2GybRc/7MFgVQ81w8s2VEm62LwB5Yr@x2at2yy9olxygYu1e31jI57NS7Zpe3zW69b3ZF4@zWO@fLi6PX5XG5Ps7fn6EbjYUeT@W1FFryVFYP2Z@HSJqnvHhSDOV5LnwAaVCbf7Es7I3eOHbTN45deuPYTd84dvEVYDd54xhB7Y1jN75x7KYvHLvshWM3fd9YXwz2fvk@@9A5yQ7xOXjZoR9wDxHL6zFwErFMXaYh@1IoKYWuIuaMTVoOxEXQ69eT2rywchqDj@TPd@HD2HUX/EMAkEcA2gCqAykjVhACqAfEH0jjLFACGA6kjGojikaEZ@n1CR6m3ZU4TQPKGcLzNCB3oGbMShYRnamBhUN1nImnasBwrGZcG1ma4LX/q7hlv1je6PE4/MWb8n8eN2qr5ue2emirRb@4Hy9bajRV/en9pL/Qy37T/90axN3/Jg83IacO/J8VqocWMV0U/cWSRw6gaFsNGo@fv7TV48MXVQxn92Oj7kaf@uox8IpMZ0v1SFO/qObjaO/tl1bDV58vRtNls5GNx6q47/X6fdM3jdbOzs5ooG5upnrSv7lxqzVubiZ6NL25aYQdR@Ef/wc "Python 3.8 (pre-release) – Try It Online"
  • **Python 3.8+, 584 bytes** (was 634 than 591 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][rule](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • ```
  • [Try it online!][TIO-lv4qag6b]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qag6b]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9Ve3I/7B4urz9d/rA6K5qrK7zV2G9XUlRpNH/323aa/6KlRDxUdTdVfyhda7TVUoyryx6K/vF9Mq/EV7GK1f7Vq@1JFszFstFetvdXV2/3r66u3v1RL7P92/WY8W/ktThtFTxUDVUxUMVfFsvGmmI9Hy2ar9R@/GRa87ZnB3WReZVrXbVjp035Vf@@Tqvb7SWzuU7t/feXcrpsPLW/cb65a@ztqMFuohXLlJqp3p8xUDW6H6m6q5rdqaWj5KumK8i0cVB/Tr9f7YLtwQnurHRXGlXBj@ktjz/1f9d/rq2Zv/2AFW2r9t9nbW4l/itb1j54u@oU6UFc7TX@ztFVDL8rvU3cx2Q2XrXYF3a3DoeHQ3UgcajUU1CaUQX@fcVrdcGr6C5/ubjyecHdgGtEmWUJwMLstv/vYZKZuh@6amyE0AoIZQq1uGbIJitPQCqGTmrCpoITYGwmujazNIMosyuc7TTphJIQoYJIASlGg2rvAtob5dJKjQNDjJVCQIqAoMtqk64gAiPbK5yV69oZ@wDUJG4lBkrBWPQ5tCtlUFCTs/O74dNCjgLeTCW2SFTgmtU0U2yRamyi1SZQ2KLRJdDYks0lVNkxkk2psuMQmVdiQwEZs34ym09LqBTiYIY65CA@ZWgiUeEgrk0TsCxFZBjV5yDeSpBQI81joJmlOm/qaSQg@hL5ehA9g119xdUSGIRBGVHVKzqxkEaEgstAl2VQwQw49kge0kcU5BZdKDjq/v@IuiAxD4IKocuHMShYRuiALLmwquCAHFx7QRhbnFFwGI2wag@FItgxAhiNwAaTVYCRbRQQ0BT0AOY3bYZwHFkC9hMDaiLqMocGsp8fk4AfCArGRGE0QV1vm0KaQTSUjxODE5qMVJtCLR7RJ1hAc7O7KzRT/he6GfsDtCBuJwY5w1ZY4tClkU9GOsL/x@HSQo0C480RCm2QFjkFtpIte@DXyV1wLkWEIlBBVv0acWckiQh1k4deITQUb5PBrxAPayOKcYkv4ZzapzjXQFWAgGkMMGBnA9hADrkPIhK0lRIBaRUxAtxBlsGHEFPYMGdOmtlySAetx@X0yhJszXHNlokZQ8CWqJbSvQ9Qk6iT5ZBAk7vVEQJst5cPaE90DpclQy9sSkOEIdABVZzMt78kIaAp6APLHQp3cjsDCeVAnt2J9Mdq7Wei4ezeQ@wdsJCYHwK4wgzaFbGp0ARxs4mzyAQ5GLKDN64uD11RXt98UxGDAxSI3koNZ5DrBdhtGucj9rxUvAHoxEX6lRESbrYuEPcxGg9Fd6B/hkvsRNByCHMGqbwhqE8ogmhEN/YJPBzNKQK8QEW2SJQTH3vg8hr74LB/NAEwE2Aufx9gHn@UTmQgB6n3PY9b3npMHMVDsd8/JQ5jKMga7n88WS/ymP1PzIQy5B4uYNAJGLKLVXAZsPSBKoCGL@AOHLAOiLBTOHElKm9pqMgLa1RdMdPaX3BeZ4QxEkWmB7GsI3ZA5MTYRpJB6I461ebVwWLPold@X@IiCAVeJ3EgOOpHrBNttGLUid2KiAKjFhJeTEW22LgJ7GLAvlzAQigP2vZJzVBzE724S222YFAf8m6QogIoD8SVSRrTZugjsYQwPqEpg6K6FH0AjIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomEyeHj2gcCZ2YMEkCnWJCpwG7PUB6MeENRRGUjJngKUPa/GQp2MucPblhIHTn7MnNOcrO41NTYrsNk@icP7lFAdSciye3jGizdRHYA@uVxbDWLQvWLjlGwdi9ilrL5HBY75oFb5tFvW8WonEW9c758uLotRyVm5Hpz9CNxkKPp0wthZY8pesh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdE7yCJ9B1nQO8gifQdZ4EvBInkHGUHtHWQR30EW6SvIgr2CLNI3kPXFYO/Lvr4bjnUPn4PLIf2Ae4iYqcfAScS0WqYh@1IoKYWuIuaMTVoOxEXQ69eT2rywchqDj@QevpXsugv@IQAwEYA2gOpMyogVhADqAQln0jgNnIDCmZRhbURZxvBEvRnjkdpdiTM1IMMQnqoBuWM1Y1ayiOhkDQyO1nEqnq2B4@GaBbSRxTkFl@yi/PrRXZzuhktuQzDnEHwIZmooqE0og@hEtPx6oaZ8NkhR4F3nzzShTbIAx6D1rvyae6sz9a7jrrkWwlxA0EKYqXcM2QTFaaiE0BlN2FQQQux9BNdG1mYQZS7Kpw8Z6YSREKJAngRQigLV3gW2NcynkxwFgh4vgYIUAUWR0SZdRwRA9LB8ukTPw44fcE3CucQgSThThxzaFLKpKEjY@d3x6aBHAW8nE9okK3BMausotk601lFqnSitUWid6KxJZp2qrJnIOtVYc4l1qrAmgbXYfn788WP5LbsAh7yDYy7CQ3ktBEo8lKk8idgXIrIMavKQ7yJJKRDmsdBL0pw29TWTEHwI77OL8AHs@iuujihnCIQRVW2SMytZRCiIzMuxmSCGOEhxro0szSA@wL5l0PP9lXiAAcoZwgcYoEqEMytZRPQAA@ZF2Ex8fgEOIpxrI0szCCJHx9gujjrHslkAyjkCEUCZOjqWTSICmoISgJzD7TDOAwegXkFgbURdxtDg7DA7IQc/EBaIc4nRBHG1ZQ5tCtlUMkIMTmw@WmECvXhEm2QNwcHuQ7n@iP9CHzp@wO0I5xKDHeFMfeDQppBNRTvC/q7j00GOAuG@EwltkhU4BrXjrHsYfof8FddClDMESoiq3yHOrGQRoQ4yb8Nmggzi4MK5NrI0g9gM/j47rY4z0A9gIFpCDOQygI0hBlxvkAlbS4gANYmYCH1CVMFWEUPQLWRKm9piMgLKJ@XX0w7cluGa@xLNBQVZopmE9nWIjkSdIZ8MesS9nAhos6V8WPs0OwSl004mb0hAOUegAyhTp5m8GyOgKegByFnEWeAAzBswqM3Li9He84ss7t4N5P4B5xKTA2BXmEGbQjY1ugAONnE2@QAHIxbQ5vXFwetjVt1@H0EMBlws8lxyMIs8S7DdhlEucmcnCoBeTHg/GdFm6yJhD2fHR8cfQvMIl9yPYM4hyBGsmoagNqEMohlR3yz4bBCjQGgUIqFNsgDH2BWfTqAjPsknMoA8AuyCTyfYAZ/kg5gIAep6Tyex4z0lj1@A0OmekicvFY0Itn5@dnGJX@rP1HkHhlyCRfI0AjoskqlzGbD1gCiBeiziDxmyDGiyUDhnJCltaqvJCGhXXyfR2V9yX2Q5ZyCKLBPIvobQDZkTYxNBCqk34libVwuHNbuH5ddLfDjBgKtEnksOOpFnCbbbMGpF7sREAVCLCS8nI9psXQT2cMS@SsJAKB6xb5Gco@JR/KYmsd2GSfGIf28UBVDxSHxllBFtti4Cezgp/0bBjrsWfgBzAVEOYFWWIZugOI2sAHqnOBONgAYfhrV5bVE0OXVy@HDGkdCJiTxJoFNMZGnAbg@QXkx4Q1EEJWMmeMqQNj9ZCvZyzp7ZMBC65@yZzTnKnsfnpcR2GybRc/7MFgVQ81w8s2VEm62LwB5Yr@x2at2yy9olxygYu1e31jI57NS7Zpe3zW69b3ZF4@zWO@fLi6PX5XG5Ps7fn6EbjYUeT@W1FFryVFYP2Z@HSJqnvHhSDOV5LnwAaVCbf7Es7I3eOHbTN45deuPYTd84dvEVYDd54xhB7Y1jN75x7KYvHLvshWM3fd9YXwz2fvk@@9A5yQ7xOXjZoR9wDxHL6zFwErFMXaYh@1IoKYWuIuaMTVoOxEXQ69eT2rywchqDj@TPd@HD2HUX/EMAkEcA2gCqAykjVhACqAfEH0jjLFACGA6kjGojikaEZ@n1CR6m3ZU4TQPKGcLzNCB3oGbMShYRnamBhUN1nImnasBwrGZcG1ma4LX/q7hlv1je6PE4/MWb8n8eN2qr5ue2emirRb@4Hy9bajRV/en9pL/Qy37T/90axN3/Jg83IacO/J8VqocWMV0U/cWSRw6gaFsNGo@fv7TV48MXVQxn92Oj7kaf@uox8IpMZ0v1SFO/qObjaO/tl1bDV58vRtNls5GNx6q47/X6fdM3jdbOzs5ooG5upnrSv7lxqzVubiZ6NL25aYQdR@Ef/wc "Python 3.8 (pre-release) – Try It Online"
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
#9: Post edited by user avatar Arpad Horvath‭ · 2024-04-18T04:17:10Z (8 months ago)
you can try it online
  • **Python 3.8+, 584 bytes** (was 634 than 591 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][rule](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
  • **Python 3.8+, 584 bytes** (was 634 than 591 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][rule](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Try it online!][TIO-lv4qag6b]
  • [Python 3.8 (pre-release)]: https://docs.python.org/3.8/
  • [TIO-lv4qag6b]: https://tio.run/##jZu/bxu5Esd7/xWEimfpWRdc7poHH1xsvHFkwI4Ny3eNYRi0KFkC9AtaOYphpEiZ4ip36lKyuMqd2v3D8pbkzHCGayv3intLf74c8qOsZ6kFPH9YDmfT3/83X/z48ddBo1/aUfmPLr/Pyuf7cvO@/HZc/p2VX8/Kpz/LdWNncfDYmJS2sd9sTGaN9q@tdmNZbtzQwLAo/3FD3Wi/9SMLI8cm9yPjhuX3RaP9m8Oj26H7we3wnn6iDcz4rfVlpzgY68mt0Uq3b/f1m/v5vL9otkYDdXv16/WbUQE/6I@LvtI7pj9Qg@bn9kNrf9Ve3I/7B4urz9d/rA6K5qrK7zV2G9XUlRpNH/323aa/6KlRDxUdTdVfyhda7TVUoyryx6K/vF9Mq/EV7GK1f7Vq@1JFszFstFetvdXV2/3r66u3v1RL7P92/WY8W/ktThtFTxUDVUxUMVfFsvGmmI9Hy2ar9R@/GRa87ZnB3WReZVrXbVjp035Vf@@Tqvb7SWzuU7t/feXcrpsPLW/cb65a@ztqMFuohXLlJqp3p8xUDW6H6m6q5rdqaWj5KumK8i0cVB/Tr9f7YLtwQnurHRXGlXBj@ktjz/1f9d/rq2Zv/2AFW2r9t9nbW4l/itb1j54u@oU6UFc7TX@ztFVDL8rvU3cx2Q2XrXYF3a3DoeHQ3UgcajUU1CaUQX@fcVrdcGr6C5/ubjyecHdgGtEmWUJwMLstv/vYZKZuh@6amyE0AoIZQq1uGbIJitPQCqGTmrCpoITYGwmujazNIMosyuc7TTphJIQoYJIASlGg2rvAtob5dJKjQNDjJVCQIqAoMtqk64gAiPbK5yV69oZ@wDUJG4lBkrBWPQ5tCtlUFCTs/O74dNCjgLeTCW2SFTgmtU0U2yRamyi1SZQ2KLRJdDYks0lVNkxkk2psuMQmVdiQwEZs34ym09LqBTiYIY65CA@ZWgiUeEgrk0TsCxFZBjV5yDeSpBQI81joJmlOm/qaSQg@hL5ehA9g119xdUSGIRBGVHVKzqxkEaEgstAl2VQwQw49kge0kcU5BZdKDjq/v@IuiAxD4IKocuHMShYRuiALLmwquCAHFx7QRhbnFFwGI2wag@FItgxAhiNwAaTVYCRbRQQ0BT0AOY3bYZwHFkC9hMDaiLqMocGsp8fk4AfCArGRGE0QV1vm0KaQTSUjxODE5qMVJtCLR7RJ1hAc7O7KzRT/he6GfsDtCBuJwY5w1ZY4tClkU9GOsL/x@HSQo0C480RCm2QFjkFtpIte@DXyV1wLkWEIlBBVv0acWckiQh1k4deITQUb5PBrxAPayOKcYkv4ZzapzjXQFWAgGkMMGBnA9hADrkPIhK0lRIBaRUxAtxBlsGHEFPYMGdOmtlySAetx@X0yhJszXHNlokZQ8CWqJbSvQ9Qk6iT5ZBAk7vVEQJst5cPaE90DpclQy9sSkOEIdABVZzMt78kIaAp6APLHQp3cjsDCeVAnt2J9Mdq7Wei4ezeQ@wdsJCYHwK4wgzaFbGp0ARxs4mzyAQ5GLKDN64uD11RXt98UxGDAxSI3koNZ5DrBdhtGucj9rxUvAHoxEX6lRESbrYuEPcxGg9Fd6B/hkvsRNByCHMGqbwhqE8ogmhEN/YJPBzNKQK8QEW2SJQTH3vg8hr74LB/NAEwE2Aufx9gHn@UTmQgB6n3PY9b3npMHMVDsd8/JQ5jKMga7n88WS/ymP1PzIQy5B4uYNAJGLKLVXAZsPSBKoCGL@AOHLAOiLBTOHElKm9pqMgLa1RdMdPaX3BeZ4QxEkWmB7GsI3ZA5MTYRpJB6I461ebVwWLPold@X@IiCAVeJ3EgOOpHrBNttGLUid2KiAKjFhJeTEW22LgJ7GLAvlzAQigP2vZJzVBzE724S222YFAf8m6QogIoD8SVSRrTZugjsYQwPqEpg6K6FH0AjIMoBrMoyZBMUp5EVQO8UZ6IR0ODDsDavLYomEyeHj2gcCZ2YMEkCnWJCpwG7PUB6MeENRRGUjJngKUPa/GQp2MucPblhIHTn7MnNOcrO41NTYrsNk@icP7lFAdSciye3jGizdRHYA@uVxbDWLQvWLjlGwdi9ilrL5HBY75oFb5tFvW8WonEW9c758uLotRyVm5Hpz9CNxkKPp0wthZY8pesh@/MQSfOUF0@KoTzPhQ8gDWrzL5aFvdE7yCJ9B1nQO8gifQdZ4EvBInkHGUHtHWQR30EW6SvIgr2CLNI3kPXFYO/Lvr4bjnUPn4PLIf2Ae4iYqcfAScS0WqYh@1IoKYWuIuaMTVoOxEXQ69eT2rywchqDj@QevpXsugv@IQAwEYA2gOpMyogVhADqAQln0jgNnIDCmZRhbURZxvBEvRnjkdpdiTM1IMMQnqoBuWM1Y1ayiOhkDQyO1nEqnq2B4@GaBbSRxTkFl@yi/PrRXZzuhktuQzDnEHwIZmooqE0og@hEtPx6oaZ8NkhR4F3nzzShTbIAx6D1rvyae6sz9a7jrrkWwlxA0EKYqXcM2QTFaaiE0BlN2FQQQux9BNdG1mYQZS7Kpw8Z6YSREKJAngRQigLV3gW2NcynkxwFgh4vgYIUAUWR0SZdRwRA9LB8ukTPw44fcE3CucQgSThThxzaFLKpKEjY@d3x6aBHAW8nE9okK3BMausotk601lFqnSitUWid6KxJZp2qrJnIOtVYc4l1qrAmgbXYfn788WP5LbsAh7yDYy7CQ3ktBEo8lKk8idgXIrIMavKQ7yJJKRDmsdBL0pw29TWTEHwI77OL8AHs@iuujihnCIQRVW2SMytZRCiIzMuxmSCGOEhxro0szSA@wL5l0PP9lXiAAcoZwgcYoEqEMytZRPQAA@ZF2Ex8fgEOIpxrI0szCCJHx9gujjrHslkAyjkCEUCZOjqWTSICmoISgJzD7TDOAwegXkFgbURdxtDg7DA7IQc/EBaIc4nRBHG1ZQ5tCtlUMkIMTmw@WmECvXhEm2QNwcHuQ7n@iP9CHzp@wO0I5xKDHeFMfeDQppBNRTvC/q7j00GOAuG@EwltkhU4BrXjrHsYfof8FddClDMESoiq3yHOrGQRoQ4yb8Nmggzi4MK5NrI0g9gM/j47rY4z0A9gIFpCDOQygI0hBlxvkAlbS4gANYmYCH1CVMFWEUPQLWRKm9piMgLKJ@XX0w7cluGa@xLNBQVZopmE9nWIjkSdIZ8MesS9nAhos6V8WPs0OwSl004mb0hAOUegAyhTp5m8GyOgKegByFnEWeAAzBswqM3Li9He84ss7t4N5P4B5xKTA2BXmEGbQjY1ugAONnE2@QAHIxbQ5vXFwetjVt1@H0EMBlws8lxyMIs8S7DdhlEucmcnCoBeTHg/GdFm6yJhD2fHR8cfQvMIl9yPYM4hyBGsmoagNqEMohlR3yz4bBCjQGgUIqFNsgDH2BWfTqAjPsknMoA8AuyCTyfYAZ/kg5gIAep6Tyex4z0lj1@A0OmekicvFY0Itn5@dnGJX@rP1HkHhlyCRfI0AjoskqlzGbD1gCiBeiziDxmyDGiyUDhnJCltaqvJCGhXXyfR2V9yX2Q5ZyCKLBPIvobQDZkTYxNBCqk34libVwuHNbuH5ddLfDjBgKtEnksOOpFnCbbbMGpF7sREAVCLCS8nI9psXQT2cMS@SsJAKB6xb5Gco@JR/KYmsd2GSfGIf28UBVDxSHxllBFtti4Cezgp/0bBjrsWfgBzAVEOYFWWIZugOI2sAHqnOBONgAYfhrV5bVE0OXVy@HDGkdCJiTxJoFNMZGnAbg@QXkx4Q1EEJWMmeMqQNj9ZCvZyzp7ZMBC65@yZzTnKnsfnpcR2GybRc/7MFgVQ81w8s2VEm62LwB5Yr@x2at2yy9olxygYu1e31jI57NS7Zpe3zW69b3ZF4@zWO@fLi6PX5XG5Ps7fn6EbjYUeT@W1FFryVFYP2Z@HSJqnvHhSDOV5LnwAaVCbf7Es7I3eOHbTN45deuPYTd84dvEVYDd54xhB7Y1jN75x7KYvHLvshWM3fd9YXwz2fvk@@9A5yQ7xOXjZoR9wDxHL6zFwErFMXaYh@1IoKYWuIuaMTVoOxEXQ69eT2rywchqDj@TPd@HD2HUX/EMAkEcA2gCqAykjVhACqAfEH0jjLFACGA6kjGojikaEZ@n1CR6m3ZU4TQPKGcLzNCB3oGbMShYRnamBhUN1nImnasBwrGZcG1ma4LX/q7hlv1je6PE4/MWb8n8eN2qr5ue2emirRb@4Hy9bajRV/en9pL/Qy37T/90axN3/Jg83IacO/J8VqocWMV0U/cWSRw6gaFsNGo@fv7TV48MXVQxn92Oj7kaf@uox8IpMZ0v1SFO/qObjaO/tl1bDV58vRtNls5GNx6q47/X6fdM3jdbOzs5ooG5upnrSv7lxqzVubiZ6NL25aYQdR@Ef/wc "Python 3.8 (pre-release) – Try It Online"
#8: Post edited by user avatar Arpad Horvath‭ · 2024-04-18T04:02:15Z (8 months ago)
Doesn't matter whether the assignments are in one line or several lines, the number of bytes are the same, so I have here the more readable version with new lines.
  • **Python 3.8+, 584 bytes** (was 634 than 591 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ";r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)};s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][rule](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
  • **Python 3.8+, 584 bytes** (was 634 than 591 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ"
  • r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)}
  • s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][rule](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
#7: Post edited by user avatar Arpad Horvath‭ · 2024-04-17T19:07:40Z (8 months ago)
584
  • **Python 591 bytes** (was 634 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ";r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][rule](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • if w[0]in V:return"n"+w if w[0].isupper()else"n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
  • **Python 3.8+, 584 bytes** (was 634 than 591 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ";r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)};s=lambda a,b:a.upper()if b[0].isupper()else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][rule](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • return[w,"n-"+w,"n"+w][(c:=w[0]in V)*(c+w[0].isupper())]
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
#6: Post edited by user avatar Arpad Horvath‭ · 2024-04-17T18:30:24Z (8 months ago)
shorter version
  • **Python 634 bytes**
  • ```python
  • L,H,E=range(3);V="eéiíaáoóuúEÉIÍAÁOÓUÚ";r={"mé":("mo",L),"tú":("do",L),"sí":("a",H),"sé":("a",L),"muid":("ár",E),"sibh":("bhur",E),"siad":("a",E)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[l,lambda v:"h"+v if v[0] in V else v,e][rule](y)
  • def l(w):
  • if w[:2].lower()in"sc sf sm sp st".split():return w
  • if w[0].lower()in"bcdfgmpst":return w[0]+s("h",w)+w[1:]
  • return w
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • if w[0]in V:return"n"+w if w[0].isupper() else"n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
  • **Python 591 bytes** (was 634 before)
  • ```python
  • V="eéiíaáoóuúEÉIÍAÁOÓUÚ";r={"mé":("mo",0),"tú":("do",0),"sí":("a",1),"sé":("a",0),"muid":("ár",2),"sibh":("bhur",2),"siad":("a",2)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[lambda w:[w,w[0]+s("h",w)+w[1:]][1-(w[:2].lower()in"sc sf sm sp st".split())&(w[0].lower()in"bcdfgmpst")],lambda v:"h"+v if v[0]in V else v,e][rule](y)
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • if w[0]in V:return"n"+w if w[0].isupper()else"n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
#5: Post edited by user avatar Arpad Horvath‭ · 2024-04-14T18:02:11Z (8 months ago)
remove set
  • **Python 647 bytes**
  • ```python
  • L,H,E=range(3);V=set("eéiíaáoóuúEÉIÍAÁOÓUÚ");r={"mé":("mo",L),"tú":("do",L),"sí":("a",H),"sé":("a",L),"muid":("ár",E),"sibh":("bhur",E),"siad":("a",E)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ", y);return w+[l,lambda v:"h"+v if v[0] in V else v,e][rule](y)
  • def l(w):
  • if w[:2].lower()in"sc sf sm sp st".split():return w
  • if w[0].lower()in set("bcdfgmpst"):return w[0]+s("h",w)+w[1:]
  • return w
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • if w[0] in V:return"n"+w if w[0].isupper() else"n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
  • **Python 634 bytes**
  • ```python
  • L,H,E=range(3);V="eéiíaáoóuúEÉIÍAÁOÓUÚ";r={"mé":("mo",L),"tú":("do",L),"sí":("a",H),"sé":("a",L),"muid":("ár",E),"sibh":("bhur",E),"siad":("a",E)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ",y);return w+[l,lambda v:"h"+v if v[0] in V else v,e][rule](y)
  • def l(w):
  • if w[:2].lower()in"sc sf sm sp st".split():return w
  • if w[0].lower()in"bcdfgmpst":return w[0]+s("h",w)+w[1:]
  • return w
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • if w[0]in V:return"n"+w if w[0].isupper() else"n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
#4: Post edited by user avatar Arpad Horvath‭ · 2024-04-14T17:57:21Z (8 months ago)
  • **Python 654 bytes**
  • ```python
  • L,H,E=range(3);V=set("eéiíaáoóuúEÉIÍAÁOÓUÚ");r={"mé":("mo",L),"tú":("do",L),"sí":("a",H),"sé":("a",L),"muid":("ár",E),"sibh":("bhur",E),"siad":("a",E)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'" if w in{"mo","do"}and y[0]in V else w+" ", y);return w+[l,lambda v:"h"+v if v[0] in V else v,e][rule](y)
  • def l(w):
  • if w[:2].lower() in "sc sf sm sp st".split():return w
  • if w[0].lower() in set("bcdfgmpst"):return w[0]+s("h",w)+w[1:]
  • return w
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower() == r[0]:return r[1:]+w
  • if w[0] in V:return"n"+w if w[0].isupper() else "n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
  • **Python 647 bytes**
  • ```python
  • L,H,E=range(3);V=set("eéiíaáoóuúEÉIÍAÁOÓUÚ");r={"mé":("mo",L),"tú":("do",L),"sí":("a",H),"sé":("a",L),"muid":("ár",E),"sibh":("bhur",E),"siad":("a",E)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'"if w in{"mo","do"}and y[0]in V else w+" ", y);return w+[l,lambda v:"h"+v if v[0] in V else v,e][rule](y)
  • def l(w):
  • if w[:2].lower()in"sc sf sm sp st".split():return w
  • if w[0].lower()in set("bcdfgmpst"):return w[0]+s("h",w)+w[1:]
  • return w
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower()==r[0]:return r[1:]+w
  • if w[0] in V:return"n"+w if w[0].isupper() else"n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
#3: Post edited by user avatar Arpad Horvath‭ · 2024-04-14T17:53:18Z (8 months ago)
reordering long version
  • **Python 654 bytes**
  • ```python
  • L,H,E=range(3);V=set("eéiíaáoóuúEÉIÍAÁOÓUÚ");r={"mé":("mo",L),"tú":("do",L),"sí":("a",H),"sé":("a",L),"muid":("ár",E),"sibh":("bhur",E),"siad":("a",E)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'" if w in{"mo","do"}and y[0]in V else w+" ", y);return w+[l,lambda v:"h"+v if v[0] in V else v,e][rule](y)
  • def l(w):
  • if w[:2].lower() in "sc sf sm sp st".split():return w
  • if w[0].lower() in set("bcdfgmpst"):return w[0]+s("h",w)+w[1:]
  • return w
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower() == r[0]:return r[1:]+w
  • if w[0] in V:return"n"+w if w[0].isupper() else "n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
  • **Python 654 bytes**
  • ```python
  • L,H,E=range(3);V=set("eéiíaáoóuúEÉIÍAÁOÓUÚ");r={"mé":("mo",L),"tú":("do",L),"sí":("a",H),"sé":("a",L),"muid":("ár",E),"sibh":("bhur",E),"siad":("a",E)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'" if w in{"mo","do"}and y[0]in V else w+" ", y);return w+[l,lambda v:"h"+v if v[0] in V else v,e][rule](y)
  • def l(w):
  • if w[:2].lower() in "sc sf sm sp st".split():return w
  • if w[0].lower() in set("bcdfgmpst"):return w[0]+s("h",w)+w[1:]
  • return w
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower() == r[0]:return r[1:]+w
  • if w[0] in V:return"n"+w if w[0].isupper() else "n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
#2: Post edited by user avatar Arpad Horvath‭ · 2024-04-14T17:48:16Z (8 months ago)
test cases
  • **Python 654 bytes**
  • ```python
  • L,H,E=range(3);V=set("eéiíaáoóuúEÉIÍAÁOÓUÚ");r={"mé":("mo",L),"tú":("do",L),"sí":("a",H),"sé":("a",L),"muid":("ár",E),"sibh":("bhur",E),"siad":("a",E)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'" if w in{"mo","do"}and y[0]in V else w+" ", y);return w+[l,lambda v:"h"+v if v[0] in V else v,e][rule](y)
  • def l(w):
  • if w[:2].lower() in "sc sf sm sp st".split():return w
  • if w[0].lower() in set("bcdfgmpst"):return w[0]+s("h",w)+w[1:]
  • return w
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower() == r[0]:return r[1:]+w
  • if w[0] in V:return"n"+w if w[0].isupper() else "n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • **Python 654 bytes**
  • ```python
  • L,H,E=range(3);V=set("eéiíaáoóuúEÉIÍAÁOÓUÚ");r={"mé":("mo",L),"tú":("do",L),"sí":("a",H),"sé":("a",L),"muid":("ár",E),"sibh":("bhur",E),"siad":("a",E)};s=lambda a,b:a.upper() if b[0].isupper() else a
  • def f(x,y):w,rule=r[x];w=s(w[0]+"'" if w in{"mo","do"}and y[0]in V else w+" ", y);return w+[l,lambda v:"h"+v if v[0] in V else v,e][rule](y)
  • def l(w):
  • if w[:2].lower() in "sc sf sm sp st".split():return w
  • if w[0].lower() in set("bcdfgmpst"):return w[0]+s("h",w)+w[1:]
  • return w
  • def e(w):
  • for r in"bm cg dn fbh gn pb td".split():
  • if w[0].lower() == r[0]:return r[1:]+w
  • if w[0] in V:return"n"+w if w[0].isupper() else "n-"+w
  • return w
  • ```
  • the original, longer version is
  • ```python
  • vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")
  • def f(x, y):
  • possessive_pronoun, rule = rule_dict[x]
  • if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
  • possessive_pronoun = same_case(possessive_pronoun[0], y) + "'"
  • else:
  • possessive_pronoun = possessive_pronoun + " "
  • if y[0].isupper():
  • possessive_pronoun = possessive_pronoun.upper()
  • if rule == "lenition":
  • y = lenition(y)
  • if rule == "h-prothesis":
  • y = h_prothesis(y)
  • if rule == "eclipsis":
  • y = eclipsis(y)
  • return possessive_pronoun + y
  • def h_prothesis(word: str) -> str:
  • if word[0] in vowels:
  • return "h" + word
  • return word
  • def lenition(word: str) -> str:
  • l1 = "sc sf sm sp st".split()
  • if word[:2].lower() in l1:
  • return word
  • if word[0].lower() in set("bcdfgmpst"):
  • return word[0] + same_case("h", word) + word[1:]
  • return word
  • def same_case(a, b) -> str:
  • if b[0].isupper():
  • return a.upper()
  • return a.lower()
  • def eclipsis(word: str) -> str:
  • rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
  • for r in rules:
  • if word[0].lower() == r[0]:
  • word = r[1:] + word
  • return word
  • if word[0] in vowels:
  • if word[0] != word[0].lower():
  • return "n" + word
  • else:
  • return "n-" + word
  • return word
  • rule_dict = {
  • "mé": ("mo", "lenition"),
  • "tú": ("do", "lenition"),
  • "sí": ("a", "h-prothesis"),
  • "sé": ("a", "lenition"),
  • "muid": ("ár", "eclipsis"),
  • "sibh": ("bhur", "eclipsis"),
  • "siad": ("a", "eclipsis"),
  • }
  • ```
  • You can test with this code:
  • ```python
  • from test_cases import cases
  • from irish_possessive_golf import f
  • def test_all():
  • for i, (x, y, result) in enumerate(cases):
  • my_result = f(x, y)
  • assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
  • print("All succeeded")
  • test_all()
  • ```
  • [Test cases are here](https://gist.github.com/horvatha/1f898b03c79b86ff11a9a807999e4556)
#1: Initial revision by user avatar Arpad Horvath‭ · 2024-04-14T17:44:09Z (8 months ago)
**Python 654 bytes**

```python
L,H,E=range(3);V=set("eéiíaáoóuúEÉIÍAÁOÓUÚ");r={"mé":("mo",L),"tú":("do",L),"sí":("a",H),"sé":("a",L),"muid":("ár",E),"sibh":("bhur",E),"siad":("a",E)};s=lambda a,b:a.upper() if b[0].isupper() else a
def f(x,y):w,rule=r[x];w=s(w[0]+"'" if w in{"mo","do"}and y[0]in V else w+" ", y);return w+[l,lambda v:"h"+v if v[0] in V else v,e][rule](y)
def l(w):
 if w[:2].lower() in "sc sf sm sp st".split():return w
 if w[0].lower() in set("bcdfgmpst"):return w[0]+s("h",w)+w[1:]
 return w
def e(w):
 for r in"bm cg dn fbh gn pb td".split():
  if w[0].lower() == r[0]:return r[1:]+w
 if w[0] in V:return"n"+w if w[0].isupper() else "n-"+w
 return w
```

the original, longer version is

```python
vowels = set("eéiíaáoóuúEÉIÍAÁOÓUÚ")

def f(x, y):
    possessive_pronoun, rule = rule_dict[x]
    if possessive_pronoun in {"mo", "do"} and y[0] in vowels:
        possessive_pronoun =  same_case(possessive_pronoun[0], y) + "'"
    else:
        possessive_pronoun = possessive_pronoun + " "
    if y[0].isupper():
        possessive_pronoun = possessive_pronoun.upper()

    if rule == "lenition":
        y = lenition(y)
    if rule == "h-prothesis":
        y = h_prothesis(y)
    if rule == "eclipsis":
        y = eclipsis(y)
    return possessive_pronoun + y

def h_prothesis(word: str) -> str:
    if word[0] in vowels:
        return "h" + word
    return word

def lenition(word: str) -> str:
    l1 = "sc sf sm sp st".split()
    if word[:2].lower() in l1:
        return word
    if word[0].lower() in set("bcdfgmpst"):
        return word[0] + same_case("h", word) + word[1:]
    return word

def same_case(a, b) -> str:
    if b[0].isupper():
        return a.upper()
    return a.lower()

def eclipsis(word: str) -> str:
    rules = ["bm", "cg", "dn", "fbh", "gn", "pb", "td"]
    for r in rules:
        if word[0].lower() == r[0]:
            word = r[1:] + word
            return word
    if word[0] in vowels:
        if word[0] != word[0].lower():
            return "n" + word
        else:
            return "n-" + word
    return word

rule_dict = {
    "mé":   ("mo", "lenition"),
    "tú":   ("do", "lenition"),
    "sí":   ("a", "h-prothesis"),
    "sé":   ("a", "lenition"),
    "muid":	("ár", "eclipsis"),
    "sibh":	("bhur", "eclipsis"),
    "siad":	("a", "eclipsis"),
}
```

You can test with this code:

```python
from test_cases import cases

from irish_possessive_golf import f

def test_all():
    for i, (x, y, result) in enumerate(cases):
        my_result = f(x, y)
        assert my_result == result, f"{x}, {y} should give {result}, not {my_result} ({i+1})"
    print("All succeeded")

test_all()
```