Чи є менша перевірка тавтограми? [зачинено]


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? Якщо так, то обидва теги слід додати.
Арнольд

2
Гея друг! Цей сайт зазвичай зарезервований для явно визначених проблем. На такі речі, як "чи може вхід містити розділові знаки", слід відповідати перед публікацією, але крім цього, це перше чудове питання порівняно з іншими питаннями нового користувача, які ми зазвичай бачимо. Судячи з ваших прикладів, я просто поясню, що єдиними символами у вхідному документі буде "[A-Za-z]", і ваше питання буде суто об'єктивним. Я б розкрив деякі інші питання тут, інакше це, можливо, буде краще підходити для переповнення.
Чарівний восьминога Урна

1
Що ви маєте на увазі під пунктуацією? Які символи включені?
Втілення невігластва

1
@MagicOctopusUrn Іноді, коли ви вимагаєте короткого рішення в stackOverflow, зверніться до цього сайту :)
Luis felipe De

6
Ласкаво просимо до PPCG! Ще кілька тестових випадків (включаючи розділові знаки) були б чудовим доповненням до цього виклику.
AdmBorkBork

Відповіді:




3

Clojure , 80 байт

Спробуйте в Інтернеті! . TIO не підтримує стандартну бібліотеку String Clojure, тому перша версія видасть помилку "Не можу знайти малі регістри".

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

Безголівки:

(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символу. Потім sorts літери (не зазначаються регістровими за замовчуванням) із -uпрапором nique, щоб витягнути лише одну копію кожної літери, і перевірити, чи є countці імена -eqнеправдивими 1. Вихід неявний.

-9 байт завдяки мазі.




1
@mazzy виправлено, намагаючись зрозуміти намір
Nahuel Fouilleul

@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.

Щойно я помітив, що це має бути в змозі обробити пунктуацію, але без будь-яких пунктуаційних тестових випадків я не можу сказати, чи справді це працює чи все ще не працює ...
Непов’язаний рядок


2

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

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

ТІО

наступні коментарі у випадку неправильної пунктуації (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 Ви, ймовірно, повинні писати окремо.
Арнольд

вже опублікував версію perl, я не
освоюю




1

Java, (36 байт)

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

ТІО


1
Я думаю, що введення дозволено починати з пробілу, і це не працює для введення подібним чином .
Сара Дж

на самому ділі це не тест, але це може бути оброблено додавання (?> *), використовуючи атомну групу , щоб відповідати простір на початку і в pevent bactracking. просто `*` не працює, тому що після невдалої зустрічі буде відхилено `*`, щоб відповідати порожній рядку
Nahuel Fouilleul

однак при повторному читанні запитання пробіли можуть виникати на початку, бо в прикладі використання полягає в передачі слів як аргументу, а пробіли - розділювачі аргументів оболонки
Nahuel Fouilleul,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.