如何实现「把一段文字每隔一个字就隐藏一个字」?(内容有改动)

程序员约架的方式。。。哈哈哈

这是要打仗了吗?:sweat_smile:

Perl 5 还是 6 啊

只有perl5

(defun my-hide (beg end)
  (interactive "r")
  (let ((pt beg)
        (i 1))
    (while (<= pt end)
      (when (aref (char-category-set (char-after pt)) ?C)
        (when (cl-evenp i) ; `cl-evenp'用来隐双数字,`cl-oddp'用来隐单数字。
          (put-text-property pt (1+ pt) 'display
                             ;; 原地替换"离"为"_"、"*"或者"[离]"。
                             (concat "[" (char-to-string (char-after pt)) "]")))
        (cl-incf i))
      (cl-incf pt))))

org-drill要求是 [啊]

text-property可没用

没用过"org-drill",我是在"emacs-lisp-mode"下根据"xuchunyang"的代码改的,请原谅我的粗心大意所造成的困扰。

没有rx别想骗我写正则

https://paste.ubuntu.com/p/mGQB7Mf2t4/

2 个赞

有bug

(cm/mask-string "易学看人啊,不置可否。" nil t)

应该输出为

"[易]学[看]人[啊],不[置]可[否]。"

这个要求是楼主提的

您写一个吧,反正也不难

我写了,我说不难,请问你有什么问题?

你已经空手套了我这么多代码,是不是该自己写点表示尊敬?

你可以放弃的,因为你自己也觉得难


我横竖看了整栋楼,楼主提了这种需求?你又成了楼主了?

我寻思我没有漫天要价,你也不能坐地还钱吧。

就这样吧

我有说过 “不难” 吗

放弃哦

我是不是要去翻翻链接

这句话好像是我对你说过的

1 个赞

Today I learned 写正则是程序员约架的常用方式

1 个赞

我觉得正则表达式不能很好的解决这个问题

用状态机应该可以

我佩服你的理解能力

你不要自嘲了,我笑起来肚子很疼的

%E5%9B%BE%E7%89%87

建议直接看一楼获取最大节目效果。


不怪你,楼主表达有歧义。


不会打脸就不要打。

本来好好的发代码交流。可你非要一回diss我瞎,一回diss我傻,还越庖代俎地审查我代码,替lz给我加要求。结果通通成了自嘲完美,何苦呢?

当然如果你不觉得丢人现眼,我也不厌其烦。你做小丑我开心,何乐而不为呢?


(defun cm/mask-string (s &optional mask-even-p by-word-p count-in-total)
  (let ((one-word (rx (or (and bow (1+ (any "a-z" "A-Z" "0-9")))
                          (category chinese-two-byte))))
        (punct (rx (or punct blank))))
    (-let (((contents seps) (cm/split* punct s 'omit-null))
           (pred (if mask-even-p #'cl-evenp #'cl-oddp)))
      (setq contents (if by-word-p
                         (-let [total-idx 0]
                           (--map
                            (->> it
                                 (s-match-strings-all one-word)
                                 (-flatten)
                                 (-map-indexed
                                  (lambda (idx subs)
                                    (if (funcall pred (if count-in-total
                                                          (setq total-idx (1+ total-idx))
                                                        (1+ idx)))
                                        (s-wrap subs "[" "]")
                                      subs)))
                                 (s-join ""))
                            contents))
                       (--map-indexed
                        (if (funcall pred (1+ it-index))
                            (s-wrap it "[" "]")
                          it)
                        contents)))
      (s-join "" (apply #'-interleave (-pad "" contents seps))))))

本人素来大度,把你的新需求也做了。

测试用例我就懒得写了,有bug你再报吧。反正不会修的。

其实perl版我也不会写

最近在看Ocaml

我就写个Ocaml版的吧 (算是给自己加点动力)

不过我不知道多久能完成 (从沙漠里建海洋还是有难度的)

其实我是想建绿洲的

1 个赞

不论过程如何

楼主的问题应该算是解决了吧

光顾着欣赏各位交流了,感谢各位大牛,目前解决了,还没遇到什么特别情况,有问题及时上来反馈。

再次感谢。

设计模式 我能想到的 可以能应用到这里的有

策略 装饰 状态机

如果再加一个需求

第一个子句,第二个子句,第三个子句。

如果想给前两个子句加[],而跳过第三个,你要怎么做。