鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

[已解决]Python:每日一题 366

[复制链接]
 楼主| 发表于 2020-4-2 13:31:35 | 显示全部楼层
kinkon 发表于 2020-4-1 19:27
感觉是有公式的可以知道有多长,没想出来,先解题吧。弄了个被包感觉有点费空间,不过方便查看

28 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 13:31:54 | 显示全部楼层

输入 n = 30, k = 434991989 超时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 15:44:05 | 显示全部楼层
  1. from math import ceil
  2. def fun366(n,k):
  3.     if n==1:return '0'
  4.     elif n==2 and k==1:return '0'
  5.     elif n==2 and k==2:return '1'
  6.     else:
  7.         a=n
  8.         t=[]
  9.         while n>2:
  10.             t.insert(0,k)
  11.             k=ceil(k/2)
  12.             n-=1
  13.         result=str(k//2)
  14.         while n<a:
  15.             if result=='0':
  16.                 result='0' if t[n-2]%2 else '1'
  17.             else:
  18.                 result='1' if t[n-2]%2 else '0'
  19.             n+=1
  20.     return result
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 16:58:14 | 显示全部楼层
  1. def fun366(n,k):
  2.     x = '0'
  3.     for i in range(n-1):
  4.         x = x.replace('0','a')
  5.         x = x.replace('1','b')
  6.         x = x.replace('a','01')
  7.         x = x.replace('b','10')
  8.     return x[k-1]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 17:06:25 | 显示全部楼层
def amazing(n):
    a=''
    if n==1:
        return '0'
    else:
        b=''
        for i in amazing(n-1):
            if i=='0':
                b+='01'
            else:
                b+='10'
        return b
def mryt366(n,k):
    a=amazing(n)
    print(a[k-1])

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 17:25:35 | 显示全部楼层
本帖最后由 kkk999de 于 2020-4-2 17:29 编辑

终于有一题会的了。虽然写的很渣。
  1. def bian(s):
  2.     next = ''
  3.     for i in range(len(s)):
  4.         if s[i] == '0':
  5.             next += '01'
  6.         else:
  7.             next += '10'
  8.     return next


  9. def main(n,k):
  10.     ok = ['0']
  11.     for i in range(n):
  12.         b1 = bian(ok[-1])
  13.         ok.append(b1)
  14.     try:
  15.         return ok[n-1][k-1]
  16.     except:
  17.         return '不存在'
  18.    

  19. if __name__ == '__main__':
  20.     print(main(2,2))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 17:43:34 | 显示全部楼层

输入 n = 30, k = 434991989 超时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 17:44:35 | 显示全部楼层
TJBEST 发表于 2020-4-1 20:01
我询问了一下,输出可以是字符串或者是数字。我这里采用字符串的形式。
想法非常简单,没用递归,但是思想 ...

44 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 17:45:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 18:18:09 | 显示全部楼层
def topic(n,k):
    f=[0]
    if n==1:
        print(f[0])
    while n>1:
        g=[]
        for i in f:
            if i==0:
                g.extend([0,1])
            elif i==1:
                g.extend([1,0])
        f=g
        n=n-1
        if n==1:
            print(f[k-1])
        
n=int(input('请输入n'))
k=int(input('请输入k'))
topic(n,k)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 19:36:09 | 显示全部楼层

.

本帖最后由 NAMELESSONE 于 2020-4-2 19:41 编辑
  1. def solve(n,k):
  2.     if n == 1 and k == 1:
  3.         return '0'
  4.     string='01'
  5.     count=1
  6.     for i in range(n-2):
  7.         string = string + string[count:] + string[:count]
  8.         count =  count*2
  9.     return string[k-1]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 21:19:59 | 显示全部楼层
def topic(n,k):
    f=[0]
    if n==1:
        print(f[0])
    while n>1:
        g=[]
        for i in f:
            if i==0:
                g.extend([0,1])
            elif i==1:
                g.extend([1,0])
        f=g
        n=n-1
        if n==1:
            print(f[k-1])
        
n=int(input('请输入n'))
k=int(input('请输入k'))
topic(n,k)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 21:32:08 | 显示全部楼层
没办法提交代码,凑合看下

def py366(n,K):
    if n == 1:
        print(0)
    else:
        a = [0]
        while 1:
            b = []
            for i in a:
                if i == 0:
                    ii = 1
                    b.append(ii)
                else:
                    ii = 0
                    b.append(ii)
            a = a+b
            if len(a) == 2**(n-1):
                print(a[K-1])

                break
            else:
                pass

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 22:05:26 | 显示全部楼层
def func366(n,k):
    def inner(n):
        strs = []
        for i in n:
            if i == '0':
                strs.extend('01')
            elif i == '1':
                strs.extend('10')
        return strs
    f = '0'
    count = 0
    while(count<n-1):
        f = inner(f)
        count+=1
    return f[k-1]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 22:14:19 | 显示全部楼层
def fun366(n):
        i = 1
        m = '0'
        while i < n:
                temp = str()
                for j in range(len(m)):
                        if m[j] == '0':
                                temp += '01'
                        else:
                                temp += '10'
                        m = temp
                i += 1
        return m
n=4
k=5
result = fun366(4)
print(result[k-1])
   

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 14:10:50 | 显示全部楼层
def p366(n,k):

    def p(n):
        if n==1:
            return '0'
        else:
            s=list(p(n-1))
            for i in range(len(s)):
                s[i]='01' if s[i]=='0' else '10'
            return ''.join(s)

    for i in range(1,n):
     return p(n)[k-1]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 14:12:14 | 显示全部楼层
def p366(n,k):

    def p(n):
        if n==1:
            return '0'
        else:
            s=list(p(n-1))
            for i in range(len(s)):
                s[i]='01' if s[i]=='0' else '10'
            return ''.join(s)

     return p(n)[k-1]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-4 10:51:03 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2020-4-4 11:50 编辑

难度评级:普通
要素分析:规律 求反
代码:
  1. def solve(n:int,k:int)->int:
  2.     if n<1 or k<1 or k>2**(n-1):
  3.         raise IndexError('parameter index out of range')
  4.     def re(l):
  5.         return [not i for i in l]
  6.     l = [0]
  7.     for i in range(1,n):l.extend(re(l))
  8.     return int(l[k-1])

  9. if __name__ == '__main__':
  10.     print('示例1 输出:',solve(1,1))
  11.     print('示例2 输出:',solve(2,1))
  12.     print('示例3 输出:',solve(2,2))
  13.     print('示例4 输出:',solve(4,5))
复制代码

当输入不合法的时候,我抛个异常应该不算错吧?
本来吧,我是想用整数的按位求反~的,但是吧,整数的按位求反的位数是恒定的,于是就会出现对补码的求反,导致结果与预期不同。不晓得有没有能够达到效果的BIF.
ps:之前没有调试,函数打错了
上面是顺推,超时,下面是逆推,极快:
  1. def solve(n:int,k:int)->int:
  2.     if n<1 or k<1 or k>2**(n-1):
  3.         raise IndexError('parameter index out of range')
  4.     flg = 0
  5.     for i in range(n-2,0,-1):
  6.         d = divmod(k,2**i)
  7.         if d[0] < 2 and d[1]:
  8.             flg,k = flg+d[0],d[1]
  9.         else:
  10.             k //= d[0]
  11.             if d[0] > 1:flg += 1
  12.     return [1,0][k-1] if flg%2 else [0,1][k-1]
  13. if __name__ == '__main__':
  14.     print('示例1 输出:',solve(1,1))
  15.     print('示例2 输出:',solve(2,1))
  16.     print('示例3 输出:',solve(2,2))
  17.     print('示例4 输出:',solve(4,5))
复制代码
每一行对半分,右边是左边的按位取反,而左边正是上一行的内容,在n=2时有且仅有0和1各一个。当n<=2时若k的取值合法,则在第2行的索引就是k-1且无需求反。



评分

参与人数 1荣誉 +6 鱼币 +6 收起 理由
zltzlt + 6 + 6

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-4 11:42:52 | 显示全部楼层
本帖最后由 钙硼钡锗 于 2020-4-4 11:44 编辑
  1. b='0'
  2. def c():
  3.     global b
  4.     a=''
  5.     for i in b:
  6.         if i=='0':
  7.             a+='01'
  8.         if i=='1':
  9.             a+='10'
  10.     b=a
  11.    
  12. def f366(n,k):
  13.     global b
  14.     b='0'
  15.     for i in range(n-1):
  16.         c()
  17.     print(int(b[k-1]))
  18. n,k=map(int,input().split())
  19. f366(n,k)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 20:09:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 21:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表