нахождение индекса гласных в строке clojure - PullRequest
1 голос
/ 03 апреля 2019

Привет, я изучаю clojure и пытаюсь найти индекс гласных в строке, вот что я пытался

(def vowels [\a \e \i \o \u \y])
(let [word-index (interleave "aaded" (range))
      indexs (for [ [x i] (vector word-index)
                   :when (some #{x} vowels)]
               [i] )]
  (seq indexs))

Но это дает мне индекс "0" или ноль, что я делаю неправильно.

Ответы [ 6 ]

3 голосов
/ 03 апреля 2019
> (def vowels #{\a \e \i \o \u})

> (filter some? (map #(when (vowels %1) %2) "aaded" (range)))
(0 1 3)
1 голос
/ 03 апреля 2019

Вам необходимо правильно сформировать ввод для понимания:

(let [word-index (interleave "aaded" (range))
      indexs (for [[x i] (partition 2 word-index)
                   :when (some #{x} vowels)]
               i)]
  (prn (seq indexs)))

;; => (0 1 3)
0 голосов
/ 05 апреля 2019

@ Джас это уже прибил.Добавление моего собственного, чтобы предоставить некоторые комментарии о том, что происходит на промежуточных этапах.

Используйте наборы для проверки членства.Тогда вопрос "это гласный?"будет быстрым.

(def vowels (set "aeiouy"))
vowels
;; => #{\a \e \i \o \u \y}

Мы можем отфильтровать гласные, а затем получить только индексы

(defn vowel-indices-1 [word]
  (->> (map vector (range) word)      ; ([0 \h] [1 \e] [2 \l] ...)
       (filter (fn [[_ character]]    ; ([1 \e] [4 \o])
                 (contains? vowels character)))
       (map first)))                  ; (1 4)

(vowel-indices-1 "hello!")
;; => (1 4)

... или мы можем пойти немного поудобнее с: когдаключевое слово (не знал об этом, спасибо!), в том стиле, который вы начали!

(defn vowel-indices-2 [word]
  (for [[i ch] (map vector (range) word)
        :when (contains? vowels ch)]
    i))

(vowel-indices-2 "hello!")
;; => (1 4)
0 голосов
/ 03 апреля 2019

немного другой подход с регулярным выражением:

для всех индексов:

user> (let [m (re-matcher #"[aeiou]" "banedif")]
        (take-while identity (repeatedly #(when (re-find m) (.start m)))))
;;=> (1 3 5)

для одного индекса:

user> (let [m (re-matcher #"[aeiou]" "bfsendf")]
        (when (re-find m) (.start m)))
;;=> 3

user> (let [m (re-matcher #"[aeiou]" "bndf")]
        (when (re-find m) (.start m)))
;;=> nil
0 голосов
/ 03 апреля 2019

С каждой итерацией функции for один и тот же хэш-набор формируется многократно.Так что лучше определить его в блоке let.Кроме того, мы можем использовать hash-set напрямую как функцию, и нам не нужна функция some для того же самого.

(let [word-index (zipmap (range) "aaded")
      vowels-hash (into #{} [\a \e \i \o \u \y])
      indexs (for [[i x]  word-index
                   :when (vowels-hash x)]
               [i])]
  (flatten indexs))
0 голосов
/ 03 апреля 2019

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

(let [word-index (zipmap (range) "aaded")
      indexs (for [ [i x]  word-index
                   :when (some #{x}  vowels)]
                   [i] )
      ]
   (flatten indexs)
  )

Что работает нормально, если у кого-то есть лучшая реализация, пожалуйста, поделитесь.Это будет полезно для меня, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...