等距检查器


13

挑战:

给定一个单词,检查它是否为等轴测图。


什么 :

等距图是仅由字母组成的单词,没有重复(不区分大小写)。空字符串是等轴测图。


例子 :

"Dermatoglyphics"     ---> true
"ab"                  ---> true
"aba"                 ---> false
"moOse"               ---> false
"abc1"                ---> false
""                    ---> true

输入:

您可以接受任何合理格式的输入

输入内容仅包含字母和/或数字,不包含空格([a-zA-Z0-9]


输出:

  • true 或任何真实值(如果输入是等轴图)
  • false 或其他任何虚假的值

这是因此每种语言中以字节为单位的最短代码获胜。


3
建议的测试案例:sad2
亚当

1
等轴测图的定义包括两个不同的矛盾陈述。哪有
Ad Hoc Garf Hunter'Apr

9
我建议您开始使用沙盒,以便在发布挑战之前可以发现这些问题。
fəˈnɛtɪk

3
@MuhammadSalman这是很草率的,请从您引用的结尾删除“ .any”,并提供更多示例(sad2das即使没有,也会失败,2因此它不会显示任何内容)。
Asone Tuhid

4
“ What”和“ Notes”似乎相互矛盾:“实现一个确定仅包含字母的字符串是否为等距图的函数”(添加了强调)和“可能存在数字,并且那些将且必须返回false”说相反的话。目前,我已投票决定关闭尚不清楚的内容,但一旦清除,我们将很乐意将其收回!
朱塞佩

Answers:


9

Python的2/ 3 36 52 48个字节

lambda s:len(s)==len({*s.lower()}-{*str(56**7)})

在线尝试!

我利用了set仅包含独特元素的事实。通过调用__len__每个方法,我可以确定是否s还仅包含唯一元素(忽略大小写)。

编辑:已更新以满足先前被忽略的要求,以为数字输入返回False。所有数字的集合编码为set(str(56**7))

编辑2:根据用户的建议,我现在利用解压缩参数来设置理解的优势。这正式破坏了与Python 2的兼容性。


3
欢迎来到PPCG!falses包含数字字符时也应该返回此值。
朱塞佩

使用`56**7`(如在其他python答案中)而不是str()更短?我不熟悉python,但这似乎是两个答案之间的主要区别。
朱塞佩

@Giuseppe python3没有``,仅使用python2的版本将节省4个字节(此位置为3个字节,而除法为1个字节)
Rod

@Rod完全正确。有趣的是,的56**7灵感来自您自己对以下数字0-9的编码,但是节省了1个字节。
Scott Norton

也许您可以添加Python 2版本?46字节:lambda s:len(s)==len(set(s.lower())-{`56**7`})
Sunny Patel


4

R,41个字节

!grepl("(.).*\\1|\\d",tolower(scan(,"")))

在线尝试!

正则表达式方法。!grepl(regex,scan(,""),F)没有用,所以我猜在R中捕获不区分大小写吗?我一般来说对正则表达式不好,所以如果我做错了,我不会感到惊讶...

R,58个字节

!anyDuplicated(c(el(strsplit(tolower(scan(,"")),"")),0:9))

在线尝试!

将数字附加0:9到(小写的)字符列表中,并测试是否有重复项。


3

红宝石25 23 21字节

得益于Giuseppe,两者均为-2个字节

->s{/(.).*\1|\d/i!~s}

在线尝试!


-2个字节,感谢KirillL。

红宝石 -n21 19 18 16字节

p !/(.).*\1|\d/i

在线尝试!


@Giuseppe,我认为那行不通,谢谢
Asone Tuhid

1
我认为,在第二个版本中,您甚至都不需要$_-仅仅抛出一个正则表达式而没有其他与之隐式匹配的内容$_16个字节
Kirill L.

@KirillL。谢谢,我从未见过!/.../,甚至在ruby-doc.org
Asone Tuhid

毫不奇怪,在从Perl的一些家伙那里得到建议之后,我也在这里学到了:)
Kirill

@KirillL。也不奇怪,红宝石怪异性通常是从perl继承的
Asone Tuhid 18'Apr

3

Brachylog,4个字节

ḷo⊆Ạ

在线尝试!

如果输入是等轴测图,则谓词将成功;否则,则谓词将失败;如果成功,则输出小写拉丁字母。由于Brachylog的内置谓词与子集和超集之间的普通关系不完全匹配,因此我不得不花一个字节对小写输入进行排序,但是节省了一个字节,不必显式检查其中的重复项。(如果不需要输掉数字,我们可以使用ḷ≠。)


2

外壳,6个字节

§=f√ü_

在线尝试!

说明

§=f√ü_  -- takes a string as argument, eg: "sAad2"
§       -- fork the argument..
  f√    -- | filter out non-letters: "sad"
    ü_  -- | deduplicate by lower-case: "sAd2"
 =      -- ..and compare: 0

2

Japt,12个字节

;v
oC ‰ eUq

说明:

;v
;         // Set alternative default vars, where C is the lowercase alphabet
 v        // Make the implicit input lowercase and reassign it
oC ‰ eUq
oC        // Remove all items from the input that are not in the alphabet
   ‰     // Split into chars and select unique array items
      eUq // Check if the result is equal to the input split into chars

在这里尝试。


2

MATL,9字节

kt2Y2X&X=

在线尝试!

k   % Lowercase implicit input
t   % Duplicate that
2Y2 % Push lowercase alphabet
X&  % Intersection of alphabet and duplicate lowercase input
X=  % Check for exact equality.


2

Japt 2.0,12 11个字节

-1字节感谢Nit

v
f\l â eUq

在线测试!


嗯,为什么将版本更改为更长的版本?此外,我认为Japt的最新版本是1.4.4 ...
Egg the Outgolfer

@EriktheOutgolfer原始文件没有考虑自动返回false的数字。
奥利弗

嗯,您使用的是Alpha版本,因为它实际上更短。
Erik the Outgolfer

@EriktheOutgolfer正确。正则表达式在香草Japt中的价格为+2。ethproductions.github.io/japt/…–
Oliver

1
@尼特谢谢!善用e
Oliver

2

JavaScript(Node.js)29 25字节

s=>!/(.).*\1|\d/i.test(s)

在线尝试!

感谢您的答案更新@BMO@ l4m2@KevinCruijssen

-4个字节,感谢@KevinCruijssen


s=>!/(.).*\1|[^a-z]/i.test(s)
l4m2 '18

@KevinCruijssen:我没有看到更新的版本

我很确定[^a-z]可以将其替换为\d
Kevin Cruijssen,

@KevinCruijssen:谢谢。已更新

2

视网膜,16字节

Ci`(.).*\1|\d
^0

以True 10Falsey值返回。
感谢@Neil在我的初始代码中发现并修复了一个错误。

在线尝试。

说明:

C             Check if the input matches part of the following regex:
 i`            Case insensitivity enabled
               Check if part of the input matches either:
  (.)           A character `C`
     .*         followed by zero or more characters
       \1       followed by the same character `C` again
         |     Or
          \d    A digit
^0             Invert Truthy/Falsey, basically replacing every 0 with a 1,
               and every other value with a 1

你为什么相反?
穆罕默德·萨尔曼

@MuhammadSalman两个原因:逆转比赛将花费更多字节。而且我不太熟悉Retina,所以我不确定如何逆转比赛的开始
。xD

原因1)。喔好吧。原因2)。大声笑
穆罕默德·萨尔曼

1

PowerShell,91字节

param($b)($a=[char[]]$b.ToUpper()|group|sort c*)[0].Count-eq$a[-1].count-and$b-notmatch'\d'

在线尝试!

天真的解决方案,但是我无法提出更好的算法。接受输入$b,将其转换为ToUpper大小写,并将其转换为char-array。对该数组进行管道传输,Group-Object以构造一个对象,该对象具有每个输入字母的名称/计数对。然后sort,我们基于count取其0第一个。我们检查其.Count-eqUAL到.Count最后的[-1]对。如果是这样,那么计数都是相等的,否则我们会有不同数量的字母。

然后-and,我们通过检查输入是否-notmatch反对\d以排除输入中的任何数字。该布尔结果留在管道上,并且输出是隐式的。



1

Python 2中57 56个字节

x=input().lower()
print len(set(x)-set(`763**4`))/len(x)

在线尝试!

首先将其输入,然后输入一组,删除重复项,然后删除数字(以编码`763**4`),然后检查长度是否与原始输入相同


1

Java 8,61 39字节

s->!s.matches("(?i).*((.).*\\2|\\d).*")

说明:

在线尝试。

s->  // Method with String parameter and boolean return-type
  !s.matches("(?i).*((.).*\\2|\\d).*")
     //  Return whether the input does not match the regex

正则表达式说明:

String#matches隐式添加^...$

^(?i).*((.).*\2|\d).*$
 (?i)                      Enable case insensitivity
^    .*                    Zero or more leading characters
       (       |  )        Followed by either:
        (.)                 Any character `C`
           .*               with zero or more characters in between
             \2             followed by that same character `C` again
               |           Or:
                \d          Any digit
                   .*$     Followed by zero or more trailing characters

1

APL(Dyalog Unicode),12个字节

匿名默认功能。

(∪≡~∘⎕D)819

在线尝试!

819⌶ 小写

(…… ) 对此应用以下默认功能:

~∘⎕D从参数中 删除数字

∪≡ 该论点的独特元素是否与此相同?


1

Perl 6、22字节

{!(.uc~~/(.).*$0|\d/)}

在线尝试!

某些字符没有匹配项,然后是同一字符。隐式函数作为代码块,在$ _上隐式匹配,用反转书本!。添加了|\d(ta Adam)但也需要.uc~~,需要括号...

袋装替代品,23字节

{.uc.ords.Bag65..97}

在线尝试!

然后将这一情况归一化,制作一个袋子(用发生率计数)。仅当所有成员都是比较包的成员并且所有事件计数均小于或等于比较包中的次数时,才设置subsub或等于true。因此,任何重复或数字都会使比较错误。


失败abc1
亚当

嗯,在添加数字规格之前写了这个答案。
菲尔H

您可以添加|\d吗?
亚当

@Adám:有点。意识到如果这些字母的大小写不同,它也不会检测到重复的字母,因此需要对大小写进行规范化并添加括号。
Phil H



1

Visual Basic应用程序(32位),102字节

s=LCase(InputBox(u)):j=1:For i=1To Len(s):k=Mid(s,i,1):j=j*0^Instr(i+1,s,k)*(k Like"[a-z]"):Next:?j<>0

使用以下事实:0^x如果x为零,则在VBA中产生1,否则为0。在立即(调试)窗口中运行。

编辑:正如泰勒在评论中指出的那样,这仅适用于MS Office的32位安装。


如果将语言限制为Excel VBA,则可以通过从中s=LCase([A1]):j=1:For i=1To Len(s):k=Mid(s,i,1):j=j*0^InStr(i+1,s,k)*(k Like"[a-z]"):Next:?j<>0获取输入,将其交换为95字节[A1]。另外,值得注意的是,由于VBA中的幂运算很奇怪,因此该解决方案仅限于32位Office安装。
泰勒·斯科特

此外,通过使用适当的大写字母(请参见上文),并<!-- language-all: lang-vb -->在您的答案中添加一个标记以添加语法突出显示,您可以使您的答案看起来更好并且更具可读性
Taylor Scott

1
@TaylorScott谢谢!添加了语法高亮显示并注释了32位限制。关于Excel输入,我宁愿将解决方案的应用程序保持不变。
dnep

1

05AB1E,4个字节

lDÔQ

在线尝试!

说明

l      # convert input to lowercase
 D     # duplicate and push to stack
  Ô    # uniquify the list of characters
   Q   # check for equality

如果输入包含非字母字符,则此操作将失败。
粗野的


The input will only contain letters and/or numbers, no spaces ([a-zA-Z0-9])
LordColus

等距图是由字母组成的单词,没有重复 ”-即,包含数字的“单词”应返回假值。有关示例,请参见第5个测试用例。
粗野的

我的错。有关正确的05AB1E代码,请参见@Enigma的答案。
LordColus



0

CJam,11个字节

qelA,s+_L|=

在线尝试!

说明

基本思想是在每个数字后面附加一个数字,然后检查是否重复。由于附录确保每个数字已经存在一次,因此任何其他数字的存在都将重复,从而导致其返回false。

q      e# read the input:            | "MOoSE1"
el     e# convert to lowercase:      | "moose1"
A      e# push 10:                   | "moose1" 10
,      e# range [0,N):               | "moose1" [0 1 2 3 4 5 6 7 8 9]
s      e# string representation:     | "moose1" "0123456789"
+      e# concatenate:               | "moose10123456789"
_      e# duplicate:                 | "moose10123456789" "moose10123456789"
L|     e# union with the empty list: | "moose10123456789" "mose1023456789"
       e# (this gets rid of duplicates)
=      e# Equal to original:         | 0


0

Smalltalk,57个字节

在类String中定义的方法:

s^(self select:#isLetter)asUppercase asSet size=self size

这很可能是不言自明的。


0

Pyth,17个字节

.Am&!t/rz0d}dGrz0

测试套件

说明:
.Am&!t/rz0d}dGrz0 # Code
  m           rz0 # Map the following over the lowercase input:
      /rz0d       #  Count occurrences of d in lowercase input
     t            #   minus 1
    !             #    inverted (0 -> True)
   &              #     and
           }dG    #      d is in the lowercase alphabet
.A                # Print whether all values are truthy
Python 3翻译:
z=input()
print(all(map(lambda d:not z.lower().count(d)-1and d in "abcdefghijklmnopqrstuvwxyz",z.lower())))

0

C#,82个字节

bool f(string s)=>!!(s.GroupBy(c=>c).Any(c=>c.Count()>1|(!Char.IsLetter(c.Key))));

编辑:为字符添加测试

编辑:使用GroupBy将其缩短5个字节


1
欢迎来到PPCG!我认为您没有要求还需要检查输入内容是否包含数字的要求。
Martin Ender '18

0

APL(Dyalog Unicode)25 20 22字节

'''(.).*\1|\d'S'&'1

在线尝试!

返回1表示true,否则返回0。

@ H.PWiz节省了5个字节

固定,并通过@Adám保存了另一个字节

怎么样?

'''(.).*\1|\d'S'&'1  Tacit fn
                    1  Ignore case
               S'&'    Search and return the match(es)
   '(.).*\1|\d'         For this regex
''                     And compare to the empty string

失败abc1
亚当

是不是\w.有效?
亚当

如果您的意思是(.).*\1,不。它也因以下原因而失败abc1:/
J.Sallé18年

我不明白 您所说的“也失败”是什么意思?
亚当

如果您 在线尝试!你可以看到它返回1 abc1,当它应该返回0
J.拉萨尔

0

Tcl,114字节

proc I w {lmap c [set L [split $w ""]] {if {[regexp -all -nocase $c $w]>1|![string is alp $c]} {return 0}}
expr 1}

在线尝试!

Tcl,121字节

proc I w {lmap c [set L [split $w ""]] {if {[llength [lsearch -al -noc $L $c]]>1|![string is alp $c]} {return 0}}
expr 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.