有没有更小的重图检查器?[关闭]


10

我最近开始玩代码搜索,并尝试编写最小的互写检查器。

一个tautogram是所有单词用相同字母开头,例如一句话:花来自法国蓬勃发展

给定一个句子作为输入,请确定它是否是一个互变符号。

测试用例

Flowers flourish from France
    True

This is not a Tautogram
    False

我想出了这个python代码(因为这是我的主要语言):

print(True if len(list(set([x.upper()[0] for x in __import__('sys').argv[1:]]))) == 1 else False)

用法:

python3 tautogram.py Flowers flourish from France
# True
python3 tautogram.py This is not a Tautogram
# False

该句子可以包含逗号和句点,但不能包含其他特殊字符,只能包含大小写字母和空格。

它的大小是98字节。是否有任何语言的较小解决方案?


1
是否打算将tips问题限于Python?如果是这样,则应同时添加这两个标签。
阿诺尔德

2
嘿亚朋友!通常为明确定义的问题保留该站点。应该在发布之前回答诸如“输入中是否包含标点符号”之类的问题,但除此之外,与我们通常看到的其他新用户问题相比,这是一个很好的第一个问题。从您的示例来看,我只是澄清一下,输入中的唯一字符将是“ [A-Za-z]”,您的问题将纯粹是客观的。我会在这里解决其他一些问题,否则老实说这可能更适合溢出。
Magic Octopus Urn

1
标点符号是什么意思?包括哪些字符?
无知的体现

1
@MagicOctopusUrn有时,当您要求在stackOverflow中提供一个简短的解决方案时,请参考此站点:)
Luis felipe De jesus Munoz

6
欢迎来到PPCG!更多的测试用例(包括标点符号)将是对这一挑战的极大补充。
AdmBorkBork

Answers:



4

Python 2,47个字节

lambda s:len(set(zip(*s.lower().split())[0]))<2

在线尝试!

在移动设备上解决了这个问题。可以打更多的高尔夫球。


3

Clojure,80字节

在线尝试!。TIO虽然不支持Clojure的标准String库,所以第一个版本将引发“找不到小写”错误。

(fn[s](use '[clojure.string])(apply =(map first(map lower-case(split s #" ")))))

取消高尔夫:

(defn tautogram? [s]
  (use '[clojure.string])
  (->> (split s #" ") ; Get words
       (map lower-case)
       (map first) ; Get first letter of each word
       (apply =))) ; And make sure they're all the same

我制作了一个避免导入的版本:

(fn [s](apply =(map #(if(<(-(int %)32)65)(int %)(-(int %) 32))(map first(take-nth 2(partition-by #(= %\ )s))))))

 ; -----

(defn tautogram? [s]
  (->> s
       (partition-by #(= % \ )) ; Split into words
       (take-nth 2) ; Remove spaces
       (map first) ; Get first letter
       ; Convert to uppercased letter code
       (map #(if (< (- (int %) 32) 65) ; If attempting to uppercase puts the letter out of range,
               (int %) ; Go with the current code
               (- (int %) 32))) ; Else go with the uppercased  code
       (apply =))) ; And check if they're all equal

但这是 112个字节


这是我的球拍解决方案:(define(f s)(apply char=?(map(λ(x)(char-upcase(car(string->list x))))(string-split s))))
Galen Ivanov

PicoLisp中的时间短得多:(de f(s)(apply =(mapcar car(split(chop(lowc s))" "))))
Galen Ivanov

3

PowerShell57 50 41字节

(-split$args|% s*g 0 1|sort -u).count-eq1

在线尝试!

接受输入并将split其放在空白处。通过每个字循环,并抓住采取的第一个字母substrin g起始位置0和要去的1性格。然后sort使用-unique标志对字母(默认情况下不区分大小写)进行排序,以仅提取出每个字母的一个副本,并验证count这些名称-eq1。输出是隐式的。

-9个字节感谢mazzy。




1
@mazzy 修复了试图理解意图的问题
Nahuel Fouilleul

@mazzy当问题重新打开时,我将让您发布正则表达式版本。它足以保证自己的答案。
AdmBorkBork

我同意。但是这个问题被搁置了,所以我无法创建一个新的答案。
mazzy


2

Brachylog,5个字节

ḷṇ₁hᵛ

在线尝试!

         The input
ḷ        lowercased
 ṇ₁      and split on spaces
   hᵛ    is a list of elements which all start with the same thing.

我刚才注意到,它必须能够处理标点符号,但是如果没有任何标点符号的测试用例,我无法确定它是否仍然有效……
不相关的字符串


2

Perl 5(-p),20个字节

$_=!/^(.).* (?!\1)/i

蒂奥

以下注释以防标点错误(31个字节)

$_=!/^\W*+(.).*(?=\b\w)(?!\1)/i

31个字节

否则,还有另一种方法,也有31个字节:

$h{ord()%32}++for/\w+/g;$_=2>%h

其他31个字节


标点符号呢?字符串的空格或标点符号怎么办?
mazzy

此答案适用于给定的测试用例,可以根据要求进行改进$_=!/^\W*+(.).*(?=\b\w)(?!\1)/i
Nahuel Fouilleul

但是请仔细阅读问题和给定的解决方案,开始时不能出现空格,因为外壳程序使用空格来分隔参数。该程序只检查所有参数与同一个角色
纳乌艾尔乌Fouilleul

1

JavaScript(Node.js),54字节

s=>!s.match(/\b\w+/g).some(p=s=>p-(p=Buffer(s)[0]&31))

在线尝试!

47个字节(如果每个单词(但第一个单词除外)被保证在其后)。


或使用正则表达式或空格代替\W
Nahuel Fouilleul

@NahuelFouilleul,使用test保存另一个字节。
毛茸茸的

1
@NahuelFouilleul您可能应该单独张贴。
阿纳尔德

已经发布了perl版本,我也不太精通JavaScript,很高兴为您提供提示
Nahuel Fouilleul

1

Japt ,5个字节

¸mÎro

尝试一下

¸mÎro     :Implicit input of string
¸         :Split on spaces
 m        :Map
  Î       :  Get first character
   r      :Reduce by
    o     :  Keeping the characters that appear in both, case-insensitive
          :Implicit output as boolean



1

Java,(36个字节)

s->!s.matches("(?i)(.).* (?!\\1).*")

蒂奥


1
我认为输入内容可以以空格开头,这不适用于此类输入
Sara J

事实上,它不是一个测试案例,但这是可以处理的加入(?> *),利用原子团在开始和pevent bactracking匹配的空间。只是`*`不起作用,因为在失败的匹配之后,将回溯`*`以匹配空字符串
Nahuel Fouilleul

但是,再次读取问题是因为示例中的开头可能会出现空格,因为用法是将单词作为参数传递,而空格是shell参数分隔符
Nahuel Fouilleul
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.