Перевірка модуля


12

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

Наприклад:

[m % 3 = 0, m % 4 = 1, m % 5 = 3], де% - оператор модуля.

Для n= 3, перші 3 числа (рахуючи від 0), які відповідають послідовності 33, 93, 153, таким чином, ваш результат буде таким (формат залежить від вас).

Правила / IO

  1. Ви берете позитивну кількість nі список істин. Звичайно, що вам потрібно взяти - це лише РЗС модульної роботи та результат.
  2. nі числа в списку істин завжди будуть знаходитись у діапазоні 1 -> 2 ^ 31-1 , так само і результати.
  3. Ви приймаєте вклад у будь-якій зручній формі та виводите в будь-якій зручній формі. Наприклад, вхідний сигнал: 3 [3 0, 4 1, 5 3]і вихід: 33 93 153.
  4. Це гарантовано, що рішення можливо математично.
  5. Джерело введення може бути з файлу, параметрів функції, stdin тощо. Те саме стосується виводу.
  6. Без лазівки
  7. Це код-гольф, тому виграє найменший байт.

Тестові шафи

# Input in the form <n>, <(d r), (d2 r2), ...>
# where <d> = RHS of the modulo expression and <r> the result of the expression. Output in the next line.

5, (3 2), (4 1), (5 3)
53 113 173 233 293

3, (8, 0), (13, 3), (14, 8)
120 848 1576

Реалізація посилань у псевдокоді

n = (an integer from stdin)
truths = (value pairs from stdin)
counter = 0

while n != 0 {
    if matches_criterias(counter, truths) {
        print counter
        n -= 1
    }

    counter += 1
}


@flawr EDIT: Інше питання, здається, забороняє багато речей і містить лише один термін. Не впевнений, чи це вже дублікат ....
Yytsi

1
@flawr Цей виклик має обмеження у часі. Є гольфістські способи вирішити цю проблему, які не покладаються на китайську теорему залишків.
Денніс

Так, я це знаю, тому я просто пов'язав це.
помилка

Чи 0дійсний результат?
Ніл

Відповіді:


6

Желе , 7 байт

%⁼⁴
0ç#

Це повна програма. Аргументи - це дільники, цільові модулі та кількість рішень у такому порядку.

Спробуйте в Інтернеті!

Як це працює

0ç#  Main link.
     Left argument: D (array of divisors)
     Right argument: M (array of target moduli)
     Third argument: n (number of solutions)

0ç#  Execute the helper link with k = 0, 1, 2, ... as left argument and D as the
     right one until n of them return 1. Yield the array of matches.


%⁼⁴  Helper link. Left argument: k. Right argument: D

%    Compute k % d for each d in D.
 ⁼⁴  Compare the result with M.

4

Perl 6 , 33 байти

{grep((*X%@^b)eqv@^c,0..*)[^$^a]}

Спробуй це

Вхід є ( number-of-values, list-of-divisors, list-of-remainders )

Розширено:

{   # bare block lambda with placeholder parameters 「$a」 「@b」 「@c」

  grep(

    # WhateverCode lambda:
    (

      *        # the value being tested

      X%       # cross modulus

      @^b      # with the divisors ( second parameter )

    )

    eqv        # is that list equivalent with

    @^c        # the expected remainders ( third parameter )

    # end of WhateverCode lambda

    ,

    0 .. *     # Range of all Integers starting with 0

  )[ ^$^a ]    # grab up-to 「$a」 values ( first parameter )
               # ( 「^$a」 is the same as 「0 ..^ $a」 )
}

4

JavaScript (ES6), 71 68 байт

a=>f=(n,m=0)=>n?a.some(x=>m%x[0]-x[1],++m)?f(n,m):[m,...f(n-1,m)]:[]

Проста рекурсивна функція. Використовуйте, використовуючи криву в масиві перше і nдруге, так:

g=a=>f=(n,m=0)=>n?a.some(x=>m%x[0]-x[1],++m)?f(n,m):[m,...f(n-1,m)]:[]
g([[3, 2], [4, 1], [5, 3]])(5)

4

JavaScript (ES6), 74 70 69 байт

Приймає вхідний сигнал в вигляді цілого числа nі масив aз [modulo, remainder]масивів з виробленням синтаксису (n)(a).

n=>a=>eval('for(i=r=[];a.some(([b,c])=>i%b-c)||--n*r.push(i);i++);r')

Тестові справи


3

Haskell, 47 байт

n#l=take n[i|i<-[0..],all(\(d,r)->mod i d==r)l]

Приклад використання: 3 # [(8,0),(13,3),(14,8)]-> [120,848,1576].


3

Пітон, 67 байт

lambda n,r:[k for k in range(2**32)if all(k%d==m for d,m in r)][:n]

Вам потрібно всього лише range(2**31). Також дуже приємно. Я відповів цю відповідь самостійно.
mbomb007

3

JavaScript (ES6), 72 70 байт

a=>g=(n,i,r=[],m=a.some(e=>i%e[0]^e[1]))=>n?g(n-!m,-~i,m?r:[...r,i]):r

Поцікавився масив умов перший та кількість результатів другий. Редагувати: збережено 2 байти, не обробляючи нульовий регістр.


2

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

#2~ChineseRemainder~#+Range[0,#3-1]LCM@@#&

Безіменна функція, що повертає список натуральних чисел та приймає три входи: список модулів, список залишків та кількість nцілих чисел, які потрібно повернути. Наприклад, другий тестовий виклик посилається на

#2~ChineseRemainder~#+Range[0,#3-1]LCM@@#&[{8,13,14},{0,3,8},3]

і повертається {120, 848, 1576}.

Вбудований #2~ChineseRemainder~#дає найменше негативне рішення; щоб отримати всі бажані рішення, додамо це число Range[0,#3-1]LCM@@#, яке є першим nнеотрицательним кратним найменш спільним кратним з усіх модулів.

Наскільки я знаю, Mathematica не має ліниво оцінених нескінченних списків, тому ця реалізація була коротшою, ніж усе, що я виявив, що тестував негативні цілі числа по одному - навіть із довжиною назви функції ChineseRemainder, і хоча тест на зразок Mod[k,{8,13,14}]=={0,3,8}працює ідеально добре.


2

PHP, 97 байт

найдовша відповідь досі. Але я радий, що міг отримати його нижче 100.

for($a=$argv;++$k;)for($i=$v=2;$m=$a[$i++];$v>$argc/2&&$a[1]-->0?print$k._:0)$v+=$k%$m==$a[$i++];

приймає дані з окремих аргументів командного рядка,
друкує відповідність, розділену та відстежувану підкресленнями.
Петля ніколи не розривається; ледве підходить для онлайн-тестерів.

Бігай, як php -r 'code' <n> <modulo1> <result1> <modulo2> <result2> ....

зламатися

for($a=$argv;++$k;)         // loop $k up from 1
    for($i=$v=2;                // $i = argument index, $v=2+ number of satisfied equations
        $m=$a[$i++];            // loop through modulo/result pairs
        $v>$argc/2                  // 2. if $v>argument-count/2
        &&$a[1]-->0                 // and match count not exhausted
            ?print$k._                  // print match
            :0                          // else do nothing
        )
            $v+=$k%$m==$a[$i++];    // 1. if $k%modulo==result, increment $v

примітки

$argc==count($argv). Для трьох пар є 8 аргументів: ім'я файлу $argv[0], n= $argv[1]та modulo/ resultпари вище цього. $v=2збільшений в 3 рази дає 5> $argc/2.

Додайте один байт для чистого виходу: Замініть &&$a[1]-->0?print$k._на ?$a[1]--?print$k._:die.



1

SmileBASIC, 102 байти

DEF V N,M
FOR K=1TO N@L
T=T+1F=0FOR J=1TO LEN(M)F=F||T MOD M[J-1]-M[J]J=J+1NEXT
ON!F GOTO @L?T
NEXT
END

Це перший раз, коли я коли-небудь використовував ONу SB. Причина, яку я тут використав замість цього, IF F GOTO@L- це те, що я міг поставити ?Tйого після того ж рядка, заощадивши 1 байт.


1

Пітон, 59 байт

lambda n,m:[i for i in range(2**31)if all(map(eval,m))][:n]

m - це перелік виразів у рядковій формі ["i % 4 == 1", ...]

Спробуйте в Інтернеті (з меншим діапазоном, так що він фактично закінчиться)


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