Есть ли меньшая проверка таутограмм? [закрыто]

10

Недавно я увлекся игрой в код и попытался написать самую маленькую проверку таутограмм.

Тавтограмма это предложение , в котором все слова начинаются с одной буквы, например: Цветы процветать из Франции .

Учитывая предложение в качестве входных данных, определите, является ли оно таутограммой.

Тестовые случаи

Flowers flourish from France
    True

This is not a Tautogram
    False

Я придумал этот код Python (потому что это мой основной язык):

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

Применение:

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

Предложение может содержать запятые и точки, но не другие специальные символы, только заглавные и строчные буквы и пробелы.

Его размер составляет 98 байт. Есть ли меньшее решение на любом языке?

Хайме Тенорио
источник
1
Это задумано как tipsвопрос, ограниченный Python? Если так, то оба эти тега должны быть добавлены.
Arnauld
2
Эй, друг! Этот сайт обычно зарезервирован для явно определенных проблем. На такие вещи, как «может ли ввод содержать знаки препинания» нужно ответить перед публикацией, но в остальном это отличный первый вопрос по сравнению с другими вопросами для новых пользователей, которые мы обычно видим. Судя по вашим примерам, я просто поясню, что единственными символами на входе будут «[A-Za-z]», и ваш вопрос будет чисто объективным. Я хотел бы обсудить некоторые другие вопросы здесь, в противном случае это может быть лучше подходит для переполнения.
Волшебная Осьминог Урна
1
Что вы подразумеваете под пунктуацией? Какие персонажи включены?
Воплощение невежества
1
@MagicOctopusUrn Иногда, когда вы просите короткое решение в stackOverflow, обращайтесь к этому сайту :)
Luis felipe De jesus Munoz
6
Добро пожаловать в PPCG! Еще несколько тестовых случаев (включая пунктуацию) будут отличным дополнением к этой задаче.
AdmBorkBork

Ответы:

7

05AB1E , 5 байтов

l#€нË

Попробуйте онлайн!


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

Сделал это по мобильному извините без объяснения причин.

Урна волшебного осьминога
источник
3

Clojure , 80 байт

Попробуйте онлайн! , TIO не поддерживает стандартную библиотеку String Clojure, поэтому в первой версии будет выдано сообщение об ошибке «Не удается найти строчные буквы».

(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

Я сделал версию, которая избегает импорта:

(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

Но это 112 байт .

Carcigenicate
источник
Вот мое решение для ракетки:(define(f s)(apply char=?(map(λ(x)(char-upcase(car(string->list x))))(string-split s))))
Гален Иванов
Гораздо короче в PicoLisp:(de f(s)(apply =(mapcar car(split(chop(lowc s))" "))))
Гален Иванов
3

PowerShell , 57 50 41 байт

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

Попробуйте онлайн!

Принимает данные и splitвыводит их на пробел. Перебирает каждое слово и берет первую букву, беря sубстрин, gначиная с позиции 0и заканчивая 1символом. Затем sortс помощью букв (без учета регистра по умолчанию) с -uфлагом nique вытащить только одну копию каждой буквы и убедиться, что countэти имена имеют -eqзначение 1. Вывод неявный.

-9 байт благодаря маззи.

AdmBorkBork
источник
41 байт
mazzy
1
@ mazzy исправлено, пытаясь понять намерение
Науэль Фуйе
@mazzy Я позволю вам опубликовать версию регулярного выражения, когда вопрос будет вновь открыт. Это достаточно отличается, чтобы оправдать свой ответ.
AdmBorkBork
Я согласен. но этот вопрос отложен, поэтому я не могу создать новый ответ.
Маззи
2

Брахилог , 5 байт

ḷṇ₁hᵛ

Попробуйте онлайн!

         The input
ḷ        lowercased
 ṇ₁      and split on spaces
   hᵛ    is a list of elements which all start with the same thing.
Несвязанная строка
источник
Я только сейчас заметил, что это должно быть в состоянии обрабатывать пунктуацию, но без каких-либо пунктуированных тестовых случаев я не могу сказать, работает ли это или все еще не работает ...
Unrelated String
2

Perl 5 ( -p), 20 байт

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

TIO

следующие комментарии в случае неправильной пунктуации (31 байт)

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

31 байт

в противном случае есть другой подход, также с 31 байтом:

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

31 байт другой

Науэль Фуйе
источник
как насчет знаков препинания? А как насчет пробелов или знаков препинания у струн?
Маззи
этот ответ работает для данных тестов, может быть улучшены в зависимости требований может быть$_=!/^\W*+(.).*(?=\b\w)(?!\1)/i
NAHUEL FOUILLEUL
но при тщательном чтении вопроса и данного решения пробелы в начале не могут возникнуть, потому что пробелы используются оболочкой для разделения аргументов. Программа проверяет только то, что все аргументы начинаются с одного и того же символа
Науэль Фуйе
1

JavaScript (Node.js) , 54 байта

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

Попробуйте онлайн!

Или 47 байтов, если каждому слову (кроме первого) гарантированно предшествует пробел.

Arnauld
источник
или в одном регулярном выражении или с пробелом вместо\W
Nahuel Fouilleul
@NahuelFouilleul, используя testсохраняет другой байт.
Шегги
1
@NahuelFouilleul Вы, вероятно, должны пост отдельно.
Arnauld
уже опубликовал версию на Perl, я не очень хорошо владею javascript, я рад дать вам подсказку
Nahuel Fouilleul
1

Japt , 5 байт

¸mÎro

Попробуй это

¸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
мохнатый
источник
1

Java, (36 байт)

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

TIO

Науэль Фуйе
источник
1
Я думаю, что ввод разрешается начинать с пробела, и это не работает для ввода, как это .
Сара Джей
на самом деле это не тестовый пример, но его можно обработать, добавив (?> *), используя атомарную группу, чтобы соответствовать пробелу в начале и предотвратить bactracking. просто `*` не работает, потому что после неудачных совпадений будет возвращаться `*` для совпадения с пустой строкой
Науэль Фуйеуль
однако повторное чтение вопроса может начинаться с пробелов в начале, потому что в примере используется передача слов в качестве аргумента, а пробелы - это разделитель аргумента оболочки
Науэль Фуийоар