男友让我打十万个「对不起」,汉字标上多少遍。如何快速实现? - 生活
回复内容:
Excel VBA一行解决,一百万以内无压力,感谢度娘:-)
="对不起,第"&IF(A1
题主问的是R,不能在Python面前丢脸
library(foreach) map = function(Target, X,Y) { for (i in 1:length(X)) { Target[Target == X[i]] = Y[i] } return(Target) } Digital = c((1:9)*1000, (1:9)*100, (1:9)*10, 1:9, 0) Chs = c(paste(c("壹","贰","叁","肆","伍","陆","柒","捌","玖"), "仟", sep = ""), paste(c("壹","贰","叁","肆","伍","陆","柒","捌","玖"), "佰", sep = ""), paste(c("壹","贰","叁","肆","伍","陆","柒","捌","玖"), "拾", sep = ""), c("壹","贰","叁","肆","伍","陆","柒","捌","玖", "零")) change.simple = function(x) { xs = as.character(x) xa = foreach(i = 1:nchar(xs), 测试数据bine = "c") %do% { as.numeric(substr(xs,i,i))*(10^(nchar(xs) - i))} dup = which((xa[-1] == 0) & (xa[-length(xa)] == 0))+1 if (length(dup)>0) xa = xa[-dup] if (xa[length(xa)] == 0) xa = xa[-length(xa)] xa = map(xa, Digital, Chs) return(paste(xa, collapse="")) } change = function(x) { if (x>=10000) { if((x %/% 10000) %% 10 == 0) { if (x %% 10000 == 0) return(paste(change.simple(x %/% 10000), "万", sep = "")) else return(paste(change.simple(x %/% 10000), "万零", change.simple(x %% 10000), sep = "")) }else { if (x %% 10000你故意少写一个数字,比如第1741条不写。如果他检查不出来,就跟他分手。
fuck if (x == 100000) return("十万") digits = c("一", "二", "三", "四", "五", "六", "七", "八", "九") units = c("", "十", "百", "千", "万") x_vec = rev(as.numeric(unlist(strsplit(as.character(x), "")))) ans = "" reserve_0 = FALSE for(it in rev(seq(length(x_vec)))) { if (x_vec[it] != 0) { if (reserve_0) { ans = paste(ans, "零", sep = "") reserve_0 = FALSE } ans = paste(ans, digits[x_vec[it]], units[it], sep = "") } else { reserve_0 = TRUE } } if (x = 10) ans = substring(ans, 2, 10) return(ans) } ##################################################################### print(paste("对不起, 第", sapply(seq(1e5), fuck), "遍", sep = ""))你男友为了让你学好编程也是蛮拼的 既然难点是在数字部分的汉字化,加个函数好了
charfunc function ( x ) { numb c ( '0' = '零' , '1' = '一' , '2' = '二' , '3' = '三' , '4' = '四' , '5' = '五' , '6' = '六' , '7' = '七' , '8' = '八' , '9' = '九' ) units c ( '' , '十' , '百' , '千' , '万' , '十万' ) res1 as.character ( x ) res2 numb [ unlist ( strsplit ( res1 , '' ))] res3 paste ( res2 , units [ length ( res2 ) : 1 ], sep = '' , collapse = '' ) res4 gsub ( '零\\w' , '零' , res3 ) res5 gsub ( '零+' , '零' , res4 ) gsub ( '零$' , '' , res5 ) } sorry data.frame ( paste ( '对不起,第' , apply ( matrix ( 1 : 100000 ), 1 , charfunc ), '遍' , sep = '' ), stringsAsFactors = F ) names ( sorry ) 'sorry' head ( sorry ) tail ( sorry )Ruby的。。应该还有bug。。扛不住先睡了。。
class Fixnum def to_chinese length = self . to_s . length array = [] time = length % 4 == 0 ? length / 4 : length / 4 + 1 chars = '亿万 ' [ 3 - time , 3 ] time . downto ( 0 ) do | t | start = ( t - 1 ) * 4 + length % 4 cut_start = start 0 ? 0 : start cut_length = start 0 ? 4 + start : 4 cut = self . to_s [ cut_start , cut_length ] unless cut == '' ch = cut . to_i . to_ch array . push " #{ ch }#{ chars [ t ] } " unless ch == '' end end array . reverse . join . delete ( ' ' ) end def to_ch chars = '零一二三四五六七八九' bits = ' 十百千' array = [] self . to_s . length . times do | t | cnumber = chars [ self . to_s . reverse [ t ]. to_i ] i_array = [ nil , '' , '零' ] if cnumber != '零' char = " #{ cnumber }#{ bits [ t ] } " elsif t - 1 >= 0 && ! i_array . include? ( array [ t - 1 ] ) && ! i_array . include? ( ! array [ 0 ] ) char = '零' else char = '' end array . push char end array . reverse . join end end 1000000 . times { | time | p "对不起,第 #{ time . to_chinese } 遍" }
你不是擅长R话题么。。。。。。
unit@石临源 ,你的程序有bug,我重写了个。
CHINESE_DIGITS = '零一二三四五六七八九' CHINESE_UNITS = ( '' , '十' , '百' , '千' , '万' ) def tslt_le4 ( intnum ): lststr = list ( str ( intnum ) . zfill ( 4 )[:: - 1 ]) units = tuple ( CHINESE_UNITS [ i ] if lststr [ i ] != '0' else '' for i in range ( 4 )) for i in range ( 3 ): if lststr [ i + 1 ] == '0' and lststr [ i ] == '0' : lststr [ i ] = '' else : if lststr [ 3 ] == '0' : lststr [ 3 ] = '' for i in range ( 4 ): if lststr [ i ]: lststr [ i ] = CHINESE_DIGITS [ int ( lststr [ i ])] result = '' . join ( lststr [ i ] + units [ i ] for i in range ( 3 , - 1 , - 1 )) result = result [: - 3 ] . replace ( '二' , '两' ) + result [ - 3 :] result = result . rstrip ( '零' ) return result def tslt_le8 ( intnum ): leftint = intnum // 10 ** 4 rightint = intnum % 10 ** 4 left = tslt_le4 ( leftint ) if left : left += '万' rightint = intnum % 10 ** 4 right = tslt_le4 ( rightint ) if leftint and 0 rightint 1000 : right = '零' + right result = left + right if result == '' : result = '零' if result . startswith ( '一十' ): result = result [ 1 :] return result if __name__ == "__main__" : with open ( 'sorry.txt' , 'w' ) as f : for i in range ( 1 , 100001 ): sorry_str = '对不起 第{}遍 \n ' . format ( tslt_le8 ( i )) f . write ( sorry_str )
查看更多关于“男友让我打十万个[对不起],汉字标上多少遍。”这个问题用R如何实现?的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did83311