アイソグラムチェッカー


13

チャレンジ:

単語が与えられたら、それがアイソグラムかどうかを確認します。


何 :

アイソグラムは、重複のない文字のみで構成される単語です(大文字と小文字は区別されません)。空の文字列はアイソグラムです。


例:

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

入力:

合理的な形式の入力を受け入れることができます

入力には文字や数字のみが含まれ、スペースは含まれません([a-zA-Z0-9]


出力:

  • true または入力がアイソグラムである場合、任意の真実の値
  • false または偽の値

これはので、各言語のバイト単位の最短コードが優先されます。


3
推奨されるテストケース:sad2
アダム

1
アイソグラムの定義には、2つの異なる矛盾した声明が含まれています。どっち?
ポストロックガーフハンター

9
チャレンジを投稿する前にこれらの問題をキャッチできるように、サンドボックスの使用を開始することをお勧めします。
fəˈnɛtɪk

3
@MuhammadSalmanこれは非常にずさんで、引用の最後から「。Any」を削除して、さらに例を挙げてください(何も表示されないsad2das場合でも失敗し2ます)。
Asone Tuhid

4
「What」と「Notes」は互いに矛盾しているように見えます。「文字のみを含む文字列アイソグラムであるかどうかを決定する関数を実装する」(強調を追加)および「数字があり、それらはfalseを返す必要があります」反対のことを言う。私は今のところ不明確として閉鎖することに投票しましたが、それが解消されたら喜んで撤回します!
ジュゼッペ

回答:


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へようこそ!これは、数字が含まれているfalse場合sにも返されることになっています。
ジュゼッペ

使用している`56**7`(他のPythonの回答のように)の代わりに、str()短いですか?私はPythonに精通していませんが、それはあなたの2つの答えの主な違いのようです。
ジュゼッペ

@Giuseppe python3にはありません``、python2のみのバージョンは4バイトを節約します(これで3 +除算で1が代わりに等しくなります)
ロッド

@Rodまさにその通り。おもしろいことに、これ56**7は以下の0〜9の数字の独自のエンコードに触発されましたが、1バイト節約します。
スコットノートン

おそらく、Python 2バージョンを追加できますか?46バイト:lambda s:len(s)==len(set(s.lower())-{`56**7`})
サニーパテル


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バイト

ジュゼッペのおかげで両方とも-2バイト

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

オンラインでお試しください!


キリルLのおかげで-2バイト

ルビー -n21 19 18 16バイト

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

オンラインでお試しください!


@ジュゼッペ私はそれがうまくいくとは思わなかった、ありがとう
アソーン・トゥヒド

1
私は、第二のバージョンでは、あなたがさえ必要としないと思う$_-ちょうど何かせずに正規表現で投げ暗黙的に対してそれと一致した$_16バイト
キリルL.

@KirillL。おかげで、今まで見た!/.../ことのない、ruby-doc.org
Asone Tuhid

驚くことではありませんが、私はPerlの男からアドバイスを受けた後、ここでそれについても学びました:)
キリルL.

@KirillL。驚くことでもありませんが、ルビーの奇妙さは一般にperlから継承されます
Asone Tuhid

3

Brachylog、4バイト

ḷo⊆Ạ

オンラインでお試しください!

入力がアイソグラムの場合、述語は成功し、そうでない場合は失敗し、成功した場合は小文字のラテンアルファベットを出力します。Brachylogの組み込み述語はサブセットとスーパーセットの通常の関係と完全には一致しないため、小文字の入力の並べ替えに1バイトを費やす必要がありましたが、重複を明示的にチェックする必要がないため1バイトを節約しました。(数字で失敗する必要がない場合は、単に使用できますḷ≠。)



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

JAPT 2.0、12 11バイト

Nitのおかげで-1バイト

v
f\l â eUq

オンラインでテストしてください!


ええ、なぜあなたはより長いバージョンにバージョンを変更したのですか?また、Japtの最後のバージョンは1.4.4であると思います...
Erik the Outgolfer

@EriktheOutgolferオリジナルは、自動的にfalseを返す数値を考慮していませんでした。
オリバー

ああ、実際は短いのでアルファ版を使用しました。
エリックアウトゴルファー

@EriktheOutgolferそうです。正規表現は、バニラジャプトでは+2かかります。ethproductions.github.io/japt/…–
オリバー

1
@Nitありがとう!良い使用e
オリバー

2

JavaScript(Node.js)29 25バイト

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

オンラインでお試しください!

答えに更新してくれてありがとう@BMO@ l4m2@KevinCruijssen

@KevinCruijssenのおかげで-4バイト


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

@KevinCruijssen:私は、更新されたバージョン表示されませんでした

[^a-z]置き換えることができると確信しています\d
ケビンCruijssen

@KevinCruijssen:ありがとう。更新

2

網膜、16バイト

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

1TruthyおよびFalseyの値として返します0。最初のコードのバグを発見して修正して
くれた@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 2つの理由:一致を逆にすると、より多くのバイトが必要になる そして私も、私は確信して.. xDさんで開始する試合を逆にする方法はないよので、網膜に習熟していないよ
ケビンCruijssen

理由1)。わかった 理由2)。笑
ムハンマドサルマン

1

PowerShell、91バイト

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

オンラインでお試しください!

素朴なソリューションですが、より良いアルゴリズムを思い付くことができません。入力を受け取り$bToUpper大文字と小文字を変換し、char-array としてキャストします。Group-Object入力文字ごとに名前/カウントのペアを持つオブジェクトを構築する配列のパイプ。それからsort、私たちはそのc誓約に基づいて、0その1つ目を取ります。私たちは、そのことを確認してくださいが.Countある-eqにUAL .Count最後の[-1]ペア。その場合、カウントはすべて等しくなります。そうでない場合は、文字の量が異なります。

その後、我々-and入力するかどうかをチェックすると、その-notmatch反対ESが\d入力で任意の数字を除外するために。そのブール結果はパイプラインに残り、出力は暗黙的です。




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

Perl 6、22バイト

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

オンラインでお試しください!

一部の文字に一致するものがなく、後で同じ文字に一致する コードブロックとしての暗黙的な関数!。$ _で暗黙的に一致し、でブックを反転します。|\d(ta Adam)を追加しましたが.uc~~、括弧も必要でした。

Bagsの代替、23バイト

{.uc.ords.Bag65..97}

オンラインでお試しください!

この1つは、ケースを正規化してからバッグを作成します(発生カウントで設定)。すべてのメンバーが比較バッグのメンバーであり、すべての発生件数が比較バッグのメンバー数以下である場合にのみ、サブセットまたは等しい。したがって、繰り返しまたは数字があると、比較が偽になります。


失敗しabc1ます。
アダム

ああ、数字の仕様が追加される前にこの答えを書きました。
フィルH

追加することはでき|\dませんか?
アダム

@Adám:並べ替え。また、これらの文字の大文字小文字が異なる場合、繰り返される文字を検出しなかったため、大文字小文字を正規化し、括弧も追加する必要がありました。
フィルH



1

Visual Basic for Applications(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

VBAでは0^x、xがゼロの場合は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ビットのオフィスインストールに制限されていることは奇妙なので注目に値します。
テイラースコット

また、あなたは適切な大文字と小文字を使用して(上記参照)と追加することによって、あなたの答えの外観がより良く、より読みやすくすることができ<!-- language-all: lang-vb -->シンタックスハイライトを追加するためにあなたの答えにフラグを
テイラースコット

1
@TaylorScottありがとう!構文の強調表示を追加し、de 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|=

オンラインでお試しください!

説明

基本的な考え方は、各桁を追加してから重複をチェックすることです。追加により、各桁がすでに1回存在することが保証されるため、それ以降の数字の存在は重複し、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 bytes

Method to be defined in class String:

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

This is most likely self-explanatory.


0

Pyth, 17 bytes

.Am&!t/rz0d}dGrz0

Test suite

Explanation:
.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 translation:
z=input()
print(all(map(lambda d:not z.lower().count(d)-1and d in "abcdefghijklmnopqrstuvwxyz",z.lower())))

0

C#, 82 bytes

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

edit: added test for char

edit: using GroupBy to shorten it by 5 byte


1
Welcome to PPCG! I think you're missing the requirement that you also need to check that the input contains no digits.
Martin Ender

0

APL (Dyalog Unicode), 25 20 22 bytes

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

Try it online!

Returns 1 for true, else 0.

Saved 5 bytes thanks to @H.PWiz

Fixed, and saved another byte thanks to @Adám

How?

'''(.).*\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

Fails on abc1.
Adám

Isn't \w. valid?
Adám

If you mean (.).*\1, no. It also fails for abc1 :/
J. Sallé

I don't understand. What do you mean by "it also fails"?
Adám

If you Try it Online! you can see it returns 1 for abc1, when it should return 0.
J. Sallé

0

Tcl, 114 bytes

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

Try it online!

Tcl, 121 bytes

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}

Try it online!

Still too long for my taste!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.