Що половина на годиннику?


25

У своїй кімнаті у мене є цей чудовий годинник (натисніть на повний розмір):

введіть тут опис зображення

Більшість із них не складно розібратися, але особливість 4-годинного годинника особливо складна:

два на потужність від’ємного одного модуля сім

Зазвичай, частка, як 1/2, не має сенсу в модульній арифметиці, оскільки беруть участь лише цілі числа. Правильний спосіб, таким чином, полягає в тому, щоб це бачити як зворотне значення 2, або, кажучи іншим чином, два на силу негативногоце число, хде два рази х дорівнює одному. Якщо сказати так, миттєва думка виявить це х дорівнює чотирматому , що два x дорівнює два рази чотири дорівнює восьми, що еквівалентно одному модулю сім.

Однак просто знайти мультиплікативну зворотню було б занадто просто, як виклик. Тож давайте підводимо труднощі до експоненціації, або іншими словами, знаходження модульного логарифму чи дискретного логарифму 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

2
Графічний вхід!
Conor O'Brien

6
x^-1означає мультиплікативний зворотний х , тобто число y таке, що xy = 1 . У полі дійсних чисел 2 ^ -1 = 0,5 . У кільці цілих чисел за модулем 7 , 2 ^ -1 = 4 .
Денніс

4
Модульна арифметика дивна.
SuperJedi224

3
@ SuperJedi224 Модульна арифметика є фантастичною, і все ж ви , ймовірно , зробити це принаймні один раз в день , не усвідомлюючи цього. Якщо ви використовуєте 12 годинний час, і хтось просить вас зателефонувати їм через дві години, і це 11:00, і ви вирішите зателефонувати їм о 1:00, ви просто зробили модульну арифметику. Мені здається, що одне із чисел на цьому годиннику виражається так, що іноді називають «арифметикою годинника».
Тодд Вілкокс

Відповіді:



13

Pyth - 9 8 байт

f!t.^2TQ

Тестовий сюїт .

fілтерс за замовчуванням 1, поки він не знаходить деякий х такий, що модульна експоненція з 2 і вхід дорівнює 1.


11

Пітон, 32 байти

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

Починаючи з 2, подвоюється модуль n, поки результат не дорівнює 1, щоразу збільшується рекурсивно, і закінчуючи рахунком 1 для початкового значення 2.


8

Математика, 24 байти

2~MultiplicativeOrder~#&

Я просто використовував для цього вбудований.


20
З курсу Mathematica має вбудований для цього. : P
El'endia Starman

7
@ El'endiaStarman Of звичайно Mathematica має ungolfable вбудований для цього. : - {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*⍳.
lirtosiast

6

Піт, 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
Аднан

О, ха-ха, зараз добре. :)
El'endia Starman

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'endia Starman

@ El'endiaStarman Цей код визначає функцію, яку можна назвати як f(3). З якоїсь дурної причини цей веб-сайт не дозволить вам використовувати цю функцію, якщо ви не заявите її за допомогою 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)підходом). Потім 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.

4

Haskell, 30 байт

n%1=1
n%t=1+n%(2*t`mod`n)
(%2)

Аргумент помічника tподвоюється по модулю nкожен крок, поки він не дорівнює 1.


Як я можу це перевірити?
El'endia Starman

Дивіться тут
Лінн

@Mauris: Дякую!
El'endia Starman

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)

Це лямбда-функція, яка приймає ціле число і повертає ціле число. Щоб викликати його, призначте його змінній.

Ми побудуємо масив як 2, піднятий на кожну цілу потужність від 1 до n, потім знаходимо індекс першого 1 у цьому масиві.

Збережено 7 байт завдяки Glen O!


Немає необхідності в команді map, просто використовуйте 2.^(1:n)%n.
Глен О

@GlenO Це прекрасно працює, дякую!
Олексій А.


2

MATL , 13 байт

it:Hw^w\1=f1)

Працює на Octave з поточним компілятором GitHub .

Працює для введення до 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).

Використовує цикл часу. Це один із декількох разів циклу, який краще, ніж відображення діапазону.

Пояснення

          // 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

Спробуйте його онлайн тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.