Existe-t-il un vérificateur de tautogramme plus petit? [fermé]

10

J'ai commencé à jouer au golf récemment et j'ai essayé d'écrire le plus petit vérificateur de tautogrammes.

Un tautogramme est une phrase dans laquelle tous les mots commencent par la même lettre, par exemple: Les fleurs fleurissent de France .

Étant donné une phrase en entrée, déterminez s'il s'agit d'un tautogramme.

Cas de test

Flowers flourish from France
    True

This is not a Tautogram
    False

Je suis venu avec ce code python (parce que c'est ma langue principale):

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

Usage:

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

La phrase peut contenir des virgules et des points, mais pas d'autres caractères spéciaux, uniquement des lettres majuscules et minuscules et des espaces.

Sa taille est de 98 octets. Existe-t-il une solution plus petite dans n'importe quelle langue?

Jaime Tenorio
la source
1
S'agit-il d'une tipsquestion limitée à Python? Si c'est le cas, ces deux balises doivent être ajoutées.
Arnauld
2
Hé un ami! Ce site est généralement réservé aux problèmes explicitement définis. Des choses comme "l'entrée peut contenir de la ponctuation" doivent être répondues avant d'être publiées, mais à part cela, c'est une excellente première question par rapport aux autres questions des nouveaux utilisateurs que nous voyons habituellement. À en juger par vos exemples, je voudrais simplement préciser que les seuls caractères de l'entrée seront "[A-Za-z]" et votre question sera purement objective. J'étendrais d'autres questions ici, sinon cela pourrait honnêtement être mieux adapté au débordement.
Urne de poulpe magique
1
Qu'entendez-vous par ponctuation? Quels caractères sont inclus?
Incarnation de l'ignorance
1
@MagicOctopusUrn Parfois, lorsque vous demandez une solution courte dans stackOverflow, reportez-vous à ce site :)
Luis felipe De jesus Munoz
6
Bienvenue chez PPCG! Quelques cas de test supplémentaires (y compris la ponctuation) seraient un excellent ajout à ce défi.
AdmBorkBork

Réponses:

7

05AB1E , 5 octets

l#€нË

Essayez-le en ligne!


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

Est-ce que cela sur mobile excuse l'absence d'explication.

Urne de poulpe magique
la source
4

Python 2 , 47 octets

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

Essayez-le en ligne!

Entré avec cela sur mobile. Peut probablement être joué au golf plus.

TFeld
la source
3

Clojure , 80 octets

Essayez-le en ligne! . TIO ne prend pas en charge la bibliothèque de chaînes standard de Clojure, cependant, la première version générera une erreur "Impossible de trouver les minuscules".

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

Non golfé:

(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

J'ai fait une version qui évite l'importation:

(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

Mais c'est 112 octets .

Carcigenicate
la source
Voici ma solution de raquette:(define(f s)(apply char=?(map(λ(x)(char-upcase(car(string->list x))))(string-split s))))
Galen Ivanov
Beaucoup plus court dans PicoLisp:(de f(s)(apply =(mapcar car(split(chop(lowc s))" "))))
Galen Ivanov
3

PowerShell , 57 50 41 octets

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

Essayez-le en ligne!

Prend des entrées et splitles place sur des espaces. Parcourt chaque mot et saisit la première lettre en prenant l' substrin en gcommençant par la position 0et en recherchant le 1caractère. Ensuite, sorts les lettres (insensible à la casse par défaut) avec le -udrapeau nique pour extraire une seule copie de chaque lettre, et vérifie que countces noms correspondent -eqbien 1. La sortie est implicite.

-9 octets grâce à mazzy.

AdmBorkBork
la source
41 octets
mazzy
1
@mazzy corrigé en essayant de comprendre l'intention
Nahuel Fouilleul
@mazzy Je vous laisse publier la version regex lorsque la question sera rouverte. C'est suffisamment différent pour justifier sa propre réponse.
AdmBorkBork
Je suis d'accord. mais cette question est suspendue, je ne peux donc pas créer de nouvelle réponse.
mazzy
2

Brachylog , 5 octets

ḷṇ₁hᵛ

Essayez-le en ligne!

         The input
ḷ        lowercased
 ṇ₁      and split on spaces
   hᵛ    is a list of elements which all start with the same thing.
Chaîne indépendante
la source
Je viens de remarquer que cela doit être capable de gérer la ponctuation, mais sans cas de test ponctués, je ne peux pas dire si cela fonctionne ou ne fonctionne toujours pas ...
Unrelated String
2

Haskell , 71 octets

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

Essayez-le en ligne!


Haskell , 61 58 octets (utilisant Data.Char.toLower)

  • Enregistré trois octets grâce à nimi .
import Data.Char
(all=<<(==).head).(toLower.head<$>).words

Essayez-le en ligne!

Jonathan Frech
la source
@nimi Merci.
Jonathan Frech
2

Perl 5 ( -p), 20 octets

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

TIO

commentaires suivants en cas de mauvaise ponctuation (31 octets)

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

31 octets

sinon il y a une autre approche, également avec 31 octets:

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

31 octets autre

Nahuel Fouilleul
la source
qu'en est-il des ponctuations? qu'en est-il des espaces ou des ponctuations au niveau de la chaîne?
mazzy
cette réponse fonctionne pour les cas de test donnés, pourrait être améliorée en fonction des exigences$_=!/^\W*+(.).*(?=\b\w)(?!\1)/i
Nahuel Fouilleul
mais en lisant attentivement la question et la solution donnée, les espaces au début ne peuvent pas se produire car les espaces sont utilisés par le shell pour diviser les arguments. Le programme vérifie seulement que tous les arguments commencent par le même caractère
Nahuel Fouilleul
1

JavaScript (Node.js) , 54 octets

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

Essayez-le en ligne!

Ou 47 octets si chaque mot (mais le premier) est garanti d'être précédé d'un espace.

Arnauld
la source
ou dans une expression régulière ou avec un espace au lieu de\W
Nahuel Fouilleul
@NahuelFouilleul, en utilisant testenregistre un autre octet.
Shaggy
1
@NahuelFouilleul Vous devriez probablement poster séparément.
Arnauld
J'ai déjà posté la version Perl, je ne maîtrise pas aussi bien le javascript, je suis heureux de vous donner un indice
Nahuel Fouilleul
1

Japt , 5 octets

¸mÎro

Essayez-le

¸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
Hirsute
la source
1

Java, (36 octets)

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

TIO

Nahuel Fouilleul
la source
1
Je pense que l'entrée est autorisée à commencer par un espace, et cela ne fonctionne pas pour une entrée comme ça .
Sara J
en effet, ce n'est pas un cas de test, mais cela peut être géré en ajoutant (?> *), en utilisant un groupe atomique pour faire correspondre l'espace au début et pour éviter le bactracking. juste `*` ne fonctionne pas parce qu'après avoir échoué les matchs reviendront `*` pour correspondre à une chaîne vide
Nahuel Fouilleul
cependant la relecture de la question peut se produire au début car dans l'exemple l'usage est de passer les mots en argument et les espaces sont des délimiteurs d'arguments shell
Nahuel Fouilleul