Czy istnieje mniejszy moduł do sprawdzania tautogramów? [Zamknięte]

10

Ostatnio zacząłem grać w golfa i próbowałem napisać najmniejszy program do sprawdzania tautogramów.

Tautogram to zdanie, w którym wszystkie słowa zaczynają się od tej samej litery, na przykład: kwiaty rozkwitać z Francji .

Biorąc pod uwagę zdanie, określ, czy jest to tautogram.

Przypadki testowe

Flowers flourish from France
    True

This is not a Tautogram
    False

Wymyśliłem ten kod python (ponieważ jest to mój główny język):

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

Stosowanie:

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

To zdanie może zawierać przecinki i kropki, ale nie może zawierać żadnych innych znaków specjalnych, tylko wielkie i małe litery oraz spacje.

Jego rozmiar to 98 bajtów. Czy istnieje mniejsze rozwiązanie w jakimkolwiek języku?

Jaime Tenorio
źródło
1
Czy jest to tipspytanie ograniczone do Python? Jeśli tak, oba te tagi powinny zostać dodane.
Arnauld,
2
Hej przyjacielu! Ta strona jest zwykle zarezerwowana dla wyraźnie określonych problemów. Przed opublikowaniem należy odpowiedzieć na takie pytania, jak „czy dane wejściowe mogą zawierać znaki interpunkcyjne”, ale poza tym jest to świetne pierwsze pytanie w porównaniu do innych pytań, które zwykle widzimy. Sądząc po twoich przykładach, wyjaśnię tylko, że jedynymi znakami na wejściu będą „[A-Za-z]”, a twoje pytanie będzie czysto obiektywne. Chciałbym zadać ci kilka innych pytań, w przeciwnym razie może to być lepsze rozwiązanie w przypadku przepełnienia.
Magic Octopus Urn
1
Co rozumiesz przez interpunkcję? Które postacie są uwzględnione?
Embodiment of Ignorance
1
@MagicOctopusUrn Czasami, gdy poprosisz o krótkie rozwiązanie w stosie, przepełnij, zapoznaj się z tą stroną :)
Luis felipe De jesus Munoz
6
Witamy w PPCG! Kilka dodatkowych przypadków testowych (w tym interpunkcyjnych) byłoby świetnym dodatkiem do tego wyzwania.
AdmBorkBork,

Odpowiedzi:

7

05AB1E , 5 bajtów

l#€нË

Wypróbuj online!


l      # Lowercase input.
 #     # Split on spaces.
  €н   # a[0] of each.
    Ë  # All equal?

Czy to na telefon usprawiedliwia brak wyjaśnienia.

Urna Magicznej Ośmiornicy
źródło
4

Python 2 , 47 bajtów

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

Wypróbuj online!

Przyszedł do tego na telefonie komórkowym. Prawdopodobnie można golfa więcej.

TFeld
źródło
3

Clojure , 80 bajtów

Wypróbuj online! . TIO nie obsługuje jednak standardowej biblioteki ciągów Clojure, więc pierwsza wersja zgłosi błąd „Nie można znaleźć małych liter”.

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

Nie golfowany:

(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

Stworzyłem wersję, która unika importu:

(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

Ale to 112 bajtów .

Carcigenicate
źródło
Oto moje rozwiązanie rakietowe:(define(f s)(apply char=?(map(λ(x)(char-upcase(car(string->list x))))(string-split s))))
Galen Iwanow
Znacznie krótszy w PicoLisp:(de f(s)(apply =(mapcar car(split(chop(lowc s))" "))))
Galen Iwanow
3

PowerShell , 57 50 41 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe i splitjest w białych znakach. Pętla przechodzi przez każde słowo i chwyta pierwszą literę, biorąc substrin gzaczynając od pozycji 0i idąc za 1postacią. Następnie sorts litery (domyślnie bez rozróżniania wielkości liter) z -uflagą nique, aby wyciągnąć tylko jedną kopię każdej litery i sprawdzić, czy countte nazwy są -eqprawdziwe 1. Wynik jest niejawny.

-9 bajtów dzięki mazzy.

AdmBorkBork
źródło
41 bajtów
mazzy
35 bajtów z
wyrażeniem regularnym
1
@mazzy naprawiono próbę zrozumienia intencji
Nahuel Fouilleul
@mazzy Pozwolę ci opublikować wersję wyrażenia regularnego, gdy pytanie zostanie ponownie otwarte. Jest wystarczająco inny, aby uzasadnić własną odpowiedź.
AdmBorkBork
Zgadzam się. ale pytanie zostało zawieszone, więc nie mogę utworzyć nowej odpowiedzi.
mazzy
2

Brachylog , 5 bajtów

ḷṇ₁hᵛ

Wypróbuj online!

         The input
ḷ        lowercased
 ṇ₁      and split on spaces
   hᵛ    is a list of elements which all start with the same thing.
Niepowiązany ciąg
źródło
Właśnie zauważyłem, że to musi być w stanie poradzić sobie z interpunkcją, ale bez interpunkcyjnych przypadków testowych nie mogę stwierdzić, czy to działa, czy nie działa ...
Niepowiązany ciąg
2

Haskell , 71 bajtów

f s|c<-fromEnum.head<$>words s=all(`elem`[-32,0,32]).zipWith(-)c$tail c

Wypróbuj online!


Haskell , 61 58 bajtów (za pomocą Data.Char.toLower)

  • Zapisany trzy bajty dzięki Nimi .
import Data.Char
(all=<<(==).head).(toLower.head<$>).words

Wypróbuj online!

Jonathan Frech
źródło
@nimi Dziękuję.
Jonathan Frech
2

Perl 5 ( -p), 20 bajtów

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

TIO

następujące komentarze w przypadku złej interpunkcji (31 bajtów)

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

31 bajtów

w przeciwnym razie istnieje inne podejście, również z 31 bajtami:

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

31 bajtów innych

Nahuel Fouilleul
źródło
co z interpunkcjami? co ze spacjami lub interpunkcjami na strunie łańcucha?
mazzy
ta odpowiedź działa dla danych przypadków testowych, można ją poprawić w zależności od wymagań$_=!/^\W*+(.).*(?=\b\w)(?!\1)/i
Nahuel Fouilleul
ale uważnie czytając pytanie i podane rozwiązanie, spacje na początku nie mogą wystąpić, ponieważ spacje są używane przez powłokę do dzielenia argumentów. Program sprawdza tylko, czy wszystkie argumenty zaczynają się od tego samego znaku
Nahuel Fouilleul
1

JavaScript (Node.js) , 54 bajty

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

Wypróbuj online!

Lub 47 bajtów, jeśli każde słowo (ale pierwsze) z pewnością będzie poprzedzone spacją.

Arnauld
źródło
lub w jednym wyrażeniu regularnym lub ze spacją zamiast\W
Nahuel Fouilleul
@NahuelFouilleul, użycie testzapisuje kolejny bajt.
Shaggy
1
@NahuelFouilleul Prawdopodobnie post powinien być osobno.
Arnauld,
już opublikowałem wersję perla, nie opanowałem tak dobrze javascript, chętnie dam ci podpowiedź
Nahuel Fouilleul
1

Japt , 5 bajtów

¸mÎro

Spróbuj

¸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
Kudłaty
źródło
1

Java, (36 bajtów)

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

TIO

Nahuel Fouilleul
źródło
1
Myślę, że dane wejściowe mogą zaczynać się od spacji, a to nie działa w przypadku takich danych wejściowych .
Sara J
wprawdzie nie jest to przypadek testowy, ale można sobie(?> *) z tym poradzić dodając , używając grupy atomowej, aby dopasować przestrzeń na początku i by uniknąć baktrackingu. po prostu `*` nie działa, ponieważ po nieudanym dopasowaniu cofnie `*`, aby dopasować pusty ciąg
Nahuel Fouilleul
jednak ponowne czytanie pytania może wystąpić na początku spacjami, ponieważ w przykładzie
użyto podania