Kontroler izogramów

13

Wyzwanie:

Biorąc pod uwagę słowo, sprawdź, czy jest to izogram.


Co :

Izogram to słowo składające się wyłącznie z liter bez duplikatów (bez rozróżniania wielkości liter). Pusty ciąg jest izogramem.


Przykłady:

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

Wejście :

Możesz zaakceptować dane wejściowe w dowolnym rozsądnym formacie

Dane wejściowe będą zawierać tylko litery i / lub cyfry, bez spacji ( [a-zA-Z0-9])


Wynik :

  • true lub dowolną prawdziwą wartością, jeśli wejście jest izogramem
  • false lub jakąkolwiek inną wartość fałszowania

To jest więc wygrywa najkrótszy kod w bajtach w każdym języku.

Muhammad Salman
źródło
3
Sugerowany przypadek testowy:sad2
Adám
1
Twoja definicja izogramu obejmuje dwa różne sprzeczne stwierdzenia. Który to jest?
Ad Hoc Garf Hunter
9
Zalecam, abyś zaczął korzystać z piaskownicy , aby te problemy można było wykryć przed opublikowaniem wyzwania.
fəˈnɛtɪk
3
@MuhammadSalman To jest bardzo niechlujne, proszę usunąć „. Any” na końcu cytatu i podać kilka innych przykładów ( sad2dasnie udałoby się nawet bez, 2więc nic nie pokazuje).
Asone Tuhid
4
Wydaje się, że słowa „Co” i „Notatki” są ze sobą sprzeczne: „Zaimplementuj funkcję, która określa, czy ciąg zawierający tylko litery jest izogramem” (podkreślenie dodane) i „Mogą istnieć liczby, które będą i muszą zwracać fałsz” mówić rzeczy przeciwne. W tej chwili głosowałem za zamknięciem, ponieważ jest niejasny, ale chętnie go wycofam, gdy zostanie to wyjaśnione!
Giuseppe,

Odpowiedzi:

9

Pytona 2/ 3 36 52 48 bajtów

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

Wypróbuj online!

Korzystam z faktu, że setzawiera tylko unikalne elementy. Wywołując __len__metodę każdego z nich, mogę ustalić, czy szawiera także tylko unikalne elementy (ignorując wielkość liter).

EDYCJA: Zaktualizowano, aby spełnić wcześniej przeoczone wymaganie zwrotu False dla danych numerycznych. Zbiór wszystkich cyfr jest zakodowany jako set(str(56**7)).

EDYCJA 2: Zgodnie z sugestią użytkownika , teraz korzystam z rozpakowywania argumentów, aby ustawić zrozumienie. To formalnie psuje zgodność z Python 2.

Scott Norton
źródło
3
Witamy w PPCG! To również ma się zwrócić, falsegdy szawiera cyfrę.
Giuseppe,
używa `56**7`(jak w innym pythonie) zamiast str()krótszego? Nie znam Pythona, ale wydaje się, że to główna różnica między twoimi dwiema odpowiedziami.
Giuseppe,
@Giuseppe python3 nie ma ``, wersja tylko dla python2 zaoszczędziłaby 4 bajty (3 na tym + 1 na dzieleniu zamiast równa się)
Rod
@Rod dokładnie w porządku. Co ciekawe, 56**7inspiracją było własne kodowanie cyfr 0-9 poniżej, ale oszczędza twój o 1 bajt.
Scott Norton
Być może możesz dodać wersję Python 2? 46 bajtów:lambda s:len(s)==len(set(s.lower())-{`56**7`})
Sunny Patel,
5

05AB1E , 5 bajtów

lDáÙQ

Wypróbuj online!

Wyjaśnienie

l        # convert input to lower-case
 D       # duplicate
  á      # keep only letters
   Ù      # remove duplicates
    Q     # compare for equality
Emigna
źródło
4

R , 41 bajtów

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

Wypróbuj online!

Podejście regex. !grepl(regex,scan(,""),F)nie działało, więc myślę, że przechwytywanie nie pasuje bez rozróżniania wielkości liter w R? Ale ogólnie jestem kiepski w wyrażeniach regularnych, więc nie będę zaskoczony, jeśli zrobię to źle ...

R , 58 bajtów

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

Wypróbuj online!

Dołącza cyfry 0:9do listy (małych liter) znaków i sprawdza, czy są jakieś duplikaty.

Giuseppe
źródło
3

Rubin , 25 23 21 bajtów

-2 bajty na obu dzięki Giuseppe

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

Wypróbuj online!


-2 bajty dzięki Kirill L.

Ruby -n , 21 19 18 16 bajtów

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

Wypróbuj online!

Asone Tuhid
źródło
@Giuseppe Nie sądziłem, że to zadziała, dzięki
Asone Tuhid,
1
Myślę, że w drugiej wersji nawet nie potrzebujesz $_- po prostu wrzucenie wyrażenia regularnego bez niczego innego pośrednio pasuje do $_: 16 bajtów
Kirill L.
@KirillL. dzięki, nigdy !/.../wcześniej nie widziałem , nie mogę go nawet znaleźć na ruby-doc.org
Asone Tuhid
Nic dziwnego, że dowiedziałem się o tym tutaj po otrzymaniu porady od jakiegoś faceta Perla :)
Kirill L.
@KirillL. nic dziwnego, że rubinowe dziwactwo jest na ogół dziedziczone po perlu
Asone Tuhid 18.04.2018
3

Brachylog , 4 bajty

ḷo⊆Ạ

Wypróbuj online!

Predykat się powiedzie, jeśli wejście jest izogramem, a jeśli się nie powiedzie, nie powiedzie się, wypisując małe litery alfabetu łacińskiego, jeśli się powiedzie. Ponieważ wbudowany predykat Brachylog nie pasuje dokładnie do zwykłej relacji między podzbiorem a nadzbiorem, musiałem poświęcić bajt na sortowanie małych liter, ale zaoszczędziłem bajt na tym, że nie muszę jawnie sprawdzać duplikatów. (Gdyby nie trzeba było zawieść z liczbami, moglibyśmy po prostu użyć ḷ≠).

Niepowiązany ciąg
źródło
2

Łuska , 6 bajtów

§=f√ü_

Wypróbuj online!

Wyjaśnienie

§=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
ბიმო
źródło
2

Japt , 12 bajtów

;v
oC ‰ eUq

Wyjaśnienie:

;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

Wypróbuj tutaj.

Gnida
źródło
2

MATL , 9 bajtów

kt2Y2X&X=

Wypróbuj online!

k   % Lowercase implicit input
t   % Duplicate that
2Y2 % Push lowercase alphabet
X&  % Intersection of alphabet and duplicate lowercase input
X=  % Check for exact equality.
Sanchises
źródło
2

Japt 2.0, 12 11 bajtów

-1 bajt dzięki Nit

v
f\l â eUq

Przetestuj online!

Oliver
źródło
Dlaczego zmieniłeś wersję na dłuższą? Myślę też, że ostatnia wersja Japt to 1.4.4 ...
Erik the Outgolfer
@EriktheOutgolfer Oryginał nie uwzględniał liczb automatycznie zwracających wartość false.
Oliver,
Ach, więc użyłeś wersji alfa, ponieważ jest ona faktycznie krótsza.
Erik the Outgolfer
@EriktheOutgolfer Right. Wyrażenie regularne kosztowałoby +2 w waniliowym Japt. ethproductions.github.io/japt/…
Oliver
1
@Nit Thanks! Dobre wykorzystaniee
Oliver
2

JavaScript (Node.js) , 29 25 bajtów

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

Wypróbuj online!

Dzięki za aktualizację odpowiedzi na @BMO , @ l4m2 , @KevinCruijssen

-4 bajty dzięki @KevinCruijssen


źródło
s=>!/(.).*\1|[^a-z]/i.test(s)?
l4m2
@KevinCruijssen: Nie widziałem zaktualizowanej wersji
Jestem prawie pewien, że [^a-z]można go zastąpić\d
Kevin Cruijssen
@KevinCruijssen: Dzięki. zaktualizowano
2

Siatkówka , 16 bajtów

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

Zwraca 1jako wartości Prawda i 0Falsey.
Dzięki @Neil za wykrycie i naprawienie błędu w moim początkowym kodzie.

Wypróbuj online.

Wyjaśnienie:

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
Kevin Cruijssen
źródło
Dlaczego twoje jest odwrotnie?
Muhammad Salman,
@MuhammadSalman Dwa powody: odwrócenie meczów kosztowałoby więcej bajtów. I nie jestem zbyt utalentowany w Retinie, więc nie jestem pewien, jak odwrócić mecze na początek.
XD
powód 1). Ach ok. powód 2). LOL
Muhammad Salman
1

PowerShell , 91 bajtów

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

Wypróbuj online!

Naiwne rozwiązanie, ale nie mogę wymyślić lepszego algorytmu. Pobiera dane wejściowe $b, konwertuje wielkość liter, rzutuje ToUpperje na chartablicę. Potokuje tablicę, w Group-Objectktórej konstruuje obiekt, który ma pary nazwa / liczba dla każdej litery wejściowej. Mamy to sortna podstawie cliczby i bierzemy ją 0. Sprawdzamy, czy .Countma -eqon .Countwartość ostatnią [-1]. Jeśli tak, to liczby są równe, w przeciwnym razie mamy inną liczbę liter.

Następnie -andsprawdzamy, czy dane wejściowe są -notmatchprzeciwne \dwykluczeniu jakichkolwiek cyfr na wejściu. Ten wynik logiczny jest pozostawiany w potoku, a dane wyjściowe są niejawne.

AdmBorkBork
źródło
1

Python 2 , 57 56 bajtów

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

Wypróbuj online!

Najpierw zamienia dane wejściowe na zestaw, usuwając duplikaty, następnie usuwa cyfry (zakodowane w `763**4`), a następnie sprawdza, czy długość jest taka sama jak oryginalna wartość wejściowa

Pręt
źródło
1

Java 8, 61 39 bajtów

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

Wyjaśnienie:

Wypróbuj online.

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

Wyjaśnienie Regex:

String#matchesdomyślnie dodaje ^...$.

^(?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
Kevin Cruijssen
źródło
1

APL (Dyalog Unicode) , 12 bajtów

Anonimowa funkcja ukryta.

(∪≡~∘⎕D)819

Wypróbuj online!

819⌶ małe litery

() Zastosuj do tego następującą ukrytą funkcję:

~∘⎕D usuń D igits z argumentu

∪≡ czy unikalne elementy argumentu są identyczne?

Adám
źródło
1

Perl 6 , 22 bajtów

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

Wypróbuj online!

Brak dopasowań dla jakiejś postaci, a później tej samej postaci. Funkcja niejawna jako blok kodu, niejawnie dopasuj do $ _, odwróć książkę za pomocą !. Dodano |\d(ta Adam), ale także potrzebne .uc~~, które wymagały nawiasów ...

Alternatywnie z torbami, 23 bajty

{.uc.ords.Bag65..97}

Wypróbuj online!

Ten jeden normalizuje obudowę, a następnie tworzy torbę (zestaw z liczeniem przypadków). Podzbiór lub wartość równa prawdy tylko wtedy, gdy wszyscy członkowie są członkami torby porównania, a wszystkie liczby wypadków są mniejsze lub równe wartościom w torbie porównania. Zatem wszelkie powtórzenia lub cyfry spowodowałyby, że porównanie byłoby fałszywe.

Phil H.
źródło
Nie działa abc1.
Adám
Ach, napisałem tę odpowiedź przed dodaniem specyfikacji liczbowej.
Phil H
Czy możesz po prostu dodać |\d?
Adám
@ Adám: W pewnym sensie. Uświadomił sobie, że nie wykrywa również powtarzających się liter, jeśli wielkość liter tych liter była inna, dlatego potrzebna była również normalizacja wielkości liter i dodawanie parenów.
Phil H
1
19 bajtów
Jo King,
1

Szybki , 81 bajtów

let s=readLine()!.lowercased().characters;print(s.count<1||Set(s).count==s.count)

Wypróbuj online!

Tamás Sengel
źródło
Ładny! 25 bajtów krótszych niż mój.
onnoweb
1

Visual Basic for Applications (32-bitowy), 102 bajty

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

Wykorzystano fakt, że w VBA 0^xdaje 1, jeśli x wynosi zero, a 0 w przeciwnym razie. Uruchom w oknie natychmiastowym (debugowania).

Edycja: jak wskazał Taylor w komentarzach, działa to tylko w 32-bitowych instalacjach MS Office.

dnep
źródło
Jeśli ograniczysz język do Excel VBA, możesz go zmienić 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<>0na 95 bajtów, pobierając dane wejściowe z [A1]. Warto również zauważyć, że ponieważ potęgowanie w VBA jest dziwne, że to rozwiązanie jest ograniczone do 32-bitowych instalacji pakietu Office.
Taylor Scott,
Możesz także sprawić, by twoja odpowiedź wyglądała lepiej i bardziej czytelnie, stosując odpowiednią wielkość liter (patrz wyżej) i dodając <!-- language-all: lang-vb -->flagę do odpowiedzi, aby dodać wyróżnianie składni
Taylor Scott
1
@TaylorScott dzięki! Dodano wyróżnianie składni i odnotowano ograniczenie 32-bitowe. Jeśli chodzi o dane wejściowe programu Excel, wolę, aby rozwiązanie zawsze było niezmienne dla aplikacji.
dnep
1

05AB1E , 4 bajty

lDÔQ

Wypróbuj online!

Wyjaśnienie

l      # convert input to lowercase
 D     # duplicate and push to stack
  Ô    # uniquify the list of characters
   Q   # check for equality
LordColus
źródło
Nie powiedzie się, jeśli dane wejściowe zawierają znaki nieliterowe.
Kudłaty
To działa
LordColus
The input will only contain letters and/or numbers, no spaces ([a-zA-Z0-9])
LordColus
Izogram to słowo składające się wyłącznie z liter bez duplikatów ” - tzn. „Słowa” zawierające liczby powinny zwracać wartość falsey. Zobacz przykład piątego przypadku testowego.
Kudłaty
Mój błąd. Zobacz odpowiedź @ Enigma na poprawny kod 05AB1E.
LordColus
1

C (gcc) , 87 85 83 bajtów

f(s,p,b,P)char*s,*p;{for(b=s;*s;++s)for(p=b*=*s>64;b&&p<s;b=(*s^*p++)&95?b:0);s=b;}

Wypróbuj online!

Jonathan Frech
źródło
@ceilingcat Dobra sugestia, dzięki.
Jonathan Frech,
@ceilingcat Dziękuję.
Jonathan Frech,
0

CJam , 11 bajtów

qelA,s+_L|=

Wypróbuj online!

Wyjaśnienie

Podstawowym pomysłem jest dodanie każdej cyfry, a następnie sprawdzenie duplikatów. Ponieważ dodatek zapewnia, że ​​każda cyfra jest już raz obecna, dalsza obecność cyfr będzie duplikatem, powodując, że zwróci fałsz.

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
Esolanging Fruit
źródło
0

Smalltalk, 57 bajtów

Metoda do zdefiniowania w klasie String:

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

Jest to najprawdopodobniej oczywiste.

Hans-Martin Mosner
źródło
0

Pyth , 17 bajtów

.Am&!t/rz0d}dGrz0

Zestaw testowy

Wyjaśnienie:
.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
Tłumaczenie Python 3:
z=input()
print(all(map(lambda d:not z.lower().count(d)-1and d in "abcdefghijklmnopqrstuvwxyz",z.lower())))
hakr14
źródło
0

C #, 82 bajty

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

edycja: dodano test dla char

edycja: używając GroupBy, aby skrócić go o 5 bajtów

Raymond Osterbrink
źródło
1
Witamy w PPCG! Myślę, że brakuje ci wymogu, że musisz również sprawdzić, czy dane wejściowe nie zawierają cyfr.
Martin Ender
0

APL (Dyalog Unicode) , 25 20 22 bajtów

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

Wypróbuj online!

Zwraca 1 dla wartości true, w przeciwnym razie 0.

Zaoszczędzono 5 bajtów dzięki @ H.PWiz

Naprawiono i zapisano kolejny bajt dzięki @ Adám

W jaki sposób?

'''(.).*\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
J. Sallé
źródło
Nie działa abc1.
Adám
Czy \w→ nie jest .ważne?
Adám
Jeśli masz na myśli (.).*\1, nie. Nie działa również w przypadku abc1: /
J. Sallé
Nie rozumiem. Co rozumiesz przez „to także nie działa”?
Adám
Jeśli spróbujesz online! widać, że zwraca 1 abc1, gdy powinno zwrócić 0.
J. Sallé
0

Tcl , 114 bajtów

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

Wypróbuj online!

Tcl , 121 bajtów

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}

Wypróbuj online!

Wciąż za długo na mój gust!

sergiol
źródło