Gibt es einen kleineren Tautogrammprüfer? [geschlossen]

10

Ich habe mich kürzlich mit Code-Golf beschäftigt und versucht, den kleinsten Tautogramm-Checker zu schreiben.

Ein Tautogramm ist ein Satz, in dem alle Wörter mit demselben Buchstaben beginnen, zum Beispiel: Blumen gedeihen aus Frankreich .

Bestimmen Sie anhand eines Satzes als Eingabe, ob es sich um ein Tautogramm handelt.

Testfälle

Flowers flourish from France
    True

This is not a Tautogram
    False

Ich habe mir diesen Python-Code ausgedacht (weil er meine Hauptsprache ist):

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

Verwendungszweck:

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

Der Satz darf Kommas und Punkte enthalten, aber keine anderen Sonderzeichen, nur Groß- und Kleinbuchstaben und Leerzeichen.

Seine Größe beträgt 98 Bytes. Gibt es eine kleinere Lösung in irgendeiner Sprache?

Jaime Tenorio
quelle
1
Ist es als eine tipsFrage gedacht , die auf beschränkt ist Python? In diesem Fall sollten diese beiden Tags hinzugefügt werden.
Arnauld
2
Heya Freund! Diese Seite ist normalerweise explizit definierten Problemen vorbehalten. Dinge wie "Kann die Eingabe Interpunktion enthalten?" Sollten vor dem Posten beantwortet werden. Ansonsten ist dies eine großartige erste Frage im Vergleich zu den anderen Fragen für neue Benutzer, die wir normalerweise sehen. Anhand Ihrer Beispiele möchte ich nur klarstellen, dass die einzigen Zeichen in der Eingabe "[A-Za-z]" sind und Ihre Frage rein objektiv ist. Ich würde hier einige andere Fragen beantworten, sonst passt dies ehrlich gesagt besser zum Überlauf.
Magic Octopus Urn
1
Was meinst du mit Interpunktion? Welche Zeichen sind enthalten?
Verkörperung der Unwissenheit
1
@MagicOctopusUrn Manchmal, wenn Sie nach einer kurzen Lösung in stackOverflow fragen, verweisen Sie auf diese Seite :)
Luis felipe De jesus Munoz
6
Willkommen bei PPCG! Ein paar weitere Testfälle (einschließlich Interpunktion) wären eine großartige Ergänzung zu dieser Herausforderung.
AdmBorkBork

Antworten:

7

05AB1E , 5 Bytes

l#€нË

Probieren Sie es online aus!


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

Hat dies auf dem Handy die keine Erklärung entschuldigt.

Magische Krakenurne
quelle
4

Python 2 , 47 Bytes

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

Probieren Sie es online aus!

Kam mit diesem auf dem Handy. Kann wahrscheinlich mehr Golf gespielt werden.

TFeld
quelle
3

Clojure , 80 Bytes

Probieren Sie es online aus! . TIO unterstützt die Standard-String-Bibliothek von Clojure jedoch nicht, sodass die erste Version den Fehler "Kleinbuchstaben können nicht gefunden werden" auslöst.

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

Ungolfed:

(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

Ich habe eine Version erstellt, die den Import vermeidet:

(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

Aber es sind 112 Bytes .

Carcigenicate
quelle
Hier ist meine Schlägerlösung:(define(f s)(apply char=?(map(λ(x)(char-upcase(car(string->list x))))(string-split s))))
Galen Ivanov
Viel kürzer in PicoLisp:(de f(s)(apply =(mapcar car(split(chop(lowc s))" "))))
Galen Ivanov
3

PowerShell , 57 50 41 Byte

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

Probieren Sie es online aus!

Nimmt Eingaben auf und setzt splitsie auf Leerzeichen. Durchläuft jedes Wort und greift nach dem ersten Buchstaben, indem der sUbstrin gan der Position beginnt 0und nach dem 1Charakter sucht . Dann sorts die Buchstaben (standardmäßig ohne -uBerücksichtigung der Groß- und Kleinschreibung) mit dem Nique-Flag, um nur eine Kopie jedes Buchstabens herauszuziehen, und überprüft, ob countdiese Namen -eqzutreffend sind 1. Die Ausgabe ist implizit.

-9 Bytes dank mazzy.

AdmBorkBork
quelle
41 Bytes
mazzy
1
@ Mazzy behoben versucht, die Absicht zu verstehen
Nahuel Fouilleul
@mazzy Ich lasse Sie die Regex-Version veröffentlichen, wenn die Frage erneut geöffnet wird. Es ist anders genug, um eine eigene Antwort zu rechtfertigen.
AdmBorkBork
Ich stimme zu. Diese Frage wird jedoch zurückgestellt, sodass ich keine neue Antwort erstellen kann.
Mazzy
2

Brachylog , 5 Bytes

ḷṇ₁hᵛ

Probieren Sie es online aus!

         The input
ḷ        lowercased
 ṇ₁      and split on spaces
   hᵛ    is a list of elements which all start with the same thing.
Nicht verwandte Zeichenfolge
quelle
Mir ist gerade aufgefallen, dass dies in der Lage sein muss, Interpunktion zu verarbeiten, aber ohne unterbrochene Testfälle kann ich nicht sagen, ob dies funktioniert oder nicht ...
Unrelated String
2

Perl 5 ( -p), 20 Bytes

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

TIO

folgende Kommentare bei fehlerhafter Interpunktion (31 Bytes)

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

31 Bytes

Ansonsten gibt es einen anderen Ansatz, ebenfalls mit 31 Bytes:

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

31 Bytes andere

Nahuel Fouilleul
quelle
Was ist mit Interpunktionen? Was ist mit Leerzeichen oder Interpunktionen am Strang?
mazzy
Diese Antwort funktioniert für die gegebenen Testfälle, könnte je nach den Anforderungen verbessert werden$_=!/^\W*+(.).*(?=\b\w)(?!\1)/i
Nahuel Fouilleul
Wenn Sie jedoch die Frage und die angegebene Lösung sorgfältig lesen, können am Anfang keine Leerzeichen auftreten, da die Leerzeichen von der Shell zum Teilen der Argumente verwendet werden. Das Programm prüft nur, ob alle Argumente mit demselben Zeichen beginnen
Nahuel Fouilleul
1

JavaScript (Node.js) , 54 Byte

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

Probieren Sie es online aus!

Oder 47 Bytes, wenn jedem Wort (außer dem ersten) garantiert ein Leerzeichen vorangestellt ist.

Arnauld
quelle
oder in einem regulären Ausdruck oder mit einem Leerzeichen anstelle von\W
Nahuel Fouilleul
@NahuelFouilleul testspeichert mit ein weiteres Byte.
Shaggy
1
@NahuelFouilleul Du solltest wohl separat posten.
Arnauld
Ich habe bereits die Perl-Version gepostet, ich beherrsche Javascript nicht so gut, ich gebe Ihnen gerne einen Hinweis
Nahuel Fouilleul
1

Japt , 5 Bytes

¸mÎro

Versuch es

¸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
Zottelig
quelle
1

Java, (36 Bytes)

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

TIO

Nahuel Fouilleul
quelle
1
Ich denke, die Eingabe darf mit einem Leerzeichen beginnen, und dies funktioniert bei solchen Eingaben nicht .
Sara J
es ist in der Tat nicht ein Testfall, aber dies kann behandelt das Hinzufügen (?> *), Atomgruppe mit Raum passen zu beginnen und zu pEvent bactracking. Nur "*" funktioniert nicht, weil nach fehlgeschlagenen Übereinstimmungen "*" zurückverfolgt wird, um mit der leeren Zeichenfolge
übereinzustimmen
Beim erneuten Lesen der Frage können jedoch zu Beginn Leerzeichen auftreten, da in dem Beispiel die Verwendung darin besteht, die Wörter als Argument zu übergeben, und Leerzeichen als Shell-Argumenttrennzeichen dienen
Nahuel Fouilleul