역 계수 계산


18

작업:

를 출력 값 x, 여기서 a mod x = b주어진 두 값 a,b.

인수

  • a그리고 b항상 양의 정수가 될 것입니다
  • 항상 해결책이있는 것은 아닙니다 x
  • 여러 솔루션이 존재하면 그 중 하나 이상을 출력하십시오.
  • 솔루션이없는 경우 솔루션이 존재하지 않음을 표시하거나 표시하지 않습니다.
  • 내장이 허용됩니다 (다른 수학적 접근 방식만큼 재미 있지 않음)
  • 출력은 항상 정수입니다

A, B >> POSSIBLE OUTPUTS

5, 2 >> 3
9, 4 >> 5
8, 2 >> 3, 6
6, 6 >> 7, (ANY NUMBER > 6)
8, 7 >> NO SOLUTION
2, 4 >> NO SOLUTION
8, 5 >> NO SOLUTION
10,1 >> 3, 9

이것은 이므로 가장 낮은 바이트가 이깁니다.


해결책을 찾지 못하면 오류가 발생합니까?
박수

@ConfusedMr_C 기술적으로 해결책이 없음을 나타냅니다.
Graviton

답변:


11

자바 스크립트 , 28 27 26 24 23 바이트

a=>b=>(a-=b)?a>b&&a:b+1

온라인으로 사용해보십시오!

false 해결책이 없음을 나타냅니다.

-1 감사합니다 @Arnauld


훌륭하게 골프를 쳤다.
Shaggy

그래서, 전화, 당신은 외부 함수에 이름을 지정해야하는, 말 f=..., 다음 전화를 f(8)(3)? 좀 시끄러운 것 같아? 함수를 호출하는 일반적인 방법 f(8,3)은입니다. 그러면 함수 정의가 더 길어 집니까?
Steve Bennett

3
@SteveBennett 정의는 커리 ( curried)이므로, 반드시 호출해야 (8)(3)하지만 PPCG에 대한 합의가 허용 됩니다. 그래도 이름을 지정할 필요는 없습니다.
eush77

1
@SteveBennett 26 대 -15가 명확한 합의에 지나지 않는다고 생각하는 것이 재미 있습니다 . 분쟁을 벌이려고 노력합니다.
eush77

1
@SteveBennett 55 대 1은 어떻게 약한 합의입니까?
Cyoce




3

Groovy, 48 바이트 (내장 사용) :

{a,b->Eval.me(a+"g").modInverse(Eval.me(b+"g"))}

Eval.me(...+"g") -입력에 "g"를 붙여 BigInteger로 만듭니다.

modInverse(...) -역 모듈로 연산을 수행합니다.


자바 8, 70 바이트

{a,b->return BigInteger.valueOf(a).modInverse(BigInteger.valueOf(b));}

3

R , 33 28 바이트

pryr::f(match(b,a%%1:(a+1)))

온라인으로 사용해보십시오!

Jarko Dubbeldam 덕분에 -4 바이트.

주세페 덕분에 -1 바이트.

NA가없는 경우를 반환 합니다. TIO에는 pryr 라이브러리가 설치되어 있지 않으므로 해당 링크의 코드가 function(a,b)대신 사용 됩니다.


pryr::f(which(a%%1:(a+1)==b)) 4 바이트 더 짧습니다.
JAD

누락 된 값 match(b,a%%1:(a+1))을 반환 하는을 사용하여 다른 바이트를 삭제할 수도 있습니다 NA.
주세페


1

매스 매 티카 36 바이트

a_±b_:=Select[Range[9a],a~Mod~#==b&]

입력:

5 ± 2
9 ± 4
8 ± 2
6 ± 6
8 ± 7
2 ± 4
8 ± 5
10 ± 1

산출:

{3}
{5}
{3, 6}
{7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, \
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, \
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54}
{}
{}
{}
{3, 9}

이 확장 ASCII 연산자를 이진 형식으로 사용하는 경우 정의 할 때 앞에 공백이 필요합니다. 그렇지 않으면 파서에서 오류가 발생합니다. 따라서이어야 a_ ±b_합니다. 그러나 어쨌든 명명되지 않은 함수 Cases대신 사용하는 것이 더 짧 Select습니다.Cases[Range[9#],x_/;#~Mod~x==#2]&
Martin Ender


1

C # (모노 C # 컴파일러) , 57 56 26 바이트

Port of Rod의 Python 답변. -1 바이트의 WW 덕분입니다.

-30 바이트의 Kevin Cruijssen에게 큰 감사를드립니다.

a=>b=>a-b>b?a-b:a==b?a+1:0

온라인으로 사용해보십시오!


1
사이트에 오신 것을 환영합니다! 뒤에 공백을 제거 할 수있는 것 같습니다 return.
밀 마법사

PPCG에 오신 것을 환영합니다! 비 재귀 C # 답변의 경우 람다 함수 ( i=>{/*code here*/}) 를 사용하는 것이 가장 좋습니다 . 그러나이 경우 2 개의 입력이 있으므로 추가 바이트를 저장하는 카레 람다 함수일 수 있습니다 ( a=>b=>{/*code here*/}대신 (a,b)=>{/*code here*/}). 또한 if-check 주위의 괄호를 제거 할 수 있습니다. 전체적으로 기능을 변경하지 않고도 a=>b=>a-b>b?a-b:a==b?a+1:0 26 바이트
Kevin Cruijssen

또한 아직 보지 못했다면 <모든 언어> 에서 골프를하기위한 팁C #에서 골프를하기위한 팁 을 읽는 것이 흥미로울 것입니다. 체류를 즐길 수! :)
Kevin Cruijssen

팁을 주셔서 감사합니다. 앞으로 골프를 칠 때이 점을 명심하겠습니다.
Epicness





0

공리, 147128 바이트

g(a:PI,c:PI):Union(List PI,Stream INT)==(a<c=>[];r:=a-c;r=0=>expand((a+1..)::UniversalSegment INT);[b for b in divisors(r)|b>c])

그것을 풀고 테스트

--a%b=c return all possible b
f(a:PI,c:PI):Union(List PI, Stream INT)==
    a<c=>[]
    r:=a-c
    r=0=>expand((a+1..)::UniversalSegment INT)
    [b  for b in divisors(r)|b>c]

(3) -> [[i,j,g(i,j)] for i in [5,9,8,6,8,2,8,10] for j in [2,4,2,6,7,4,5,1]]
   (3)
   [[5,2,[3]], [9,4,[5]], [8,2,[3,6]], [6,6,[7,8,9,10,11,12,13,14,15,16,...]],
    [8,7,[]], [2,4,[]], [8,5,[]], [10,1,[3,9]]]
                                                      Type: List List Any

이것은 모든 솔루션조차도 무한 세트 솔루션을 찾을 수 있습니다 ...


0

, 9 바이트

a%,a+2@?b

두 숫자를 명령 행 인수로 사용합니다. 가장 작은 솔루션을 출력하거나, 솔루션이 없으면 nil을 출력합니다.온라인으로 사용해보십시오!

설명

           a, b are cmdline args (implicit)
  ,a+2     Range from 0 up to but not including a+2
a%         Take a mod each of those numbers
           (Note that a%0 returns nil; it emits a warning, but only if warnings are turned on)
      @?b  Find the index of the first occurrence of b in this list, or nil if it doesn't occur
           Autoprint (implicit)

예를 들어 82:

   a+2   10
  ,      [0 1 2 3 4 5 6 7 8 9]
a%       [() 0 0 2 0 3 2 1 0 8]

2이 목록에서 처음 나타나는 0부터 시작하는 인덱스는 3솔루션입니다.







0

ORK , 566 바이트

When this program starts:
I have a inputter called I
I have a number called a
I have a number called b
I is to read a
I is to read b
I have a mathematician called M
M's first operand is a
M's second operand is b
M is to subtract
I have a number called n
n is M's result
M's first operand is b
M's second operand is n
M is to compare
I have a scribe called W
If M says it's less then W is to write n
If M says it's less then W is to write "\n"
M's second operand is a
M is to compare
If M says it's equal then W is to write a
If M says it's equal then W is to write a

온라인으로 사용해보십시오!

O는 bjects R K의 OOL을. 그러나 운 좋게도이 작업에 내장 된 것 외에는 사용할 필요가 없었습니다.


0

F #, 40 바이트

let m a b=Seq.find(fun x->a%x=b){1..a+1}

온라인으로 사용해보십시오!

꽤 직설적 인. System.Collections.Generic.KeyNotFoundException해결책을 찾을 수 없으면를 던집니다 .

당신은 또한 그것을 수정할 수 Seq.tryFind을 반환하는, int option함께 None해결책을 찾을 수 없습니다 경우.





0

Whispers v2 , 128 바이트

> Input
> Input
>> 1²
>> (3]
>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7
>> L⋅R
>> Each 9 4 8
> {0}
>> {10}
>> 12∖11
>> Output 13

온라인으로 사용해보십시오!

가능한 모든 솔루션 세트와 빈 세트를 리턴합니다 (예 : ) 해결책이 없을 때.

작동 원리

당연히, 그것은 대부분의 다른 답변과 거의 동일하게 작동합니다 : 숫자 목록을 생성하고 인수와 함께 역 계수를 각각 검사합니다.

Whispers의 프로그램 구조가 어떻게 작동하는지 잘 알고 있다면 수평선으로 건너 뛰십시오. 그렇지 않은 경우 : 본질적으로 Whispers는 최종 라인에서 시작하여 라인 별 참조 시스템에서 작동합니다. 각 줄은 두 가지 옵션 중 하나로 분류됩니다. 어느 그것은이다 nilad 라인 , 또는 A는 오퍼레이터 라인 입니다.

Nilad 라인 >> Input또는 > {0}과 같이로 시작하고 해당 라인에 표시된 정확한 값을 > {0}반환합니다. 즉 , 세트를 반환합니다{0}. > Input가능한 경우 평가 된 STDIN의 다음 행을 리턴합니다.

조작자 라인 시작 >>등, >> 1²또는 >> (3]과 나타내고 하나 개 이상의 값 연산자를 실행. 여기서 사용 된 숫자는 명시적인 숫자를 참조하지 않고 대신 해당 줄의 값을 참조합니다. 예를 들어 ²square 명령은2)이므로 >> 1²값을 반환하지 않습니다12대신 1 행의 제곱을 반환 하는데,이 경우 첫 번째 입력입니다.

일반적으로, 운영자 라인은 참조로 번호를 사용하여 작업, 아직 당신은 선을 발견했습니다 수 >> L=2>> L⋅R. 이 두 값 LREach문과 함께 사용됩니다 . Each서술문은 두세 개의 주장을 다시 숫자 참조로 사용하여 작동합니다. 첫 번째 인수 (예 :) 5는 함수에 사용 된 연산자 줄에 대한 참조이며 나머지 인수는 배열입니다. 그런 다음 배열에서 함수를 반복합니다. 여기서 LR의 함수는 반복되는 배열의 현재 요소를 나타냅니다. 예로서:

허락하다 =[1,2,,4], =[4,,2,1]에프(엑스,와이)=엑스+와이. 다음 코드를 실행한다고 가정합니다.

> [1, 2, 3, 4]
> [4, 3, 2, 1]
>> L+R
>> Each 3 1 2

그런 다음 Each진술 이 어떻게 작동 하는지 시연 합니다. 먼저 두 개의 배열로 작업 할 때 압축하여 양식을 만듭니다.=[(1,4),(2,),(,2),(4,1)] 그런 다음지도 에프(엑스,와이) 마지막 배열을 형성하는 각 쌍에 =[에프(1,4),에프(2,),에프(,2),에프(4,1)]=[5,5,5,5]

온라인으로 사용해보십시오!


어떻게 코드가 작동

Whispers의 작동 방식에 반 직관적으로 작업하면서 처음 두 줄부터 시작합니다.

> Input
> Input

이것은 우리의 두 가지 입력을 수집합니다. 엑스와이12에 각각 저장합니다 . 우리는 다음 저장엑스23 행 에서 범위를 만듭니다: =[1...엑스2]4 행 . 다음으로 섹션으로 이동

>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7

여기 실행 우선 라인 7 , >> Each 5 4라인 반복 처리, 5 라인을 통해 4 . 이것은 배열을 산출합니다: =[나는%엑스|나는], 어디 %계수 로 정의됩니다.

우리는 다음 라인 실행 (8) , >> Each 6 7라인 반복 처리, 6 이상을, yielding an array C:=[(i%x)=y|iA].

For the inputs x=5,y=2, we have A=[1,2,3,...,23,24,25], B=[0,1,2,1,0,5,5,...,5,5] and C=[0,0,1,0,0,...,0,0]

We then jump down to

>> L⋅R
>> Each 9 4 8

which is our example of a dyadic Each statement. Here, our function is line 9 i.e >> L⋅R and our two arrays are A and C. We multiply each element in A with it's corresponding element in C, which yields an array, E, where each element works from the following relationship:

Ei={0Ci=0AiCi=1

We then end up with an array consisting of 0s and the inverse moduli of x and y. In order to remove the 0s, we convert this array to a set (>> {10}), then take the set difference between this set and {0}, yielding, then outputting, our final result.


-1

C#, 53 bytes (83 with function heading)

static int F(int a, int b){
    for(int i=1;i<=a+1;i++){if(a%i==b)return i;}return 0;
}

Try It Online

First try at codegolf. Probably not the best language to use, nor the most efficient coding.


5
Remove the unnecessary whitespace to save about 10 or more bytes
Mr. Xcoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.