時計の半分は何ですか?


25

私の部屋には、こっけいな時計があります(クリックするとフルサイズになります)。

ここに画像の説明を入力してください

これらのほとんどは理解するのが難しいことではありませんが、4時の場合は特に注意が必要です。

2から7を法とする負の1の累乗

通常、1/2のような分数は、整数のみが関係するため、モジュラー演算では意味がありません。正しい方法は、その後、としてこれを見ることで 2の、または別の言い方をするために、マイナス1の2乗その番号であるバツところxが1に等しい2回。この言い方をすれば、一瞬の思考がその明らかにするxは4ために2 xは2 x 4は8に等しく、これは7を法とする1に等しい

しかし、単純に乗法の逆数を見つけるのは簡単ではありません。したがって、べき乗、つまり言い換えると、2のモジュラー対数または離散対数を見つけるのが困難です。この場合、3は7に対して2のモジュラー対数です。バックグラウンドでは、これはnを法とする2の乗法次数を計算することを意味します。

チャレンジ

正の所定の奇数の整数のn1を超えると、出力最小の正の整数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ʀɪᴇɴ:それは単なるバイナリです。
エレンディアスターマン

2
グラフィカルな入力!
コナーオブライエン

6
x^-1xの乗法逆数、つまりxy = 1のような数yを意味します。実数のフィールドでは、2 ^ -1 = 0.5です。7を法とする整数のリングでは、2 ^ -1 = 4です。
デニス

4
モジュラー演算は奇妙です。
SuperJedi224

3
@ SuperJedi224モジュラー演算奇妙ですが、おそらくあなた気づかないうちに少なくとも1日に1回はそれを行うでしょう。12時間を使用し、誰かが2時間でそれらを呼び出すように頼み、それが11:00であり、それらを1:00に呼び出すことにした場合、モジュラー算術を行いました。この時計の数字の1つが、「時計算術」と呼ばれることもある方法で表現されているのはすばらしいことです。
トッドウィルコックス

回答:




11

Python、32バイト

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

2から始まり、結果が1になるまでnを法として倍増し、毎回再帰的に増分し、初期値2のカウント1で終わります。


8

Mathematica、24バイト

2~MultiplicativeOrder~#&

私はこれにビルトインを使用しました。


20
うちもちろん Mathematicaは内蔵されています。このため。:P
El'endia Starman

7
@ El'endiaStarman もちろん Mathematicaにはこのために利用できない組み込み機能があります。:-{D
wizzwizz4

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*⍳
リトシアスト


5

JavaScript(ES6)、28バイト

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

@xnorの素晴らしい再帰的アプローチに基づいています。


これをテストできるリンクはありますか?Chromeのコンソールでは機能しないようです。(SyntaxErrorが原因=>だと思います。)
El'endia Starman


@CᴏɴᴏʀO'Bʀɪᴇɴ:テスト方法がわかりません。
エレンディアスターマン

@ El'endiaStarmanこのコードは、のように呼び出すことができる関数を定義しましたf(3)。なんらかの愚かな理由で、そのWebサイトでは、letまたはで宣言しない限り、この関数を使用できませんvarこれを試して。
ETHproductions

1
@Pavloラムダが受け入れられることは知っていますが、この関数はそれ自体を呼び出すことができるように名前を付ける必要があります。コンピューターに戻ったら、テストスイートのリンクを追加します。
ETHproductions

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のべき乗を見つけ、unionますが、uniqueそれぞれの一意の力の1つとしてのみ機能し、それを返します(そして、それは中置演算子なので、∪(2.^(1:n)%n)アプローチでバイトを節約するために1と結合できます)。次に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に「この条件に一致する最初のアイテムを見つける」機能がある場合、これは3バイト短くなります。作業を開始します

使い方

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)

これは、整数を受け入れて整数を返すラムダ関数です。呼び出すには、変数に割り当てます。

1から2までの整数乗で配列を作成します nして配列を作成し、この配列の最初の1のインデックスを見つけます。

グレンOのおかげで7バイト節約できました!


mapコマンドは不要です2.^(1:n)%n。使用するだけです。
グレンO

@GlenOそれは完璧に動作します、ありがとう!
アレックスA.


2

MATL、13バイト

it:Hw^w\1=f1)

コンパイラの現在のGitHubコミットでOctaveで実行されます。

51doubleデータ型の制限による)までの入力に対して機能します。

>> 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 ✨✨✨✨✨✨✨ 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐 ) ) ( 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ( ) )

私はユニコーンを深刻なゴルフ言語にしようとしていますが、それは少し難しいです...

願わくば、バイト数を大幅に減らしながら、言語の「ユニコーンらしさ」を維持する方法を見つけたい


画像:

ここに画像の説明を入力してください

カスタムエンコーディングを使用します

この回答は、この言語の後に作成されたバージョンのユニコーンを使用しているため、競合していません


3
虹とユニコーンが...この1と強いです
ママ楽しいロール

誰かがUnicornRLEを思い付く
セビ

((2)2(2))(())@Downgoatのインタープリターでコードから抜け出すのは私だけですか?
Rɪᴋᴇʀ

2

𝔼𝕊𝕄𝕚𝕟、11文字/ 22バイト

↻2ⁿḁ%ï>1)⧺ḁ

Try it here (Firefox only).

whileループを使用します。これは、whileループが範囲をマッピングするよりも優れている数少ない時間の1つです。

説明

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


0

プロローグ、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

こちらからオンラインでお試しください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.