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


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

Ответы:




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 байт .


Вот мое решение для ракетки:(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 байт благодаря маззи.




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 байтов, если каждому слову (кроме первого) гарантированно предшествует пробел.


или в одном регулярном выражении или с пробелом вместо\W
Nahuel Fouilleul

@NahuelFouilleul, используя testсохраняет другой байт.
Шегги

1
@NahuelFouilleul Вы, вероятно, должны пост отдельно.
Arnauld

уже опубликовал версию на Perl, я не очень хорошо владею javascript, я рад дать вам подсказку
Nahuel Fouilleul




1

Java, (36 байт)

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

TIO


1
Я думаю, что ввод разрешается начинать с пробела, и это не работает для ввода, как это .
Сара Джей

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

однако повторное чтение вопроса может начинаться с пробелов в начале, потому что в примере используется передача слов в качестве аргумента, а пробелы - это разделитель аргумента оболочки
Науэль Фуийоар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.