[Elixir/Erlang/Racket] 模式匹配,字符串,哈希表,格式化输出
函数式编程三兄弟哈,leetcode什么时候支持haskell?
Elixir
名词解释
:binary.encode_unsigned(c) codepoint转到bitstring
<< >> 空的bitstring
res<> <<"hello">> 拼接2个bitstring
?\s 拿到字符's'的codepoint
?? 拿到字符'?'的codepoint
%{} 空字典
代码
defmodule Solution do
@spec evaluate(s :: String.t, knowledge :: [[String.t]]) :: String.t
def evaluate(s, knowledge) do
dict = knowledge |> Enum.reduce(%{}, fn [k, v], acc -> Map.put(acc, k, v) end)
# dict = Enum.into(Enum.map(knowledge, fn [key, val] -> {String.to_existing_atom(key), val} end), %{})
for << c<-s >>, reduce: {false, <<>>, <<>>} do
{add_key, key, res} ->
cond do
c==?\( ->
{true, key, res}
c==?\) ->
{false, << >>, res<> Map.get(dict,key,<<"?">>) }
true ->
case add_key do
true->{add_key, key<>:binary.encode_unsigned(c), res}
false->{add_key, key, res<>:binary.encode_unsigned(c)}
end
end
end
|> elem(2) #下标从0开始,取三元组里的res
end
end
# :io.format("before, The value of res is: ~p~n", [res])
Erlang
名词解释
iolist_to_binary([Res, <<"?">>]) 拼接bitstring
<< >> 空的bitstring
element(3,Res) 元组的第3个元素
$( 拿到'('的codepoint
erlang:binary_to_list bitstring转list
代码
getOrDefault(Dict, Key, DefaultValue) ->
case dict:find(Key, Dict) of
{ok, Value} ->
Value;
error ->
DefaultValue
end.
evaluate(S, Knowledge) ->
Dict = lists:foldl(fun([K, V], Acc) -> dict:store(K, V, Acc) end, dict:new(), Knowledge),
MyFunc =fun(C, {AddKey, Key, Res}) ->
case C of
$( -> {true, Key, Res};
$) -> {false, <<>>, iolist_to_binary([Res, getOrDefault(Dict,Key, <<"?">>)])};
_ ->
case AddKey of
true -> {AddKey, iolist_to_binary([Key,C]), Res};
false -> {AddKey, Key, iolist_to_binary([Res,C])}
end
end
end,
Res = lists:foldl(MyFunc, {false,<< >>,<< >>}, erlang:binary_to_list(S)),
element(3,Res).
% io:format("Sum=~p ~n", [Sum]),
Racket
名词解释
(car ele) 取ele的第一个元素
(cadr ele) 取ele的第二个元素
(string->list s) bitstring 切分为list
(string ele) 可以把#\( 转成"("
(string-append key c) 字符串拼接,key在前,c在后
代码
(define (get-or-default dict key default-value)
(let ([result (hash-ref dict key 'not-found)])
(if (eq? result 'not-found) default-value result))
)
(define/contract (evaluate s knowledge)
(-> string? (listof (listof string?)) string?)
(define my-dict (make-hash))
(for-each
(lambda (ele) (
hash-set! my-dict (car ele) (cadr ele)
))
knowledge)
(define my-list (string->list s))
(displayln my-list)
(define final_acc (foldl
(lambda (ele acc) ;iterator 和 acc
(define c (string ele))
(define addkey (list-ref acc 0))
(define key (list-ref acc 1))
(define res (list-ref acc 2))
(match c
["(" (list #t key res)]
[")" (list #f "" (string-append res (get-or-default my-dict key "?")) )]
[else
(match addkey
[#t (list addkey (string-append key c) res)]
[#f (list addkey key (string-append res c))]
)
]
)
)
(list #f "" "") ;acc初始值
my-list)) ;foldl主体
(define ret (list-ref final_acc 2))
ret
)
[Elixir/Erlang/Racket] 模式匹配,字符串,哈希表,格式化输出的更多相关文章
- Swift4 基本数据类型(范围型, Stride型, 数组, 字符串, 哈希表)
创建: 2018/02/28 完成: 2018/03/04 更新: 2018/05/03 给主要标题加上英语, 方便页内搜索 [任务表]TODO 范围型(Range)与Stride型 与范围运算符相 ...
- python_字符串,元组,格式化输出
一.字符串 1.字符串是有成对的单引号或者双引号括起来的.例如:name="张三",sex="女" 2.字符串的索引是从0开始的 3.字符串的切片 a.单个字符 ...
- 字符串与C51的格式化输出
一字符数组和字符指针: 字符指针可以用字符串对其直接初始化和随时赋值:而字符数组可以用字符串进行初始化,但不能用字符串对其进行随时赋值(但此时可以定义一个字符串指针指向字符数组,然后用字符串对指针随时 ...
- Java知多少(79)哈希表及其应用
哈希表也称为散列表,是用来存储群体对象的集合类结构. 什么是哈希表 数组和向量都可以存储对象,但对象的存储位置是随机的,也就是说对象本身与其存储位置之间没有必然的联系.当要查找一个对象时,只能以某种顺 ...
- Python基础__字符串拼接、格式化输出与复制
上一节介绍了序列的一些基本操作类型,这一节针对字符串的拼接.格式化输出以及复制的等做做详细介绍.一. 字符串的拼接 a = 'I', b = 'love', c = 'Python'. 我们的目的是: ...
- kmp和hash 字符串处理 哈希表
来自http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 并进行自己的简单整 ...
- 剑指 Offer 48. 最长不含重复字符的子字符串 + 动态规划 + 哈希表 + 双指针 + 滑动窗口
剑指 Offer 48. 最长不含重复字符的子字符串 Offer_48 题目详情 解法分析 解法一:动态规划+哈希表 package com.walegarrett.offer; /** * @Aut ...
- 【字符串哈希】【哈希表】Aizu - 1370 - Hidden Anagrams
给你两个4k长度的串,问你最长公共子串.两个子串相同被定义为所有字母的出现次数分别相同即可. 就枚举第一个串的所有子串,将字母出现的次数看作一个大数,进行哈希(双关键字),塞到哈希表里面.然后枚举第二 ...
- 【二分答案】【哈希表】【字符串哈希】bzoj2946 [Poi2000]公共串
二分答案,然后搞出hash值扔到哈希表里.期望复杂度O(n*log(n)). <法一>next数组版哈希表 #include<cstdio> #include<cstri ...
- Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)
Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...
随机推荐
- Taro3 扫描不同二维码参数不同,但是热启动之后参数不变 根据环境不同更换域名
热启动:先执行缓存的静态数据,然后再执行页面代码.比如右上角退出或者按home键错误用法:用的Taro3 react function函数,之前用的 Taro.getLaunchOptionsSyn ...
- iClock数据服务器默认账号密码
网络空间资产搜索: shodan 搜索 默认密码 admin/a***n End!!!
- SQL-分组聚合
-- 语法 select * |列名|表达式 -- 5 from 表名 -- 1 where 条件 ...
- Python循环任务,错误打包输出
有时候,多个任务循环在跑,但不想中间任何一个错误,停止主线程,但又想在主线程运行结束后,采集运行过程中所有的错误信息. 这种刁钻的想法,我自问自答,记录一下操作方法. err_list = [] ma ...
- switch组件的使用
正常情况下,path和component是一一对应的关系 switch可以提高路由匹配效率(单一匹配)
- 【转载】matlab常用函数
第一篇:Matlab软件函数 一.软件操作函数 1)命令窗口函数: clc:清空命令窗口,使用向上箭头翻看命令. open:打开文件,文本文件(*.doc),可执行文件(*.exe),图形文件(*.f ...
- antv g6 出现 n.addEdge is not a function问题
问题描述直接上图 解决方式就是将edge里面边的source和target对应的id换成字符串类型就行. 例如: edges: [ { id: 299, source": 3629.toSt ...
- windows 2016 安装docker
windows 2016 安装docker 前提条件:windows server 2016安装更新 1:用管理员打开windows PowerShell Install-PackageProvide ...
- Q:windows系统如何开机启动批处理脚本
方法1 1.win+r输入gpedit.msc进入本地策略管理器 2.点击windows设置下的脚本(启动/关机),然后双击启动. 3.点击添加,然后点击浏览,选择批处理文件然后点击确定. 方法2 也 ...
- 【内存管理】ION内存管理器浅析(system heap)(基于linux 4.14)
什么是ION ION具体不知道是什么的缩写,只知道是android系统上google引入的内存管理方式,为了实现用户与内核间数据共享时零拷贝.多用于多媒体,比如camera和display,graph ...