Daha küçük bir tautogram denetleyicisi var mı? [kapalı]


10

Son zamanlarda kod golf içine aldım ve en küçük tautogram denetleyicisi yazmaya çalıştım.

Bir tautogram , tüm kelimelerin aynı harfle başladığı bir cümledir, örneğin: Çiçekler Fransa'dan gelişir .

Girdi olarak bir cümle verildiğinde, bunun bir tautogram olup olmadığını belirleyin.

Test Durumları

Flowers flourish from France
    True

This is not a Tautogram
    False

Bu python kodu ile geldi (çünkü benim ana dilim):

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

Kullanımı:

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

Cümle virgül ve nokta içerebilir, ancak başka özel karakterler içermez, yalnızca büyük ve küçük harfler ve boşluklar olabilir.

Boyutu 98 bayttır. Herhangi bir dilde daha küçük bir çözüm var mı?


1
Bir tipssoru olarak düşünülüyor Pythonmu? Öyleyse, bu iki etiket de eklenmelidir.
Arnauld

2
Heya arkadaş! Bu site genellikle açıkça tanımlanmış sorunlar için ayrılmıştır. "Girdi noktalama işaretleri içerebilir mi" gibi şeyler yayınlanmadan önce yanıtlanmalıdır, ancak bunun dışında bu, genellikle gördüğümüz diğer yeni kullanıcı sorularıyla karşılaştırmalı olarak harika bir ilk sorudur. Örneklerinize bakarak, sadece girişteki karakterlerin "[A-Za-z]" olacağını ve sorunuzun tamamen objektif olacağını açıklığa kavuşturacağım. Burada başka soruları da ele alacağım, aksi takdirde bu taşma için daha uygun olabilir.
Sihirli Ahtapot Urn

1
Noktalama işaretleri ile ne demek istiyorsun? Hangi karakterler dahil?
Somutlaşmışı

1
@MagicOctopusUrn Bazen stackOverflow'da kısa bir çözüm istediğinizde bu siteye bakın :)
Luis felipe De jesus Munoz

6
PPCG'ye Hoşgeldiniz! Birkaç test durumu (noktalama işaretleri dahil) bu zorluğa harika bir katkı olacaktır.
AdmBorkBork

Yanıtlar:




3

Clojure , 80 bayt

Çevrimiçi deneyin! . TIO, Clojure'un standart String kütüphanesini desteklemediğinden, ilk sürüm bir "Küçük harf bulunamıyor" hatası verir.

(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

İçe aktarmayı önleyen bir sürüm yaptım:

(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

Ama 112 Bayt .


İşte benim Raket çözümüm:(define(f s)(apply char=?(map(λ(x)(char-upcase(car(string->list x))))(string-split s))))
Galen Ivanov

PicoLisp'de çok daha kısa:(de f(s)(apply =(mapcar car(split(chop(lowc s))" "))))
Galen Ivanov

3

PowerShell , 57 50 41 bayt

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

Çevrimiçi deneyin!

Girdi alır ve split boşlukta s. Her kelimede sdolaşır ve ubstrin'i gpozisyondan başlayarak 0ve 1karaktere giderek ilk harfi alır . Sonra sortharfler (varsayılan olarak küçük harf duyarsız) s -unique bayrak tek her harfin bir kopyasını ve doğrular dışarı çekmek için countbu isimlerin olduğu -eqiçin UAL 1. Çıktı örtük.

Mazzy sayesinde -9 bayt.




1
@mazzy niyeti anlamaya çalışırken düzeltildi
Nahuel Fouilleul

@mazzy Soru yeniden açıldığında normal ifade sürümünü göndermenize izin vereceğim. Kendi cevabını garanti edecek kadar farklı.
AdmBorkBork

Katılıyorum. ama bu soru beklemeye alındı, bu yüzden yeni bir cevap oluşturamıyorum.
mazzy


2

Brachylog , 5 bayt

ḷṇ₁hᵛ

Çevrimiçi deneyin!

         The input
ḷ        lowercased
 ṇ₁      and split on spaces
   hᵛ    is a list of elements which all start with the same thing.

Ben şimdi bunun noktalama işlemlerini yapabilmesi gerektiğini fark ettim, ancak herhangi bir noktalama işareti olmadan bu hala işe
yarayıp


2

Perl 5 ( -p), 20 bayt

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

TIO

noktalama işaretlerinin kötü olması durumunda yorumları takip etme (31 bayt)

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

31 bayt

aksi takdirde 31 bayt ile başka bir yaklaşım daha vardır:

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

31 bayt diğer


noktalama işaretleri ne olacak? ipin kenarındaki boşluklar veya noktalama işaretleri ne olacak?
mazzy

bu cevap verilen test vakaları için çalışır, gereksinimlere bağlı olarak geliştirilebilir$_=!/^\W*+(.).*(?=\b\w)(?!\1)/i
Nahuel Fouilleul

ancak soruyu ve verilen çözümü dikkatle okurken, başlangıçta boşluklar meydana gelemez çünkü boşluklar kabuk tarafından argümanları bölmek için kullanılır. Program sadece tüm argümanların aynı karakterle başladığını kontrol eder
Nahuel Fouilleul

1

JavaScript (Node.js) , 54 bayt

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

Çevrimiçi deneyin!

Veya her sözcüğün (ilkinden önce) önce bir boşluk olacağı garanti edilirse 47 bayt .


ya da bir regex ya da yerine bir boşluk ile\W
Nahuel Fouilleul

@NahuelFouilleul, kullanarak testbaşka bir bayt kaydeder.
Shaggy

1
@NahuelFouilleul Muhtemelen yayın ayrı olmalıdır.
Arnauld

zaten perl sürümünü gönderdi, ben de javascript usta değilim, ben bir ipucu vermekten mutluluk duyuyorum
Nahuel Fouilleul

1

Japt , 5 bayt

¸mÎro

Dene

¸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 bayt)

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

TIO


1
Bence girdinin boşlukla başlamasına izin veriliyor ve bu böyle bir girdi için işe yaramıyor .
Sara J

Gerçekten bu bir test durumu değil, ama bu yapılabilir ele ekleyerek (?> *)başlayan en ve pevent bactracking için boşluk maç için atom grubunu kullanarak,. sadece `*` işe yaramıyor çünkü başarısız maçlardan sonra boş dizeyle eşleşmek için `` `` geri izleyecek
Nahuel Fouilleul

ancak soruyu tekrar okumak, örnekte başlangıçta boşluklar meydana gelebilir; kullanım, kelimeleri argüman olarak geçirmek ve boşluklar kabuk argümanı sınırlayıcısıdır
Nahuel Fouilleul
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.