Apakah ada pemeriksa tautogram yang lebih kecil? [Tutup]

10

Saya masuk ke golf code baru-baru ini dan mencoba menulis pemeriksa tautogram terkecil.

Sebuah tautogram adalah kalimat di mana semua kata dimulai dengan huruf yang sama, misalnya: Bunga berkembang dari Perancis .

Diberi kalimat sebagai input, tentukan apakah itu tautogram.

Uji Kasus

Flowers flourish from France
    True

This is not a Tautogram
    False

Saya datang dengan kode python ini (karena ini adalah bahasa utama saya):

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

Pemakaian:

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

Kalimat tersebut dapat berisi koma dan titik, tetapi tidak ada karakter khusus lainnya, hanya huruf dan spasi huruf besar dan kecil.

Ukurannya adalah 98 byte. Apakah ada solusi yang lebih kecil dalam bahasa apa pun?

Jaime Tenorio
sumber
1
Apakah ini dimaksudkan sebagai tipspertanyaan terbatas Python? Jika demikian, kedua tag ini harus ditambahkan.
Arnauld
2
Teman heya! Situs ini biasanya dicadangkan untuk masalah yang didefinisikan secara eksplisit. Hal-hal seperti "dapatkah input mengandung tanda baca" harus dijawab sebelum memposting, tetapi selain itu, ini adalah pertanyaan pertama yang bagus dibandingkan dengan pertanyaan pengguna baru lainnya yang biasanya kita lihat. Menilai dengan contoh Anda, saya hanya akan mengklarifikasi bahwa satu-satunya karakter dalam input adalah "[A-Za-z]" dan pertanyaan Anda akan sepenuhnya objektif. Saya akan membahas beberapa pertanyaan lain di sekitar sini, kalau tidak, ini mungkin lebih cocok untuk overflow.
Magic Octopus Urn
1
Apa yang Anda maksud dengan tanda baca? Karakter apa yang termasuk?
Perwujudan Ketidaktahuan
1
@MagicOctopusUrn Terkadang ketika Anda meminta solusi pendek di stackOverflow rujukan ke situs ini :)
Luis felipe De jesus Munoz
6
Selamat datang di PPCG! Beberapa kasus uji lagi (termasuk tanda baca) akan menjadi tambahan yang bagus untuk tantangan ini.
AdmBorkBork

Jawaban:

7

05AB1E , 5 byte

l#€нË

Cobalah online!


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

Apakah ini di ponsel alasan tidak ada penjelasan.

Guci Gurita Ajaib
sumber
4

Python 2 , 47 byte

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

Cobalah online!

Datang dengan ini di ponsel. Mungkin bisa bermain golf lebih banyak.

TFeld
sumber
3

Clojure , 80 byte

Cobalah online! . TIO tidak mendukung pustaka String standar Clojure, jadi versi pertama akan menampilkan kesalahan "Tidak dapat menemukan huruf kecil".

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

Tidak Disatukan:

(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

Saya membuat versi yang menghindari impor:

(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

Tapi itu 112 Bytes .

Carcigenicate
sumber
Inilah solusi Racket saya:(define(f s)(apply char=?(map(λ(x)(char-upcase(car(string->list x))))(string-split s))))
Galen Ivanov
Jauh lebih pendek di 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

Cobalah online!

Mengambil input dan splitmenyimpannya di spasi putih. Ulangi setiap kata, dan ambil huruf pertama dengan mengambil substrin gmulai dari posisi 0dan pergi untuk 1karakter. Kemudian sort, huruf-hurufnya (tidak peka huruf besar-kecil) dengan -ubendera nique untuk mengeluarkan hanya satu salinan dari setiap huruf, dan memverifikasi bahwa countnama-nama itu sudah ada -eqsejak awal 1. Output tersirat.

-9 byte berkat mazzy.

AdmBorkBork
sumber
41 byte
mazzy
1
@mazzy tetap berusaha memahami maksudnya
Nahuel Fouilleul
@ Mazzy Saya akan membiarkan Anda memposting versi regex ketika pertanyaan dibuka kembali. Cukup berbeda untuk menjamin jawabannya sendiri.
AdmBorkBork
Aku setuju. tetapi pertanyaan ini ditunda, jadi saya tidak dapat membuat jawaban baru.
mazzy
2

Brachylog , 5 byte

ḷṇ₁hᵛ

Cobalah online!

         The input
ḷ        lowercased
 ṇ₁      and split on spaces
   hᵛ    is a list of elements which all start with the same thing.
String yang tidak terkait
sumber
Saya baru saja memperhatikan bahwa ini harus mampu menangani tanda baca, tetapi tanpa uji kasus berselang saya tidak dapat memastikan apakah ini berfungsi atau tidak ...
Unrelated String
2

Haskell , 71 byte

f s|c<-fromEnum.head<$>words s=all(`elem`[-32,0,32]).zipWith(-)c$tail c

Cobalah online!


Haskell , 61 58 byte (menggunakan Data.Char.toLower)

  • Disimpan tiga byte berkat nimi .
import Data.Char
(all=<<(==).head).(toLower.head<$>).words

Cobalah online!

Jonathan Frech
sumber
@nimi Terima kasih.
Jonathan Frech
2

Perl 5 ( -p), 20 byte

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

TIO

mengikuti komentar jika tanda baca buruk (31 byte)

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

31 byte

kalau tidak ada pendekatan lain, juga dengan 31 byte:

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

31 byte lainnya

Nahuel Fouilleul
sumber
bagaimana dengan tanda baca? bagaimana dengan spasi atau tanda baca pada strart of string?
mazzy
jawaban ini berfungsi untuk test case yang diberikan, dapat ditingkatkan tergantung persyaratannya$_=!/^\W*+(.).*(?=\b\w)(?!\1)/i
Nahuel Fouilleul
tetapi membaca dengan hati-hati pertanyaan dan solusi yang diberikan, spasi pada awalnya tidak dapat terjadi karena spasi digunakan oleh shell untuk membagi argumen. Program hanya memeriksa bahwa semua argumen dimulai dengan karakter yang sama
Nahuel Fouilleul
1

JavaScript (Node.js) , 54 byte

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

Cobalah online!

Atau 47 byte jika setiap kata (tetapi yang pertama) dijamin akan didahului oleh spasi.

Arnauld
sumber
atau dalam satu regex atau dengan spasi bukannya\W
Nahuel Fouilleul
@NahuelFouilleul, menggunakan testmenghemat byte lain.
Shaggy
1
@NahuelFouilleul Anda sebaiknya memposting secara terpisah.
Arnauld
sudah memposting versi perl, saya juga tidak menguasai javascript, saya senang memberi Anda petunjuk
Nahuel Fouilleul
1

Japt , 5 byte

¸mÎro

Cobalah

¸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
Shaggy
sumber
1

Java, (36 byte)

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

TIO

Nahuel Fouilleul
sumber
1
Saya pikir input diperbolehkan untuk memulai dengan spasi, dan ini tidak berfungsi untuk input seperti itu .
Sara J
memang itu bukan kasus uji, tapi ini bisa ditangani dengan menambahkan (?> *), menggunakan grup atom untuk mencocokkan ruang di awal dan untuk mengupas bactracking. hanya `*` tidak berfungsi karena setelah pertandingan gagal akan mundur `*` untuk mencocokkan string kosong
Nahuel Fouilleul
Namun membaca pertanyaan lagi spasi dapat terjadi di awal karena dalam contoh penggunaan kata-kata sebagai argumen dan spasi adalah pembatas argumen shell
Nahuel Fouilleul