几点钟了?


25

在我的房间里,我有一个怪异的时钟(点击放大):

在此处输入图片说明

其中大多数都不难弄清楚,但是4点钟的时钟特别棘手:

二到负一的幂为模七

通常,在模数运算中,像1/2这样的分数没有意义,因为仅涉及整数。因此,正确的方法是将其视为2 的倒数,或者换句话说,将其视为其中的二至负一的力量数字。如此说来,片刻的想法就会揭示出,因为。Xx等于1的两倍x等于四2 x等于2乘以4等于8等于1模7

但是,简单地找到乘法逆就太困难了。因此,让我们提高求幂的难度,换句话说,找到2的模对数或离散对数。在这种情况下,3是2相对于7的模对数。对于那些拥有数论/抽象代数的人背景,这意味着计算2模n的乘法阶。

挑战

给定一个正整数n大于1,输出最小的正整数x,其中在此处输入图片说明

例子

n x
3 2 
5 4 
7 3 
9 6 
11 10 
13 12 
15 4 
17 8 
19 18 
21 6 
23 11 
25 20 
27 18 
29 28 
31 5 
33 10 
35 12 
37 36 
39 12 
41 20 
43 14 
45 12 
47 23 
49 21 
51 8 
53 52 
55 20 
57 18 
59 58 
61 60 
63 6 
65 12 
67 66 
69 22 
71 35 
73 9 
75 20 
77 30 
79 39 
81 54 
83 82 
85 8 
87 28 
89 11 
91 12 
93 10 
95 36 
97 48 
99 30 
101 100 
103 51 
105 12 
107 106 
109 36 
111 36 
113 28 
115 44 
117 12 
119 24 
121 110 
123 20 
125 100 
127 7 
129 14 
131 130 
133 18 
135 36 
137 68 
139 138 
141 46 
143 60 
145 28 
147 42 
149 148 
151 15 
153 24 
155 20 
157 52 
159 52 
161 33 
163 162 
165 20 
167 83 
169 156 
171 18 
173 172 
175 60 
177 58 
179 178 
181 180 
183 60 
185 36 
187 40 
189 18 
191 95 
193 96 
195 12 
197 196 
199 99 
201 66 

3
@CᴏɴᴏʀO'Bʀɪᴇɴ:那只是二进制。
El'endia Starman 2015年

2
图形输入!
Conor O'Brien

6
x^-1装置的乘法逆元素X,即,数ÿ使得XY = 1。在实数字段中,2 ^ -1 = 0.5。在以7为模的整数环中,2 ^ -1 = 4
丹尼斯

4
模块化算法很奇怪。
SuperJedi224

3
@ SuperJedi224模块化算法奇怪,但是您可能每天至少执行一次,却没有意识到这一点。如果您使用12个小时的时间,并且有人要求您在两个小时内调用它们,而现在是11:00,而您决定在1:00进行调用,那么您就进行了模块化算术。我发现整整齐齐的是,此时钟上的数字之一有时被称为“时钟算术”。
Todd Wilcox

Answers:


17

果冻,6个字节

R2*%i1

在线尝试!

怎么运行的

R2*%i1  Input: n

R       Range; yield [1, ..., n].
 2*     Compute [2**1, ..., 2**n].
   %    Hook; take all powers modulo n.
    i1  Get the index of the first 1.
        Indices are 1-based, so index k corresponds to the natural number k.


11

Python,32字节

f=lambda n,t=2:t<2or-~f(n,2*t%n)

从2开始,对n取模两次,直到结果为1,然后每次递归递增,最后以计数1表示初始值2。



7

APL,8个字节

1⍳⍨⊢|2*⍳

这是一个单子函数列,它在右边接受一个整数并返回一个整数。要调用它,请将其分配给变量。

说明(调用输入x):

      2*⍳    ⍝ Compute 2^i for each i from 1 to x
   ⊢|        ⍝ Get each element of the resulting array modulo x
1⍳⍨          ⍝ Find the index of the first 1 in this array

请注意,由于指数取整,因此对于大输入而言,结果可能不正确。


1
也是8 :⍴∘∪⊢|2*⍳
lirtosiast 2015年

6

Pyth,14个字节

VQIq%^2hNQ1hNB

说明:

VQIq%^2hNQ1hNB

                # Implicit, Q = input
VQ              # For N in range(0, Q)
  Iq      1     # If equals 1
    %^2hNQ      # 2^(N + 1) % Q
           hN   # Print (N + 1)
             B  # Break

在这里尝试


我得到66\n132\n198的输入201
El'endia Starman

@ El'endiaStarman对不起,错误链接:p
Adnan

哦,哈哈,现在很好。:)
El'endia Starman 2015年

5

JavaScript(ES6),28个字节

f=(n,t=2)=>t<2||-~f(n,2*t%n)

基于@xnor出色的递归方法。


您是否有可以测试的链接?在Chrome的控制台中似乎无法使用。(由于出现=>
语法错误

@ El'endiaStarman来吧
Conor O'Brien 2015年

@CᴏɴᴏʀO'Bʀɪᴇɴ:我不知道该如何测试。
El'endia Starman 2015年

@ El'endiaStarman这段代码定义了一个可以像这样调用的函数f(3)。由于某些愚蠢的原因,除非您使用let或声明该网站,否则该网站将不允许您使用此功能var尝试这个。
ETHproductions 2015年

1
@Pavlo我知道可以接受lambda,但是需要命名此函数,以便它可以自我调用。回到计算机时,我将添加一个测试套件链接。
ETHproductions 2015年

5

05AB1E,11个字节

码:

DUG2NmX%iNq

说明:

DUG2NmX%iNq

D            # Duplicates the stack, or input when empty
 U           # Assign X to last item of the stack
  G          # For N in range(1, input)
   2Nm       # Calculates 2 ** N
      X      # Pushes X
       %     # Calculates the modulo of the last two items in the stack
        i    # If equals 1 or true, do { Nq }
         N   # Pushes N on top of the stack
          q  # Terminates the program
             # Implicit, nothing has printed, so we print the last item in the stack

5

朱莉娅,25 24字节

n->endof(1∪2.^(1:n)%n)

这很简单- 2.^(1:n)%n在集合中找到2的幂,is union,但是用作unique并仅返回每个唯一幂之一(并且由于它是一个中缀运算符,因此我可以与1合并以节省一个字节∪(2.^(1:n)%n))。然后endof计算唯一乘方的数量,因为一旦它达到1,它就会重复现有的乘方,因此唯一值与产生1的乘方一样多。


5

严重的是14个字节

1,;╗R`╙╜@%`Míu

十六进制转储:

312c3bbb5260d3bd4025604da175

在线试用

说明:

 ,;╗           Make 2 copies of input, put 1 in reg0
    R          push [0,1,...,n-1]
     `    `M   map the quoted function over the range
      ╙        do 2^n
       ╜@%     modulo the value in reg0
1           íu Find the 1-index of 1 in the list.


2

Japt,17个字节

1oU f@2pX %U¥1} g

在线尝试!

如果Japt具有“查找符合此条件的第一项”功能,则该长度将缩短三个字节。一人开始工作

怎么运行的

1oU f@2pX %U¥1} g   // Implicit: U = input number
1oU                 // Generate a range of numbers from 1 to U.
                    // "Uo" is one byte shorter, but the result would always be 0.
    f@        }     // Filter: keep only the items X that satisfy this condition:
      2pX %U¥1      //  2 to the power of X, mod U, is equal to 1.
                g   // Get the first item in the resulting list.
                    // Implicit: output last expression


2

朱莉娅,33 26字节

n->findfirst(2.^(1:n)%n,1)

这是一个lambda函数,它接受一个整数并返回一个整数。要调用它,请将其分配给变量。

我们将数组构造为2,将每个整数幂从1提升到n,然后找到该数组中第一个1的索引。

感谢Glen O,节省了7个字节!


无需map命令,只需使用即可2.^(1:n)%n
Glen O

@GlenO很好,谢谢!
Alex A.


2

MATL,13字节

it:Hw^w\1=f1)

使用编译器的当前GitHub提交在Octave上运行。

51由于double数据类型的限制,最多可输入。

>> matl it:Hw^w\1=f1)
> 17
8

说明

i             % input, "N"
t:            % vector from 1 to N
Hw^           % 2 raised to that vector, element-wise
w\            % modulo N
1=            % true if it equals 1, element-wise
f1)           % index of first "true" value

2

独角兽1307 1062 976字节

( ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 ( 🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 2 ) 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ✨✨✨✨✨✨✨✨✨✨ 2 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ ( 🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 2 ✨✨✨✨✨✨✨ 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐 ) ) ( 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ( ) )

我正在尝试使独角兽成为一种严肃的高尔夫语言,但这有点困难...

我希望我会找到一个办法留住语言的“麒麟性”,同时使少字节


图片:

在此处输入图片说明

使用自定义编码。

这个答案是非竞争性的,因为它使用的是此语言之后制作的Unicorn版本


3
彩虹和独角兽在这只动物中很强...
Mama Fun Roll

有人想出UnicornRLE
Sebi

我是唯一((2)2(2))(())使用@Downgoat解释器退出代码的人吗?
Rɪᴋᴇʀ

2

𝔼𝕊𝕄𝕚𝕟,11个字符/ 22个字节

↻2ⁿḁ%ï>1)⧺ḁ

Try it here (Firefox only).

使用while循环。这是while循环几次比在一个范围内进行映射更好的几次之一。

说明

          // implicit: ï = input, ḁ = 1
↻2ⁿḁ%ï>1) // while 2 to the power of ḁ mod input is greater than 1
  ⧺ḁ      // increment ḁ
          // implicit output


0

Prolog,55个字节

码:

N*X:-powm(2,X,N)=:=1,write(X);Z is X+1,N*Z.
p(N):-N*1.

解释:

N*X:-powm(2,X,N)=:=1, % IF 2^X mod N == 1
     write(X)         % Print X
     ;Z is X+1,       % ELSE increase exponent X
     N*Z.             % Recurse
p(N):-N*1.            % Start testing with 2^1

例:

p(195).
12

在这里在线尝试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.