나눗셈과 나머지


36

이 문제는 대부분의 "표준"언어에서는 사소한 것이지만이 사이트에서는 거의 볼 수없는 매우 난해하고 수준이 낮거나 사용하기 어려운 언어로 해결됩니다. 흥미로운 문제를 해결해야하므로, 지금까지 읽은 이상한 언어를 시도해보십시오!

작업

두 자연수 가지고 ab정수 나눗셈의 결과 : 입력으로하고 출력 두 숫자 a/b와 같은 나눗셈의 나머지를 ( a%b).

이것은 : 각 언어에 대한 최단 답변 (바이트)이 이깁니다!

입출력

  • 0 <= a<= 255, 1 <= b<= 255. 각 입력 (및 출력)도 단일 바이트에 맞습니다.
  • 두 숫자가 명확하게 구분되는 한 입력 및 출력 모두에 대해 원하는 형식을 선택할 수 있습니다 (예 : 구분 기호없이 두 결과를 함께 인쇄하지 않음)

a,b->division,remainder
5,7->0,5
5,1->5,0
18,4->4,2
255,25->10,5

참고 : 나눗셈 결과와 나머지를 모두 반환하는 빌트인은 금지되어 있습니다. 적어도 당신의 언어가 두 개의 함수를 동일한 인수에 적용하는 방법을 보여주십시오.

참고 2 : 항상 그렇듯이 코드가 어떻게 작동하는지에 대한 설명은 매우 환영합니다. 코드가 읽기 쉽더라도 다른 사람에게는 그렇지 않을 수도 있습니다!


리더 보드

다음은 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


대신 인수를 제공 a b하는 b a대신 인수를 되돌릴 수 있습니까 ?
Outgolfer Erik

@EriktheOutgolfer :You may choose any format you like for both input and output, as long as the two numbers are clearly distinguishable
Emigna

@Emigna 그래, 역전이 그들을 구별 할 수 없게 만들지 확실하지 않았다.
Outgolfer Erik

@EriktheOutgolfer 만약 당신이 그것들을 되돌려 야한다는 것을 알고 있다면 그것들을 구별하는데 아무런 문제가 없습니다 :)
Leo

안타깝게도 제수가 0이면 BF 알고리즘이 작동하지 않습니다 1.
mbomb007

답변:


23

BitCycle , 146 79 64 바이트

내 원래 코드의 전체 섹션이 불필요하다는 것을 알았습니다. 대폭 축소!

v  <>!
A\B^^=
? D^>^<
 >\v^~ D@
 >/ C/
  > C ^
A/B v
^   <
?  D^

프로그램은 제수를 먼저 사용하여 명령 행에서 단항으로 입력을받습니다. 몫과 나머지를 단항으로 출력합니다 0. 예를 들어, 여기에 a=11, b=4, a/b=2, a%b=3:

C:\>python bitcycle.py divmod.btc 1111 11111111111
110111

풀리지 않은 행동

여기 내 ungolfed 버전 컴퓨팅이다 a=3, b=5합니다 (glitchiness에 대해 죄송합니다) 켜져 애니메이션 :

Divmod running in BitCycle

설명을 시도

설명은 ungolfed 버전에 적용됩니다. 다루기 전에 언어의 작동 방식에 대한 느낌을 얻으려면 Esolangs 페이지 를 읽는 것이 좋습니다 .

알고리즘은 다음과 같습니다.

  • 프로그램이 종료 될 때까지 외부 루프를 실행하십시오.
    • 제수의 비트에 대해 내부 루프를 실행하여 피제수의 비트와 쌍을 이룹니다.
      • 제수의 모든 비트가 일치하는 배당 비트를 갖는 경우 단일 비트를 출력하십시오.
      • 제수의 모든 비트가 일치하는 배당 비트를 갖지 않는 경우, 구분 기호를 출력 한 0다음 배당 비트가 있던 것을 종료 한 다음 종료하십시오.

코드의 핵심은 수집기 (대문자) 간의 관계입니다. 각 문자로 분리 된 여러 수집가가 있기 때문에,의는로를 참조하자 A1, A2, B1, B2, 등, 위에서 아래로 번호.

  • A1그리고 A2메인 루프의 처음에 각각 제수 배당을 잡아.
  • 내부 루프는 제수와 피제수에서 한 번에 한 비트 씩 벗겨집니다.
    • 제수의 나머지 부분은있는 경우 항상로 들어갑니다 B1.
    • 제수와 배당이 모두 비어 있지 않으면 1 비트는 C11로 들어가고 1은로 들어갑니다 C3. 나머지 배당금은로 들어갑니다 B2.
    • 제수 만 비어 있지 않은 경우, 우리는 배당이 끝났고 나머지를 인쇄 할 차례입니다. 제수의 비트가로 들어갑니다 C2.
    • 배당 자만 비어 있지 않은 경우, 우리는 제수의 끝에 도달했습니다. 이제 비트를 처리 C3하거나 C2출력 할 시간입니다. 나머지 배당금은로 들어갑니다 C4.
  • B콜렉터에 비트가 있으면 컨텐츠를 A콜렉터로 다시 순환시키고 내부 루프를 계속합니다.
  • 한 번 AB집 모두 비어의 C수집 열고 우리는 처리 단계를 진행합니다 :
    • C1C4그 내용 (제수 및 나머지 배당, 각각)로 덤프 D1D3.
    • C2비어 있으면 몫을 계속 인쇄합니다.
      • 내용은 C3오른쪽 상단 =스위치 로 이동합니다 . 첫 번째 1비트는 바로 통과하여 !출력됩니다.
      • 1비트가 통과, 상기 보드에서 이후의 모든 비트를 송신 지점 우측에 스위치를 활성화한다.
    • 경우 C2비어 있지 않은, 우리는 나머지를 인쇄하고 있습니다.
      • 의 첫 번째 비트는 C2a로 부정되고 0스위치를 통과합니다. 은 0으로 진행 !하고 출력됩니다.
      • 0비트가 통과, 그것은 지점 왼쪽에 스위치를 활성화합니다. 이제 모든 비트 C3가 스위치에서 왼쪽으로 이동하여 주변으로 리디렉션되어 !전체 나머지를 출력합니다.
      • 의 첫 번째 비트 사본 C2도로 전송됩니다 D2.
  • 이제 D수집가가 열립니다.
    • 에 어떤 것이 있으면 D2나머지를 인쇄했음을 의미합니다. 의 비트 D2@에 도달하면 프로그램이 종료됩니다.
    • 그렇지 않으면, 내용 D1D3에 루프 다시 A1A2각각 메인 루프가 시작됩니다.

그게 굉장
에반 Carslake

"프로그램은 명령 행에서 단항으로 입력을받습니다": 저에게 바이너리처럼 보입니까?
therealfarfetch 님이

으악. 출력이 바이너리처럼 보였으므로 입력도 그래야합니다. 그런 다음 텍스트를 읽습니다. 신경 쓰지 마. : P
therealfarfetch 님이

15

brainfuck , 43 41 바이트

,<,[>->+<[>]>>>>+<<<[<+>-]<<[<]>-]>>.>>>.

이것은 Esolangs 에서 수정 된 버전의 파괴 계수 알고리즘을 사용 합니다.

프로그램은 STDIN에서 두 바이트 ( dn )를 순서대로 읽고 두 바이트 ( n % dn / d )를 STDOUT으로 인쇄합니다. TIO의 테이프와 같이 이중 무한 테이프 나 원형 테이프가있는 brainfuck 인터프리터가 필요합니다.

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

작동 원리

프로그램이 시작되기 전에 모든 셀은 값 0을 보유합니다 . STDIN ( ) 에서 d 를 읽고 ,한 단계 왼쪽 ( <)을 이동 하고 STDIN ( ) 에서 n 을 읽은 ,후 테이프는 다음과 같이 보입니다.

       v
A      B      C      D      E      F      G      H      J
0      n      d      0      0      0      0      0      0

다음으로 n> 0 이라고 가정 하면 while 루프에 들어갑니다.

[>->+<[>]>>>>+<<<[<+>-]<<[<]>-]

테이프를 다음과 같이 변형합니다.

먼저 >->+<C로 이동 하여 감소시킨 다음 셀 D로 이동 하여 증가시킨 다음 셀 C 로 돌아갑니다 . 다음에 일어날 일은 셀 C 의 값 이 0 인지 아닌지에 달려 있습니다.

  • C 가 양수 값을 보유하면 [>](셀이 0이 아닌 동안 오른쪽으로 이동) 셀 E로 진행합니다 .

    >>>>+<<<J로 이동 하여 증가시킨 다음 셀 F 로 돌아갑니다 .

    F 는 항상 0을 유지 하므로 while 루프 [<+>-]는 완전히 건너 뛰고 <<D 로 돌아갑니다 .

    도 있기 때문에 마지막으로, DC가 개최 0 , [<]세포에 retrocede합니다 (셀 제로가 아닌 상태에서 좌회전) .

  • C0을 보유 하면 루프 [>]는 완전히 건너 뜁니다. >>>>+<<<G로 이동 하여 증가시킨 다음 셀 D 로 돌아갑니다 .

    이 시점에서 Dd 를 보유하고 (실제로 CD 의 값의 합 은 항상 d가 됨 ) [<+>-]( D 가 양수인 동안 C를 증가 시키고 감소시키는 D ) Cd로 , D0으로 설정 합니다.

    마지막으로, <<셀에 retrocedes B는 , [<]상기 셀의 왼쪽 (셀이 제로가 아닌 동안 좌회전) .

두 경우 모두 >-B로 이동 하여 감소시키고 루프가 0이되지 않으면 루프가 다시 시작됩니다.

이후 K의 반복 테이프는 다음 보인다.

       v
A      B      C      D      E      F      G      H      J
0      n-k    d-k%d  k%d    0      0      k/d    0      k-k/d

n 번의 반복 후에 B 는 제로화되고 루프에서 빠져 나옵니다. 원하는 값 ( n % dn / d )은 셀 DG에 저장 되므로 >>.>>>.인쇄합니다.


12

Funciton , 224 108 바이트

바이트 수는 BOM을 사용한 UTF-16 인코딩을 가정합니다.

 ┌──┬───┐
┌┴╖╓┴╖ ┌┴╖
│%╟║f╟┐│÷╟┘
╘╤╝╙─╜│╘╤╝
 └────┴─┘

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

위의 함수 f는 두 개의 정수를 가져 와서 나누기와 곱을 모두 반환 하는 함수를 정의합니다 (Funciton의 함수는 입력과 출력의 합이 4를 초과하지 않는 한 여러 출력을 가질 수 있음).

여러 용도로 두 개의 입력 값을 사용하는 것은 실제로 매우 사소한 일입니다. T 분기점을 사용하여 커넥터를 분리하면 두 분기를 따라 복제되므로 분할 및 모듈로를 위해 내장으로 별도로 공급할 수 있습니다.

실제로 솔루션을 구현하는 것보다 결과를 사용자에게 표시하는 방법을 알아내는 데 실제로 두 배가 걸렸습니다.

또한 Funciton에는 divmod가 내장되어 ÷%있으며 재미있는 기능이 내장 ÷되어 %있으며 내 솔루션 사용은로 구현 됩니다 ÷% . 그러나 f위의 기능 은 완전히 동일 하지 않습니다 ÷%. 입력 순서를 바꿔야했지만 변경하기 쉬운 것처럼 보이지만 지금까지 바이트 수를 늘리지 않고는 할 수 없었습니다. .


10

자바 스크립트 (ES6), 17 바이트

1 바이트를 골라 낸 @Arnauld 덕분에

x=>y=>[x/y|0,x%y]

형식 (x) (y)로 입력을받습니다.

비트 단위로 x / y의 플로어를 얻거나
x % y로 나머지를 가져
옵니다. 두 값을 모두 배열에 넣어 둘 다 반환 될 수 있도록합니다.

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


10

APL (Dyalog) , 5 바이트

@ngn 덕분에 -2 바이트

⌊÷,|⍨

이것은 포크 (3 트레인)의 상단 (2 트레인)이며, 상단의 오른쪽 타인은 파생 된 함수 (연산자가 함수에 적용한 결과)입니다.

       result 
         ↑┌──────────┐
         ││    ┌────┐│┌──────┐ (derived function)
         │↓        ↓│↓      │╱
       ┌───┐ ┌───┐ ┌───┐ ╔═══╤═══╗
           ÷   ,   |    
       └───┘ └───┘ └───┘ ╚═══╧═══╝
                              
left argument ┴─────────────────┘  (operator)
                └─────────┴ right argument

 바닥

÷ 분할

, 에 catenated

|
 교환 된 인수를 갖는  나눗셈 나머지 (APL 계수는 "뒤로")

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


멋진 다이어그램을 어떻게 만들었습니까?
emiflake

2
@WolfgangTS Painstakingly. Dyalog APL에는 암묵적 기능의 기본 트리 다이어그램을 만들 수있는 기능이 있습니다. 온라인으로 사용해보십시오! 나는 그것으로 시작했습니다 ...
Adám

굉장히 어려워 보입니다. 나는 두려운 인내심이 없습니다, 하하
emiflake

더 짧은 :⌊÷,|⍨
ngn

@ngn 아야, 당신이 나를 얻었다. 당신이 아직 여기 있다는 것을 알게되어 기쁩니다.
Adám


7

MATL , 12 10 바이트

Qt:ie=&fhq

입력은 a다음 b. 출력은 나머지이고 몫입니다.

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

설명

이것은 모듈로와 나눗셈을 피합니다. 대신 배열 재구성을 사용합니다 .

  1. a+10이 아닌 요소 의 배열을 만듭니다.
  2. b행 의 2D 배열로 재구성하십시오. 필요한 경우 자동으로 0으로 채워집니다.
  3. 0이 아닌 마지막 항목의 마이너스-행 및 열 인덱스 1는 각각 나머지 및 몫입니다.

예를 들어 고려 a=7, b=3.

Q    % Input a implicitly. Push a+1
     % STACK: 8
t:   % Duplicate. Range from 1 to that
     % STACK: 8, [1 2 3 4 5 6 7 8]
ie   % Input b. Reshape as a matrix with b rows (in column major order)
     % STACK: 8, [1 4 7;
                  2 5 8]
                  3 6 0]
=    % Compare for equality
     % STACK: [0 0 0;
               0 0 1;
               0 0 0]
&f   % Row and column indices (1-based) of nonzero element
     % STACK: 2, 3
hq   % Concatenate. Subtract 1. Implicitly display
     % STACK: [1 2]

2
이것은 측면 사고, 훌륭한 일의 훌륭한 예입니다!
Leo

6

Mathematica, 20 18 바이트

⌊#/#2⌋@Mod@##&

유연한 출력 규칙의 사소한 악용 : 결과는로 표시되며 div[mod]평가되지 않습니다. 각각의 숫자가 추출 될 수 result[[0]]result[[1]].

그리고 어이없는 이름의 built-in보다 1 바이트 만 길었습니다 QuotientRemainder.

Mathematica는 실제로 여러 함수를 동일한 입력에 적용 할 수있는 깔끔한 방법이 있지만 3 바이트가 더 깁니다.

Through@*{Quotient,Mod}

1
당신은 언어가 단순히 빌트인을 결합한 빌트인을 만들 때 나쁘다는 것을 알고 있습니다…
Fatalize

1
@ 운명입니다? divmod 내장 기능이 매우 유용하다는 것을 알았습니다. Mathematica는 언어를 가진 유일한 언어는 아닙니다.
Martin Ender

8
@ Fatalize, 나머지를 계산하는 데 필요한 몫을 계산하려면 동일한 작업이 많이 필요합니다. 두 결과를 모두 사용하는 경우 올바르게 설계된 quotRem내장 기능을 통해 통화 시간 quotrem개별 시간을 크게 절약 할 수 있습니다 .
Julian Wolf

6

05AB1E , 5 바이트

÷²¹%‚

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

05AB1E에는 버그가 있으므로 암시 적 입력이 작동하지 않습니다. ( Emigna 는 입력이 종종 반대 방향으로 밀린 다고 언급했습니다.


5 바이트에 대해 ÷ ²¹ %) 를 수행 할 수 있습니다.
Emigna

@Emigna 나는 그것이 유효하다면 몰라요. 잠깐, 어떻게 작동 했습니까?
Outgolfer Erik

1
왜 유효하지 않은지 모르겠습니다. 암시 적 입력이 이와 같은 경우에 가정 한 것과 반대 순서로 스택에 푸시되기 때문에 작동합니다.
Emigna

@Emigna 나는 인수를 되돌릴 수 있는지 OP에게 물었다.
Outgolfer Erik

2
내가 가지고 You may choose any format you like for both input and output, as long as the two numbers are clearly distinguishable당신이 입력은 다음과 같이 촬영 결정할 수 있다는 것을 의미한다 divisor, dividend. divisor, dividend답에 "입력은"으로 지정 하면됩니다. 명확하게 구분됩니다.)
Emigna

6

해파리 , 14 바이트

p
m
,|S
% i
Ei

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

설명

해파리는 동일한 입력에 여러 기능을 적용 할 때 아름다운 언어입니다. 언어는 2D이며 모든 이진 함수는 한 입력에서는 남쪽으로, 다른 입력에서는 동쪽으로 보입니다. 따라서 서쪽과 북쪽에서 하나의 값에 접근하면 코드에서 값을 복제하지 않고도 두 함수에 값을 공급할 수 있습니다.

i프로그램이 시작될 때 프로그램의 두 입력 값으로 대체된다. 이제 %부서입니다. 그것은 동쪽에서 직접 하나의 입력을 취하고 남쪽으로 갈 때 E동쪽으로 검색을 리디렉션합니다. 따라서 두 입력 모두 %인수로 제공됩니다.

| 기본적으로 동일한 기능을 수행하는 모듈로의 내장 기능이지만, 두 가지 모두 풋에서 남쪽을 찾는다.

두 결과를와 쌍으로 연결합니다 ,. 그런 다음 m플로어 함수 ( %부동 소수점 나누기 이므로 필요 )가 마지막으로로 결과를 인쇄합니다 p.


6

Cubix , 12 13 바이트

;W@o,I|\S%;O

다음 큐브에 어떤 맵이

    ; W
    @ o
, I | \ S % ; O
. . . . . . . .
    . .
    . .

여기 사용해보십시오

실행 된 단계에 대한 설명
,I|I,-수퍼 플로어 정수 나누기로 시작하고, 입력에서 첫 번째 정수를 가져오고, 다시 반영하여 입력에서 다음 정수를 가져오고 다시 나눕니다
O;.-정수 나누기의 결과를 출력하고 팝합니다
%. 이 작업은 나중에 수행 할 수 있지만 여기서 끝났습니다
S\o.-스택에 공간 문자 추가, 공간 재 지정 및 출력
W;-왼쪽으로 이동하여 스택에서 공간 팝
O|@-이전에 계산 된 모드를 출력하고 수평 반사기를 통과 한 후 정지합니다.


2 분만 줘 좋은 대답입니다!
Luke

@Luke 고마워, 내가 또 하나를 얻을 수 있다고 생각했지만 애매한
MickyT

6

Brain-Flak , 56 54 바이트

({}<>)<>([()]{()<(({})){({}[()])<>}{}>}<><([{}()]{})>)

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

Wheat Wizard 덕분에 -2 바이트

설명

Brain-Flak에서 현재 가장 잘 알려진 정수 나누기모듈로 는 매우 유사합니다 (사실 현재 사용되는 정수 나누기는 내가 feersum 의 모듈로 에서 수정 한 것입니다 ).

모듈로와 정수 나누기의 비교 :
Modulo:   ({}(<>))<>     {   (({})){({}[()])<>}{} }{}<> ([{}()]{})
Division: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><  {}   {} >)

편리하게, 정수 나누기 프로그램은 데이터를 저장하기 위해 세 번째 스택 만 사용하고 모듈로 프로그램은 데이터를 저장하기 위해 일반 두 스택 만 사용합니다. 따라서 단순히 두 가지를 동시에 실행하면 서로 충돌하지 않습니다.

모듈로와 정수 나누기의 조합 :
Modulo:   ({}(<>))<>     {   (({})){({}[()])<>}{} }{}<> ([{}()]{})
Division: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><  {}   {} >)

Combined: ({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><([{}()]{})>)

마지막으로,이 조합에 사용 된 정수 나누기와 모듈로 프로그램은 스택 정리 (스택에 쓰레기를 남기지 말고 입력 이외의 스택에 존재하지 않는 값에 의존하지 않음)하도록 설계되었지만 반드시 그럴 필요는 없습니다. 이 문제에 대해. 따라서 우리는 메인 루프의 끝에서 0을 채우는 것을 귀찮게하지 않고 시작에서 0을 누르지 않고 다른 2 바이트를 절약 할 수 있으며 대신 스택 맨 아래의 0 패딩에 의존합니다.

이것은 우리에게 최종 프로그램을 제공합니다 :
({}<>)<>([()]{()<(({})){({}[()])<>}{}>}<><([{}()]{})>)

정수 나누기 프로그램에 대한 설명은 feersum 's answer를 참조하십시오.

정수 부서 설명 곧 출시 예정 ...


5

자바 8, 18 바이트

(a,b)->a/b+","+a%b

이것은 유형의 람다 식입니다 BiFunction<Integer, Integer, String>.

놀랍습니다 ... 이것은 실제로 Java에 대해 상당히 간결한 솔루션입니다. 람다 식으로 가십시오!


5

뇌 플랙 , 168 (148) 110 바이트

Wiki를 먼저 확인해야한다고 생각합니다

(({})(<({}(<(({})<>)>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>)>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{}<>)

체재:

Input:    Output:
A (18)    remainder (2)
B (4)     division  (4)

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

(({})(<           # Copy A
({}(<             # Pick up A
(({})<>)          # Copy B to the other stack
>))               # Put A on top of a 0 on the second stack
                  # At this point the stacks look like this:   A
                                                               0
                                                             B B
                                                               ^

<>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>) # Positive division from the wiki
>))                                          # Put down A on top of a 0
                                             # The stack now: A
                                                              0
                                                            Div B
                                                              ^

<>{(({})){({}[()])<>}{}}{}<>([{}()]{}<>)     # Modulo from the wiki


5

sed, 36 바이트

35 바이트의 코드, -r플래그의 경우 +1

:a;s/^(1+)( 1*)\1/\1\2x/;ta;s/.* //

공백이없는 단항으로 입력을받습니다. 몫은 1s로, 나머지는 xs로 두 번째 로 단항으로 출력 합니다. (이것이 허용되지 않으면 알려주세요 1. 입력과 같이 공백으로 구분하여 변경하겠습니다 .)

설명

:a;                                  Define label a
   s/            /     /;            Perform this substitution:
     ^(1+)                           Match the first unary number...
          ( 1*)                      ... followed by a space and 0 or more 1s...
               \1                    ... followed by the the first group again
                  \1\2x              Keep the first two parts unchanged; replace the third
                                     with an x
                         ta;         If the substitution succeeded, goto a
                            s/.* //  After the loop is over, remove the first number

5

Excel 2013, 31 30 26 바이트

=INT(A1/B1)&","&MOD(A1;B1)

설명

입력이 셀 A1B1있습니다. 이것은 단순히 나누기 및 나머지를위한 FLOORand MOD함수 의 반환 값을 반환합니다 . 이 값은 쉼표로 구분됩니다.


A1과 A2가 아닌 A1과 B1 셀을 의미한다고 생각합니다.
fəˈnɛtɪk

예, 고마워요 수정 됨
Luke

FLOOR(A1/B1;1)대신에 1 바이트를 절약하십시오QUOTIENT(A1;B1)
Engineer Toast

입력은 항상 자연수이므로 FLOOR(A1/B1;1)`INT (A1 / B1) '로 대체 하여 4 바이트를 더 절약 할 수 있습니다.
Wernisch



4

OIL , 134 106 103 102 바이트

개행으로 분리 된 두 숫자 인 stdin에서 입력을 가져옵니다. 정수 나누기의 결과, 줄 바꾸기 및 나머지를 출력합니다.

이것은 OIL이 나누기, 나머지, 덧셈, 뺄셈 등을위한 내장 기능이 없기 때문에 내가 작성한 가장 복잡한 OIL 프로그램 중 하나입니다. 분할을 수행하는 기본 방법 인 반복 중첩 감소와 함께 작동합니다.

스크립트 언어 스타일의 주석과 함께 주석이 달린 형식으로 코드를 제공합니다. 실행하기 전에 주석을 제거해야합니다.

5  # read input into lines 0 and 2

5
2
0  # the zero to compare to (nops)
1  # make a backup of the second input at line 3
2
3
10 # check if the second input is 0. %
4
2
24 # if so, jump to 24 (marked with §)
13 # else, go on
10 # check if the first input is zero &
4

31 # if so, jump to 31 (marked with $)
18 # else, go on
9  # decrement both numbers

9
2
6  # jump to line 8 (marked with %)
8
8  # increment the value in line 1 (initially a zero) §
1
1  # "restore the backup"
3
2
6  # jump to line 13 (marked with &)
13
10 # is the second number zero? $
4
2
42 # if so, jump to 42 (marked with +)
36 # else go on
9  # decrement both the second number and the backup
2
9
3
6  # jump to 31 (marked with $)
31
4  # print the division +
1
11 # a newline
4
3  # and the remainder (from the backup)

편집 : "상수"를 한 자리 위치 (참조 할 바이트가 아닌)로 이동하여 3 바이트를 더 깎은 다음 2 개의 0 위치를 암시합니다 (대신 빈 줄을 사용하여 하나를 수행 할 수 있음) 전에).

편집 : 초기 0을 암시 적으로 만들어 다른 바이트. 실제로 하나의 리터럴 0 만 있으면됩니다.


훌륭한 일! 그게 바로 내가이 도전받을 희망 대답의 종류 : 그냥 참고 : 당신은 당신이 0으로 나누기를 검사 할 필요가 없습니다 제수는 항상 엄격하게 긍정적 인 것이라고 보장)
레오

@Leo 나는 제수가 항상 처음에 엄격하게 긍정적임을 보장합니다 . 나눗셈을 0으로 나누면 작동하지 않습니다.이 경우 "실제"분할이 정상적인 경우에도 발생할 수 있습니다. 올바르게 기억하면 나머지가 0 일 때 발생합니다.
L3viathan

12 행의 점검이 아닌 4 행의 점검에 대해 이야기하고 있습니다 ... 프로그램 시작시 한 번만 실행되지 않습니까?
Leo

@Leo Done, 거의 30 자 미만, 감사합니다!
L3viathan

4

레티 나 , 14 바이트

입 / 출력 형식을 남용합시다!

(.*)¶(\1)*
$#2

b\na하나의 비 숫자, 개행 문자가 아닌 단수를 위해 단항 으로 입력을로 받습니다. 입력과 같은 문자를 사용하여 몫을 10 진수로 출력 한 다음 나머지를 단항으로 출력합니다.

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

(.*) ¶(\1)*첫 번째 숫자와 일치하고 개행 (¶은 \ n에 대한 Retina의 축약 형임)과 일치하며 첫 번째 숫자는 다시 여러 번 가능합니다. 두 번째 그룹의 일치 횟수는 나눗셈의 결과이며 일치하지 않은 부분은 나머지입니다.

을 사용 $#2하여 이전 줄에서 일치 한 모든 항목을 두 번째 그룹의 캡처 수로 바꾸고 결과를 얻습니다.


하하, 그렇습니다. 저녁 늦게 프로그램을 작성해서는 안됩니다.
FryAmTheEggman

4

ArnoldC , 286 283 바이트

HEY CHRISTMAS TREE c
YOU SET US UP 0
HEY CHRISTMAS TREE d
YOU SET US UP 0 
GET TO THE CHOPPER c
HERE IS MY INVITATION a
HE HAD TO SPLIT b
ENOUGH TALK
GET TO THE CHOPPER d
HERE IS MY INVITATION a
I LET HIM GO b
ENOUGH TALK
TALK TO THE HAND c
TALK TO THE HAND d
YOU HAVE BEEN TERMINATED

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

작동 원리

HEY CHRISTMAS TREE c      //DECLARE VARIABLE c = 0
YOU SET US UP 0
HEY CHRISTMAS TREE d      //DECLARE VARIABLE d = 0
YOU SET US UP 0

GET TO THE CHOPPER c      /*
HERE IS MY INVITATION a      SET c = a/b
HE HAD TO SPLIT b         
ENOUGH TALK                */

GET TO THE CHOPPER d      /*
HERE IS MY INVITATION a      SET d = a mod b
I LET HIM GO b
ENOUGH TALK                */

TALK TO THE HAND c        // PRINT c
TALK TO THE HAND d        // PRINT d
YOU HAVE BEEN TERMINATED  //END

출력 형식

a/b
a mod b

3

미로 , 11 바이트

?:?:}/!\{%!

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

설명

?:   Read a and duplicate.
?:   Read b and duplicate.
}    Move a copy of b over to the auxiliary stage.
/    Compute a/b.
!    Print it.
\    Print a linefeed.
{    Get back the other copy of b.
%    Compute a%b.
!    Print it.

그런 다음 IP는 막 다른 골목 %에 부딪쳐서 다시 실행 되면 0으로 나누려고 시도하여 프로그램이 종료 됩니다.



3

> <> , 27 26 16 + 1 = 17 바이트

:r:{%:n','o-$,n;

노트

  • 를 사용하여 입력 -v플래그를 하십시오 (예는 TIO 참조).
  • 나머지를 먼저 출력 한 다음 쉼표와 마지막으로 정수 나누기를 출력합니다.

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

설명

참고 스택으로 시작되는 A, BAB의 때문에, 제 1 및 제 2 입력을 나타내는 -v플래그를 사용 하였다.

:r:{%:n','o-$,n; # Explanation
:r:{             # Do some stack modifications to prepare it for
                 #    next part
                 #    (Stack: B, A, A, B)
    %            # Take the modulo of the top two items
                 #    (Stack: B, A, A%B)
     :           # Duplicate it
                 #    (Stack: B, A, A%B, A%B)
      n          # Pop once and output as number
                 #    (Stack: B, A, A%B)
       ','o      # Print separator
                 #    (Stack: B, A, A%B)
           -     # Subtract the modulo from the first input
                 #    (Stack: B, A-A%B)
            $,   # Swap the two inputs so they are back in order
                 #     and divide, so we get an integer
                 #    (Stack: floor(A/B))
              n; # Output that as a number and finish.

최대 255 개의 입력 값을 어떻게 제공 할 수 있습니까?
Leo

더 높은 ASCII / 유니 코드 값만 사용하십시오. 그렇게 į하면 255가됩니다.
Luke

Ok, nice :) 그건 그렇고, 명령 줄에서 -v 플래그로 직접 입력 번호를 얻는 것이 더 짧지 않습니까?
Leo

그것은 TIO에서 작동하도록 할 수 없었 으므로이 솔루션으로 해결했습니다. 8 바이트-1을 저장합니다 ( -v플래그의 경우).
Luke


3

C, 21 바이트

#define f(a,b)a/b,a%b

f (a, b)를 쉼표로 구분 된 2 개의 용어로 바꾸는 매크로입니다. 함수에 전달하는 것이 더 좋지만 2를 따로 선택할 방법이 없습니다.

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


3

하스켈 , 21 바이트

a#b=(div a b,mod a b)

온라인으로 사용해보십시오!사용법 예 : 13#2returns (6,1). 예, 이것은 꽤 지루하지만 조금 더 재미 있습니다divMod , 동일한 기능을하는 내장 있습니다.

우리가에있는 동안,도있다 quot, rem그리고 quotRem어떤은 자연수에 동일하게 동작 div, moddivMod. 그러나 음수 입력의 경우 결과 mod는 제수와 같은 부호를 갖지만 결과 는 피제수 rem와 동일한 부호를 갖습니다. 그것이 넣어대로 또는 서곡 문서 , quot0으로 잘립니다 정수 나누기이며, div음의 무한대를 향해립니다 부문의 정수입니다.


아니오 div또는 mod내장 기능은 어떻습니까?

빌드 인 없음, 36 32 31 바이트

a#b|a<b=(a,0)|m<-a-b=(+1)<$>m#b

온라인으로 사용해보십시오! 사용법 예 : 13#2returns (1,6), 즉 mod결과는 첫 번째이고 결과는 div두 번째입니다. 경우 a작은 b, 다음 a mod b입니다 aa div b입니다 0, 그래서 (a,0)반환됩니다. 그렇지 않으면 반복적으로 계산 mod하고 diva-bb, 추가1 분할 결과에 나머지를 유지한다.

나눗셈 결과에 1을 추가 <$>하는 것은 map목록을 통해 함수를 매핑 하는 데 일반적으로 사용 되지만 튜플에서도 작동하지만을 사용하여 수행되지만 함수는 두 번째 튜플 요소에만 적용됩니다.

편집 : xnor 덕분에 1 바이트를 절약했습니다!


2
두 번째 솔루션은 <$>튜플을 사용하여 두 번째 요소에 작용 하여 바이트를 면도 할 수 있습니다 a#b|a<b=(a,0)|m<-a-b=(+1)<$>m#b.
xnor

3

SWI 프롤로그, 109 바이트

p(A):-print(A).
d(F,S,0,F):-S>F.
d(F,S,D,R):-G is F-S,d(G,S,E,R),D is E+1.
d(F,S):-d(F,S,D,R),p(D),p(-),p(R).

산출:

?- d(255,25).
10-5
true .
?- d(5,7).
0-5
true .

기술:

내장 분할 또는 모듈로가없는 간단한 재귀 알고리즘. "두 번째 숫자를 첫 번째 숫자에 몇 번 맞추는가?" 나머지 (R)와 결과 (D로 통일)를보고합니다.

// 편집 : 불필요한 공간 제거


PPCG에 오신 것을 환영합니다! 나는 전에 Prolog를 사용한 적이 없지만 :-마지막 줄 에는 공백이 있지만 다른 줄 에는 공백이 없다는 것을 알았습니다 . 그들은 어떤 이유로 거기에 필요합니까? 필요한 공간이 없다고 제안 E + 1하면서도 마찬가지 F-S입니다.
Laikoni

Laikoni : 당신은 확실히 맞아! 방금 공백을 제거하고 최종 바이트 수를 업데이트했습니다.
Jan Drozen 2016 년


2

MATL, 5 바이트

/k&G\

MATL Online 에서 사용해보십시오 !

설명

        % Implicitly grab the two inputs as numbers
/       % Divide them
k       % Round down the result
&G      % Grab the two inputs again
\       % Compute the remainder

2

우로 보로스 , 15 바이트

r.r.@/Inao\%n1(

숫자를 역순으로 취합니다 (예 :) 10 42. 여기에서 시도하십시오.

설명

r.r.             Read a number, duplicate, read a number, duplicate
    @            Rotate a copy of the first number to the top of the stack
     /I          Divide and truncate to integer
       n         Output as number
        ao       Push 10 and output as character (newline)
          \%     Swap the remaining two values and take the mod
            n    Output as number
             1(  Push 1 and swallow that many characters from the end of the program,
                 halting execution
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.