威尔士语单词多长时间?


37

编写一个程序或函数,该程序或函数接收代表威尔士语单词的字符串(UTF-8,除非您另行指定)作为输入。

以下是威尔士语中的所有单个字母

a,b,c,ch,d,dd,e,f,ff,g,ng,h,i,j,l,ll,m,n,o,p,ph,r,rh,s,t, ,, u,w

要引用维基百科

虽然有向图chddffngllphrhth用两个符号书写,但它们都被视为单个字母。例如,这意味着Llanelli(位于南威尔士的一个小镇)在威尔士语中被认为只有六个字母,而英语中只有八个字母。

这些字母也存在于威尔士语中,尽管它们仅限于从其他语言借来的技术词汇:

k,q,v,x,z

带有变音符号的字母不会被视为单独的字母,但是您的功能必须接受它们并能够对其进行计数。可能的字母是:

â,ê,î,ô,ô,û,ŷ,ŷ,á,é,í,ó,ú,ý,ẃ,ä,ë,ï,ö,ü,ü,ÿ,ẅ,à,è,ì, ù,ẁ

(这意味着ASCII是不能接受的输入编码,因为它无法编码这些字符。)

笔记:

  • 这是代码高尔夫。
  • 您不必考虑像llongyfarch这样的单词,其中ng不是字母,而是两个单独的字母。这个单词有9个字母,但是您可以将其误认为8个字母。(如果您解释这样的话,那真是太棒了,但超出了此挑战的范围。)
  • 确保输入没有空格(除非您喜欢使用单个结尾的换行符(或更深奥的东西),在这种情况下可以提供)。当然不会有内部空格。

测试用例:

  • 兰迪德诺,8
  • 拉内利,6岁
  • 瑞尔3
  • Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch,(50岁,但我们算50)
  • Tŷr,3
  • 西摩(Cymru),5岁
  • 格林多7岁

4
输入可以全部小写吗?
ETHproductions 2016年

15
我的母语是威尔士语的妻子建议将J添加到“借来的”字母部分,因为它实际上并不是威尔士字母的一部分
Rich Starkie

@RichStarkie维基百科的文章在这方面有点模糊。我的理解是,即使在原始单词中不存在j,也可以在借来的单词中使用j,因此它在语音上使用,这意味着在此阶段它已被自然化为该语言。在爱尔兰语中,我曾见过关于v的类似论点。人们普遍认为它不是爱尔兰字母的一部分,但它以某些爱尔兰名称存在,例如ÓCuiv
TRiG

1
威尔士语正字法文章中的脚注列出了mhnhngh作为字素。方法我需要就语言学SE提出一个问题。
TRiG

3
太可惜了,为时已晚。这个三字形的“ ngh”可能会使它变得更加复杂。
megaflop

Answers:


6

05AB1E24 23 21字节

码:

u•éÓœ°D¥M™ù>•30B2ô0:g

说明:

u                      # Convert the input to uppercase.
 •éÓœ°D¥M™ù>•30B       # Compressed version of CHDDFFNGLLPHRHTH.
                         It convert the text between the •'s from base 214 to
                         base 10 and converts that to base 30.
                2ô     # Split into pieces of 2.
                  0:   # Replace each element that also occurs in the input by 0.
                    g  # Get the length of the processed input.

使用CP-1252编码。在线尝试!


16

视网膜,23字节

i`[cprt]h|dd|ff|ng|ll|.

在线尝试!

甚至是正则表达式。


这可能是我对Retina的无知,但是输入文本长度的输出在哪里?Retina上的文档似乎没有在“在线试用!”中解释其工作方式。现场。
Xaero Degreaz

2
输出是隐式的,因为唯一的一行是Match阶段,返回匹配数。在这里,正则表达式匹配每个威尔士字母。
user48538

因此,通过这种逻辑,可以缩短代码中显式调用长度以下的每个答案吗?
Xaero Degreaz

2
@XaeroDegreaz Retina是自动计算比赛并打印出来的仅有的几种语言之一。这就是Retina语言的工作方式。这不是其他语言的工作方式,因此这些语言需要显式调用其length函数以获得正确的输出。
isaacg

谢谢,我现在明白了。阅读了更多文档后,我看到默认的“ Match”阶段执行此输出。
Xaero Degreaz

5

JavaScript(ES6),44个字节

x=>x.match(/[cprt]h|dd|ff|ng|ll|./gi).length

简单的答案可能是最短的。


5

重击52 50(sed + wc)41

-9感谢乔丹

sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m

如果需要大写字母,则i在sed命令的末尾需要一个。(我把它省略了,因为问题中的所有“单字母”都是小写的,即使不是某些示例也是如此)。


1
为什么要grep -o .|wc -l代替wc -c
约旦

wc -c将â到count计为2。
莱利2013年

嗯当然了 FWIW,如果您使用GNU或BSD wc,则可以-m用来计数字符而不是字节。
约旦

你能移动cch[prt]sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
megaflop

2
可耻的([dfl])\1时间比更长dd|ff|ll。只需要再增加一个双辅音就可以使用聪明的版本。
Toby Speight,

4

秸秆30 58 35 33字节

<((?i:[cprt]h|dd|ff|ng|ll|.))0/$>

用替换每次出现的正则表达式0,然后从一元转换为十进制。

可悲的是,Straw无法将标志传递给正则表达式。我忘了?flags:构造

在线尝试!(添加的代码用于验证所有测试用例)


这种语言与Retina之类的语言有何不同?
Downgoat

@Downgoat Straw是基于堆栈的:P
TuxCrafting

3

Python 3,64个字节

import re
print(len(re.findall("[cprt]h|dd|ff|ng|ll|.",input())))

再次使用正则表达式

伊迪恩!


3

PowerShell v2 +,52 50 48字节

($args[0]-replace'dd|ff|ng|ll|[prtc]h',0).length

做了-replace所有的两个符号的单字母的字母,改变“时间0(这样做,因为改变到一个非数字将需要引号),然后获取.length得到的字符串。

测试用例

PS C:\Tools\Scripts\golfing> 'Llandudno','Llanelli','Rhyl','Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch','Tŷr','Cymru','Glyndŵr'|%{"$_ --> "+(.\how-long-is-a-welsh-word.ps1 $_)}
Llandudno --> 8
Llanelli --> 6
Rhyl --> 3
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch --> 50
Tŷr --> 3
Cymru --> 5
Glyndŵr --> 7

我不熟悉PowerShell,但是您真的需要括号[prtc]h吗?
约旦

@乔丹不,我不知道。那不是PowerShell的东西,那不是正则表达式。:D感谢您的高尔夫!
AdmBorkBork

2

V,31个字节

Íã[cprt]hüddüffüngüllü./
Dé0@"

在线尝试,或验证所有测试用例!

它包含一些不可打印的字符,因此这是一个十六进制转储:

0000000: cde3 5b63 7072 745d 68fc 6464 fc66 66fc  ..[cprt]h.dd.ff.
0000010: 6e67 fc6c 6cfc 2e2f 010a 44e9 3040 22    ng.ll../..D.0@"

2

PHP,56字节

<?=preg_match_all("#[cprt]h|dd|ff|ll|ng|.#iu",$argv[1]);

1
我相信[dfl]{2}match dfld等等,以及它的预期匹配。dd|ff|ll长度相同
ETHproductions's

1
我知道您的信念是真实的,但我认为您的信念不是一种信念。它看起来不止一种类型的kowledge的
约尔格Hülsermann

1
使用而不是echo(末尾有空格)<?=,这样可以节省2个字节。另外,$t这里不是必须的,可以节省3个字节。
Ismael Miguel

n你伊斯梅尔。我一定要多那么一点点困惑,我不删除$ T
约尔格Hülsermann

2

Java 7,156 73字节

@OlivierGrégoire节省了字节加载

int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","*").length();}

非高尔夫球和测试用例:

在这里尝试。

class M{
  static int c(String s){
    return s.replaceAll("[cprt]h|dd|ff|ng|ll", "*").length();
  }

  public static void main(String[] a){
    System.out.println(c("llandudno"));
    System.out.println(c("llanelli"));
    System.out.println(c("rhyl"));
    System.out.println(c("llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch"));
    System.out.println(c("tŷr"));
    System.out.println(c("cymru"));
    System.out.println(c("glyndŵr"));
  }
}

输出:

8
6
3
50
3
5
7

您导入后不Matcher直接使用?:o另外,Matcher可以在for循环中定义。
OlivierGrégoire'16

1
我有一种很强烈的感觉,return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()就是更短。这行不行吗?
OlivierGrégoire'16

嗯,是的,它有效,对于Java 7版本(int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length();}),它为73个字节。Java 8版本(s->s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length())只有51个。
奥利维尔·格雷戈尔(OlivierGrégoire),2013年

1
@OlivierGrégoire谢谢。这Matcher是个意外。我在测试代码中正确输入了它,但在高尔夫球代码中却没有正确输入replaceAll
凯文·克鲁伊森

1

R,54个字节

与其他答案非常相似。匹配两个字符字母中的任何一个并将其替换为字母@,然后计算字符数。从标准输入读取输入。使用选项ignore.case = TRUE(的第三个参数gsub)同时匹配大写和小写字符。

nchar(gsub("ch|dd|ff|ng|ll|ph|rh|th","@",scan(,""),T))

奖金

这两个gsubnchar的矢量这意味着,这也适用于一个特征向量,如:

v=c("Llandudno","Llanelli","Rhyl","Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch","Tŷr","Cymru","Glyndŵr")
nchar(gsub("ch|dd|ff|ng|ll|ph|rh|th","@",v,T))

产生:

[1]  8  6  3 50  3  5  7


0

XQuery,77个字节

declare variable$s external;count(tokenize($s,'[cprt]h|ff|dd|ll|ng|.','i'))-1


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.