f (g (x))는 감소하고 g (f (x))는 증가합니다


42

이 문제를 해결하려면 정수에 fg 라는 두 가지 함수를 구현해야 합니다. f f g 는 엄격하게 감소하는 함수 이고 g∘ f 는 엄격하게 증가하는 함수입니다. 즉, 어떤 두개의 정수를 취할 경우 <B A를 한 후, F (g (a))> F (g (b))g (F (a)) <g (F (b)) . fg 는 각각 하나의 정수를 다른 정수에 매핑해야한다는 점을 제외하고는 개별적으로 제한이 없습니다 .

fg에 대한 간단한 설명 과 필수 속성을 갖는 이유에 대한 인수를 포함하십시오.

학점 : 이 도전은 2011 루마니아 수학 석사 경쟁의 문제에서 영감을 얻었습니다 (정수 대신 실제 숫자를 요구합니다). 스포일러를 정말로 원한다면 무엇을 검색해야하는지 알게되었습니다.

규칙

  • 이 문제에서 "함수"라는 단어는 수학적으로 하나의 정수를 다른 정수에 매핑한다는 의미에서 취해야합니다. 두 개의 프로그램 또는 두 개의 함수를 작성 하고 평소와 같이 입력을 수신하고 출력 하는 표준 방법 을 사용할 수 있습니다. 실제 정수 변수 대신 정수의 문자열 표현을 사용할 수 있지만 입력과 출력의 유형은 동일해야하므로 유형을 수동으로 변환하지 않고도 함수를 구성 할 수 있습니다. 개념적으로 fg는 여전히 ℤ의 함수 여야하므로 같은 숫자 또는 이와 유사한 두 개의 다른 문자열 표현을 사용하여 속임수를 쓸 수는 없습니다.

  • 기억 기능 이름이있을 수 있습니다 자신의 이름을 자체 또는 사용자가 정의한 다른 기능에 의해 필요하지 않은만큼. 함수 중 하나 또는 둘 모두의 이름을 지정하는 경우, 함수가 동일한 프로그램에 존재한다고 가정하여 구현시 서로 참조 할 수 있습니다 (예 : def f(x): return -g(x)Python).

  • 일반적인 정수 오버플로 규칙이 적용됩니다. 솔루션은 기본적으로 모든 정수가 바인딩되지 않은 가상의 (또는 아마도 실제) 버전의 언어에서 임의로 큰 정수를 사용할 수 있어야하지만 구현으로 인해 프로그램이 실제로 실패하는 경우 큰 정수를 지원하지 않으면 솔루션이 무효화되지 않습니다.

  • 모든 프로그래밍 언어를 사용할 수 있지만 이러한 허점 은 기본적으로 금지되어 있습니다.

  • 이것은 이므로 점수는 두 함수 의 바이트 수 와 가장 짧은 유효한 답변 의 합계입니다 .


함수가 문자열을 반환 할 수 있습니까?
Matthew Roh

@SIGSEGV 예라고 대답하지만 문자열을 입력으로 사용하는 경우에만 유형 변환을 삽입하지 않고도 구성 할 수 있습니다.
Martin Ender

Aww darnit, 다른 함수가 결과를 더 이상 편집 할 수 없도록 문자열로 변환하려고했습니다.
Matthew Roh

1
@Fatalize 올바름. 각각은 ℤ → ℤ 유형의 기능이어야합니다.
Martin Ender

1
@ Bijan 긍정적이고 부정적인 모두.
Martin Ender

답변:


18

파이썬, 68 자

f=lambda x:(1-x%2*2)*(2*x*x+(x<0))
g=lambda x:(1-x%2*2)*(2*x*x+(x>0))

f는 음수를 홀수로, 양수를 짝수로, 짝수를 양수로, 홀수를 음수로 매핑하며, 출력 크기는 입력 크기에 따라 엄격하게 증가합니다.

g는 음수를 짝수로, 양수를 홀수로 매핑한다는 점을 제외하고는 동일합니다.

f ∘ g는 음수 → 짝수 → 양수 및 양수 → 홀수 → 음수입니다.
g ∘ f는 음수 → 홀수 → 음수 및 양수 → 짝수 → 양수입니다.

따라서 f와 g는 원하는 속성을 갖습니다.


2
f그리고 g익명의 기능을 할 수있다, 그래서 당신은 4 바이트를 놓을 수 있습니다.
Martin Ender

(1-x%2*2)몇 바이트를 저장하는 변수로 정의 할 수 있습니다 .
OldBunny2800

다음은 사용할 수있는 완전한 코드 입니다. 가독성을 위해 줄 바꿈으로 import numpy as np; import matplotlib.pyplot as plt; xrange=np.arange(-3,4); f=lambda x:(1-x%2*2)*(2*x*x+(x<0)); g=lambda x:(1-x%2*2)*(2*x*x+(x>0)); plt.plot(xrange, map(f, xrange), 'ro'); plt.plot(xrange, map(g, xrange), 'go'); plt.plot(xrange, map(f, map(g, xrange)), 'b--'); plt.plot(xrange, map(g, map(f, xrange)), 'y--'); plt.show(); 바꿀 수 있습니다 ;.
Stéphane Gourichon

16

파이썬 , 40 바이트

f=lambda x:x*(-1)**x
g=lambda x:3*f(x)+1

온라인으로 사용해보십시오! 일부 출력은 (-1)**(-3)예를 들어 부동 소수점을 제공 하기 때문에 정수와 동일한 부동 소수점입니다.

Peter Taylor의 아이디어를 기반으로합니다 . 이 함수는 f홀수를 무시하고 짝수도 변경하지 않습니다. 이 함수 g는 동일한 작업을 수행 한 다음 단조 패리티 전환 맵을 적용합니다 x -> 3*x + 1.

이후 f(f(x)) = x, 우리는 한 g(f(x)) = 3*f(f(x))+1 = 3*x+1증가.

에 대한 f(g(x)) = f(3*f(x)+1)아이디어는 내부 및 외부 f플립 기호 중 정확히 하나가 감소하여 감소한다는 것입니다.

  • 심지어를 들어 x, f(x) = x하지만 f(3*x+1) = -3*x-1때문에이 3*x+1이상하다.
  • 홀수 x, f(x) = -xf(-3*x+1) = -3*x+1때문에 -3*x+1짝수입니다.

우리는 이제 짝수 및 홀수 입력 만 감소하는 방식으로 인터리브를 필요로합니다 -3*x±1. 이는 부호가 어떻게 선택되는지에 관계없이 감소 하기 때문 입니다. 이것이 3*필요한 이유 입니다.

Haskell 포트는 25 바이트입니다.

f x=x*(-1)**x
g x=1+3*f x

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


Haskell에서 (^)정수 지수입니다.
user1502040

1
@ user1502040 음수 지수를 처리 할 수 ​​없습니다.
xnor

1
g자신을 호출하지 않으므로 이름을 지정 하지 않고 2 바이트를 절약 할 수 있습니다.
Martin Ender

14

CJam (17 바이트)

기능 f ( FCJam은 대문자 만 허용하므로 이름 이 지정됨) :

{W1$2b,#*}:F

기능 g (익명) :

{F2*}

온라인 데모

CJam의 구현 세부 사항에 의존하여 바이트를 절약합니다. 이는 아마도 버그입니다. 기본 변환을 수행 할 때 절대 값을 사용합니다. 2b,따라서 인수의 절대 값에 비트 수를 제공하므로 f는 절대 값에 홀수 비트가있는 숫자를 정확하게 무효화합니다. g는 f를 적용한 다음 두 배가됩니다 (비트 수의 패리티 변경).

따라서 f를 적용한 다음 g를 적용하면 부호가 변경되지 않고 두 배가되어에 매핑 x됩니다 2x. g와 f를 적용하면 부호가 정확히 한 번 바뀌고 두 배가되어에 매핑 x됩니다 -2x.


니스, 이것은 이것이 경쟁에서 제공된 참조 솔루션입니다. (나는 당신이 독립적으로 그것을했다 가정?)
마틴 엔더

@ MartinEnder, 나는이 문제를 어딘가에서 보았습니다. 아마도 수학 SE에 관한 것입니다.
피터 테일러

2

피쓰, 34 바이트

이것은 내 파이썬 답변을 직접 번역 한 것입니다.

*-1*2%Q2+*2*QQ<Q0
*-1*2%Q2+*2*QQ>Q0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.