İzogram denetleyicisi


13

Meydan okuma :

Bir kelime verildiğinde, bunun bir izogram olup olmadığını kontrol edin.


Ne :

İzogram, yalnızca kopya içermeyen harflerden (büyük / küçük harf duyarsız) oluşan bir kelimedir. Boş dize bir izogramdır.


Örnekler:

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

Giriş:

Girişi makul herhangi bir biçimde kabul edebilirsiniz

Giriş yalnızca harf ve / veya rakam içerecek, boşluk içermeyecek ( [a-zA-Z0-9])


Çıktı :

  • true veya giriş bir izogram ise herhangi bir doğruluk değeri
  • false veya aksi takdirde herhangi bir falsy değeri

Bu yani her dilde bayt en kısa kod kazanır.


3
Önerilen test örneği:sad2
Adám

1
İzogram tanımınız iki farklı çelişkili ifade içerir. Hangisi?
Ad Hoc Garf Hunter

9
Bu sorunları meydan okumadan önce yakalayabilmeniz için korumalı alanı kullanmaya başlamanızı öneririm .
fəˈnɛtɪk

3
@MuhammadSalman Bu çok özensiz, lütfen "Herhangi bir" teklifinizi kaldırın ve daha fazla örnek verin ( hiçbir şey göstermez sad2dasbile başarısız olur 2).
Asone Tuhid

4
"Ne" ve "Notlar" birbiriyle çelişiyor gibi görünüyor: " Yalnızca harf içeren bir dizenin bir izogram olup olmadığını belirleyen bir işlev uygulayın" (vurgu eklenmiştir) ve "Sayılar olabilir ve bunlar yanlış döndürür ve döndürmelidir" zıt şeyler söyleyin. Şu an için belirsiz olarak kapatmak için oy verdim, ancak temizlendikten sonra mutlu bir şekilde geri çekeceğim!
Giuseppe

Yanıtlar:


9

Piton 2/ 3 36 52 48 bayt

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

Çevrimiçi deneyin!

setSadece benzersiz unsurlar içeren gerçeklerden faydalanıyorum . __len__Her birinin yöntemini çağırarak, syalnızca benzersiz öğeler içerip içermediğini belirleyebilirim (yoksayma durumu).

EDIT: Sayısal girişler için False döndürmek için önceden gözden kaçan gereksinimi karşılamak üzere güncelleştirildi. Tüm basamaklar kümesi olarak kodlanır set(str(56**7)).

DÜZENLEME 2: Bu kullanıcı önerisini izleyerek , şimdi kavrayışı ayarlamak için argümanları açmaktan faydalanıyorum. Bu Python 2 ile uyumluluğu resmi olarak bozar.


3
PPCG'ye hoş geldiniz! Bu aynı zamanda dönmek gerekiyordu falsezaman sbir rakam karakteri içeriyor.
Giuseppe

kullanıyorsa `56**7`(diğer piton cevap olduğu gibi) yerine str()daha kısa? Python'a aşina değilim ama bu iki cevabınız arasındaki temel fark gibi görünüyor.
Giuseppe

@ Giuseppe python3 yok ``, sadece bir python2 sürümü 4 bayt tasarruf edecekti (bu bölümdeki 3 + bunun yerine bölüm 1'e eşittir)
Rod

@Tamamen doğru. Funnily, 56**7aşağıdaki 0-9 rakamlarını kendi kodlamanızdan ilham aldı, ancak 1 bayt tasarruf etti.
Scott Norton

Belki de bir Python 2 sürümü ekleyebilirsiniz? 46 Bayt:lambda s:len(s)==len(set(s.lower())-{`56**7`})
Sunny Patel


4

R , 41 bayt

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

Çevrimiçi deneyin!

Normal ifade yaklaşımı. !grepl(regex,scan(,""),F)işe yaramadı bu yüzden yakalama R büyük / küçük harf duyarsız eşleşmiyor sanırım? Genel olarak normal ifadede kötüyüm, bu yüzden sadece yanlış yapıyorsam şaşırmayacağım ...

R , 58 bayt

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

Çevrimiçi deneyin!

Basamakları 0:9(küçük harfli) karakter listesine ekler ve yinelenme olup olmadığını test eder.


3

Yakut , 25 23 21 bayt

Giuseppe sayesinde her ikisi de -2 bayt

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

Çevrimiçi deneyin!


Kirill L. sayesinde -2 bayt.

Yakut -n , 21 19 18 16 bayt

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

Çevrimiçi deneyin!


@Giuseppe Ben bu işe yarar teşekkür düşünmüyordu
Asone TÜHİD

1
Sanırım, ikinci versiyonda, ihtiyacınız bile yok $_- sadece dolaylı olarak başka bir şey olmadan regex atma $_: 16 bayt
Kirill L.

@KirillL. teşekkürler, daha !/.../önce hiç görmedim , ruby
doc.org'da

Şaşırtıcı olmayan, bazı Perl adamlarından tavsiye aldıktan sonra da burada öğrendim :)
Kirill L.

@KirillL. ya da şaşırtıcı değil, yakut gariplik genellikle perl miras
Asone Tuhid

3

Brachylog , 4 bayt

ḷo⊆Ạ

Çevrimiçi deneyin!

Girdi bir izogram ise yüklem başarılı olur ve değilse başarısız olur, başarılı olursa küçük Latin alfabesinin çıktısını alır. Brachylog'un yerleşik yüklemi, bir alt küme ve üst küme arasındaki sıradan ilişkiyle tam olarak eşleşmediğinden, küçük harfli girdiyi sıralamak için bir bayt harcamak zorunda kaldım, ancak içindeki kopyaları açıkça kontrol etmek zorunda kalmadan bir bayt kaydettim. (Sayılarla başarısız olması gerekmiyorsa, sadece kullanabiliriz ḷ≠.)


2

Kabuk , 6 bayt

§=f√ü_

Çevrimiçi deneyin!

açıklama

§=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 bayt

;v
oC ‰ eUq

Açıklama:

;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

Burada deneyin.


2

MATL , 9 bayt

kt2Y2X&X=

Çevrimiçi deneyin!

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 bayt

Nit sayesinde -1 bayt

v
f\l â eUq

Çevrimiçi test edin!


Neden sürümü daha uzun bir sürüme değiştirdiniz? Ayrıca, Japt'un son versiyonunun 1.4.4 olduğunu düşünüyorum ...
Outgolfer Erik

@EriktheOutgolfer Orijinal, otomatik olarak yanlış dönen sayıları hesaba katmadı.
Oliver

Ah, yani alfa versiyonunu kullandın çünkü aslında daha kısa.
Erik the Outgolfer

@EriktheOutgolfer Doğru. Normal ifadenin vanilya Japt'te +2'ye mal olacaktı. ethproductions.github.io/japt/…
Oliver

1
@Nit Teşekkürler! İyi kullanıme
Oliver

2

JavaScript (Node.js) , 29 25 bayt

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

Çevrimiçi deneyin!

@BMO , @ l4m2 , @KevinCruijssen yanıtındaki güncelleme için teşekkür ederiz

@KevinCruijssen sayesinde -4 bayt


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

@KevinCruijssen: Güncellenmiş sürümü

Eminim onunla [^a-z]değiştirilebilir\d
Kevin Cruijssen

@KevinCruijssen: Teşekkürler. güncellendi

2

Retina , 16 bayt

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

İade 1Truthy olarak ve 0Falsey değerleri olarak. İlk kodumdaki bir hatayı keşfettiğiniz ve düzelttiğiniz için @Neil'e
teşekkürler .

Çevrimiçi deneyin.

Açıklama:

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

Seninki neden zıt?
Muhammed Salman

@MuhammadSalman İki sebep: maçları tersine çevirmek baytlara mal olacak. Ve Retina ile çok yetenekli değilim bu yüzden maçlar ile başlamak için nasıl ters emin değilim .. xD
Kevin Cruijssen

Sebep 1). Ah tamam. Sebep 2). LOL
Muhammed Salman

1

PowerShell , 91 bayt

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

Çevrimiçi deneyin!

Saf bir çözüm, ama daha iyi bir algoritma bulamıyorum. Girdi alır $b, durumu dönüştürür ToUpper, bir chardizi olarak çevirir. Group-ObjectHer bir giriş harfi için ad / sayı çiftine sahip bir nesne oluşturan diziyi pipetler. Sonra biz ount sortdayalı cve 0th almak . Biz onun kontrol .Countolduğunu -eqiçin ual .Countson bir [-1]çifti. Eğer öyleyse, sayımların hepsi eşittir, aksi takdirde farklı miktarda harfimiz vardır.

Daha sonra -and, girişteki herhangi bir haneyi dışlamak için girişin -notmatchters olup olmadığını kontrol ederek \d. Bu Boolean sonucu boru hattında kalır ve çıktı örtüktür.



1

Python 2 , 57 56 bayt

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

Çevrimiçi deneyin!

Öncelikle daha sonra bir kümeye girin, kopyaları kaldırın, ardından rakamları (kodlanmış `763**4`) çıkarın , ardından uzunluğun orijinal girişle aynı olup olmadığını kontrol edin


1

Java 8, 61 39 bayt

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

Açıklama:

Çevrimiçi deneyin.

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

Normal ifade açıklaması:

String#matchesdolaylı olarak ekler ^...$.

^(?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 bayt

Anonim zımni fonksiyonu.

(∪≡~∘⎕D)819

Çevrimiçi deneyin!

819⌶ küçük

() Üzerine aşağıdaki örtük işlevini uygulayın:

~∘⎕Dargümandan D igits  kaldırmak

∪≡ argümanın benzersiz unsurları bununla aynı mı?


1

Perl 6 , 22 bayt

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

Çevrimiçi deneyin!

Bazı karakterler için eşleşme yok, daha sonra aynı karakter. Kod bloğu olarak örtük işlev, $ _ ile örtük olarak eşleşir, kitabı tersine çevirir !. Eklenen |\d(Adam ta) değil, aynı zamanda gerekli .uc~~parantez gerekli olan ...

Çantalı Alternatif, 23 bayt

{.uc.ords.Bag65..97}

Çevrimiçi deneyin!

Bu durumda normalize bir çanta yapar (insidans sayımları ile ayarlanır). Alt küme veya eşit, ancak tüm üyeler karşılaştırma Çantası'nın üyesiyse ve tüm insidans sayıları karşılaştırma Çantası'ndakilerden küçük veya eşitse doğrudur. Böylece tekrarlar veya rakamlar karşılaştırmayı yanlış yapar.


Başarısız abc1.
Adám

Ah, bu cevabı spec numaraları eklenmeden önce yazdı.
Phil H

Sadece ekleyebilir |\dmisin?
Adám

@ Adám: Bir çeşit. Ayrıca, bu harflerin vakaları farklıysa tekrarlanan harfleri algılamadığını fark etti, bu yüzden davayı normalleştirmek ve paren eklemek de gerekiyordu.
Phil H



1

Uygulamalar için Visual Basic (32 bit), 102 bayt

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'da 0^xx sıfırsa 1, aksi takdirde 0 verir. Anında (hata ayıklama) penceresinde çalıştır.

Düzenleme: yorumlarda Taylor tarafından işaret edildiği gibi bu sadece MS Office 32 bit yüklemelerinde çalışır.


Dilinizi Excel VBA ile kısıtlarsanız, 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<>0girdiyi alarak bunu 95 bayta kadar değiştirebilirsiniz [A1]. Ayrıca, VBA'daki Exponentiation'ın bu çözümün 32 bit ofis yüklemeleriyle sınırlandırılması tuhaf olduğu için belirtmek gerekir .
Taylor Scott

Ayrıca, uygun büyük harf kullanımı (yukarıya bakın) ve <!-- language-all: lang-vb -->sözdizimi vurgulama eklemek için cevabınıza bir bayrak ekleyerek cevabınızın daha iyi ve daha okunabilir görünmesini sağlayabilirsiniz
Taylor Scott

1
@TaylorScott teşekkürler! Sözdizimi vurgulama eklendi ve 32 bit kısıtlaması not edildi. Excel girişi hakkında, mümkün olduğunca çözüm uygulaması değişmez tutmak istiyorum.
dnep

1

05AB1E , 4 bayt

lDÔQ

Çevrimiçi deneyin!

açıklama

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

Giriş, harf olmayan karakterler içeriyorsa bu başarısız olur.
Shaggy


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

" İzogram, yalnızca kopya içermeyen harflerden oluşan bir kelimedir " - yani, sayılar içeren "kelimeler" bir falsey değeri döndürmelidir. Örnek için 5. test senaryosuna bakın.
Shaggy

Benim hatam. Doğru 05AB1E kodu için @ Enigma'nın cevabına bakınız.
LordColus



0

CJam , 11 bayt

qelA,s+_L|=

Çevrimiçi deneyin!

açıklama

Temel fikir, her bir basamağı eklemek ve yinelemeleri kontrol etmektir. Ek, her basamağın zaten bir kez mevcut olmasını sağladığından, basamakların başka bir varlığı da yinelenir ve yanlış döndürür.

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 bayt

Dize sınıfında tanımlanacak yöntem:

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

Bu büyük olasılıkla kendi kendini açıklayıcı niteliktedir.


0

Pyth , 17 bayt

.Am&!t/rz0d}dGrz0

Test odası

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

0

C #, 82 bayt

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

düzenleme: char için test eklendi

edit: 5 bayt kısaltmak için GroupBy kullanma


1
PPCG'ye Hoşgeldiniz! Sanırım girişte rakam bulunmadığını da kontrol etmeniz gerekiyor.
Martin Ender

0

APL (Dyalog Unicode) , 25 20 22 bayt

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

Çevrimiçi deneyin!

True için 1, başka 0 için döndürür.

@ H.PWiz sayesinde 5 bayt kurtardı

@ Adám sayesinde düzeltildi ve başka bir bayt kurtardı

Nasıl?

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

Başarısız abc1.
Adám

\w.Geçerli değil mi?
Adám

Eğer demek istiyorsan (.).*\1, hayır. Ayrıca başarısız olur abc1: /
J. Sallé

Anlamıyorum. "Başarısız oluyor" ile ne demek istiyorsun?
Adám

Eğer varsa onu Çevrimiçi deneyin! abc10 döndürmesi gerektiğinde 1 döndürdüğünü görebilirsiniz.
J. Sallé

0

Tcl , 114 bayt

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

Çevrimiçi deneyin!

Tcl , 121 bayt

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}

Çevrimiçi deneyin!

Hala benim zevkime göre çok uzun!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.