g (f (x)) artarken f (g (x)) azalır


42

Bu zorluk için tamsayılara f ve g olarak iki fonksiyon uygulamanız gerekir ; öyle ki f ∘ g kesinlikle azalan bir fonksiyondur, g ∘ f ise kesinlikle artan bir fonksiyondur. Başka bir deyişle, iki tamsayı a <b alırsanız , o zaman f (g (a))> f (g (b)) ve g (f (a)) <g (f (b)) . Her biri bir tamsayıya bir tamsayıya eşlemek zorunda olmaları dışında , f ve g üzerinde bireysel olarak herhangi bir kısıtlama yoktur .

Lütfen f ve g'nin kısa bir açıklamasını ve neden gerekli özelliğe sahip olduklarına dair bir argüman ekleyin .

Kredi: Bu meydan okuma, 2011 Romanya Matematik Ustası yarışmasında (aynı şeyi soran ancak tamsayılar yerine gerçek sayılara ilişkin) bir sorundan ilham aldı. Eğer gerçekten spoiler istiyorsanız, şimdi ne arayacağınızı biliyorsunuz.

kurallar

  • Bu meydan okumadaki "fonksiyon" kelimesi, bir tamsayıyı diğerine eşleme matematiksel anlamında kullanılmalıdır: iki program veya iki fonksiyon yazabilir ve her zamanki gibi girdi alma ve çıktı sağlama standart yöntemlerinden herhangi birini kullanabilirsiniz . Gerçek tamsayı değişkenleri yerine tamsayıların dize temsillerini kullanabilirsiniz, ancak girdi ve çıktı türleri aynı olmalıdır, böylece işlevler arasında türleri elle dönüştürmeden oluşturulabilir. Kavramsal olarak, f ve g'nin functions işlevi olması gerektiğine dikkat edin, bu nedenle aynı sayının iki farklı dize gösterimini veya bunun gibi bir şey kullanarak hile yapamazsınız.

  • Unutmayın ki , isimleri kendi kendine veya tanımladığınız başka bir işlev için gerekli olmadıkça , işlevlerin adsız olabileceğini unutmayın . İşlevlerin birini veya her ikisini de isimlendirirseniz, aynı programda olduklarını varsayabilir, böylece uygulamalarında birbirlerine atıfta bulunabilirler (örneğin def f(x): return -g(x)Python'da).

  • Her zamanki tamsayı taşması kuralları geçerlidir: çözümünüz, tüm tam sayıların varsayılan olarak sınırsız olduğu, ancak programınız uygulama nedeniyle uygulamada başarısız olursa, dilinizin varsayımsal (veya belki de gerçek) bir sürümünde rasgele büyük tam sayılarda çalışabilmelidir. Bu kadar büyük tamsayıları desteklememek, çözümü geçersiz kılmak değildir.

  • Herhangi bir programlama dilini kullanabilirsiniz , ancak bu boşlukların varsayılan olarak yasak olduğunu unutmayın .

  • Bu , yani puanınız her iki fonksiyonun bayt sayısının toplamıdır ve en kısa geçerli cevap kazanır.


İşlevler bir dize döndürür mü?
Matthew Roh

@SIGSEGV Evet derdim, ancak yalnızca girdi olarak bir dize alırlarsa, herhangi bir tür dönüştürme eklemek zorunda kalmadan oluşturulabilirler.
Martin Ender

Kahretsin, diğer işlevi sonuçları daha fazla düzenleyememek için dizgeye dönüştürmeyi denedim.
Matthew Roh

1
@ Doğrulaştırın. Her biri ℤ → ℤ tipinde bir fonksiyon olmalıdır.
Martin Ender

1
@Bijan hem olumlu hem de olumsuz.
Martin Ender

Yanıtlar:


18

Python, 68 karakter

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, negatif sayıları tek sayılara, pozitif sayıları çift sayılara ve hatta sayıları pozitif sayılara ve tek sayıları eksi sayılara eşleştirir, çıktı büyüklüğü giriş büyüklüğü ile kesinlikle artar.

g, aynı şekilde negatif sayıları çift sayılarla ve pozitif sayıları tek sayılarla eşleştirmesi dışında da yapar.

f ∘ g negatif → hatta → pozitif ve pozitif → tek → negatif olarak eşleştirir.
g ∘ f negatif → tek → negatif ve pozitif → çift → pozitif olarak eşler.

Bu nedenle f ve g istenen özelliklere sahiptir.


2
fve gadlandırılmamış işlevler olabilir, böylece dört bayt bırakabilirsiniz.
Martin Ender

(1-x%2*2)Birkaç bayt kaydetmek için değişken olarak tanımlayabilirsiniz .
OldBunny2800

İşte oynamak için tam bir kod Okunabilirlik için satır beslemeleri ile 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(); değiştirebilirsiniz ;.
Stéphane Gourichon

16

Python , 40 bayt

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

Çevrimiçi deneyin! Bazı çıktılar tam sayılara eşit olan değişkenlerdir çünkü (-1)**(-3)örneğin bir değişkendir .

Peter Taylor'ın fikirlerine dayanıyor . İşlev, ftek sayıları yok sayar ve hatta değişmeyenleri bırakır. İşlev gaynı şeyi yapar, ardından monotonik parite değiştirme haritasını uygular x -> 3*x + 1.

Yana f(f(x)) = x, biz var g(f(x)) = 3*f(f(x))+1 = 3*x+1artmaktadır.

Zira f(g(x)) = f(3*f(x)+1), fikir iç ve dış fifadelerden birinin işaretin tamamen düşmesidir.

  • Hatta x, f(x) = xama garip f(3*x+1) = -3*x-1çünkü 3*x+1.
  • Garip için x, f(x) = -xve f(-3*x+1) = -3*x+1çünkü -3*x+1hatta olduğunu.

Artık sadece çift ve tek girişlerin azalan bir şekilde araya girmesine ihtiyacımız var, çünkü -3*x±1bu, işaretlerin nasıl seçildiğine bakılmaksızın azaldığı için geçerli. Bu yüzden 3*gerekli.

Bir Haskell portu 25 bayttır:

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

Çevrimiçi deneyin!


Haskell'de (^)tamsayı üstelidir.
user1502040

1
@ user1502040 Negatif üsleri kaldıramaz.
xnor

1
Eğer demeyeceğiz beri gkendini bunu isimsiz yaparak iki bayt kaydedebilirsiniz.
Martin Ender

14

CJam (17 bayt)

F işlevi ( FCJam yalnızca büyük harf adlarına izin verdiği için adlandırılmış):

{W1$2b,#*}:F

İşlev g (anonim):

{F2*}

Çevrimiçi demo

Bu, tartışmasız bir hata olan CJam'ın uygulama detayına güvenerek bir bayt tasarrufu sağlar: temel dönüşümler yaparken mutlak değer kullanır. 2b,bu nedenle, argümanının mutlak değerindeki bit sayısını verir, bu nedenle, mutlak değeri tek bir bit sayısına sahip olan sayıları kesin olarak reddeder. g f 'yi uygular ve sonra iki katına çıkar (bit sayısının paritesini değiştirir).

Yani f uygulayarak ve daha sonra g yaprakları değişmeden imzalamak ve çiftler, haritalama xiçin 2x. G uygulamak ve daha sonra f eşleştirmeyi yalnızca bir kez işaretini değiştirir ve çiftler xiçin -2x.


Güzel, bu tam olarak bu rekabetten sağlanan referans çözüm. (Sanırım bağımsız olarak
Martin Ender

@ Martininder, bu sorunu daha önce bir yerde gördüm. Muhtemelen matematikte.
Peter Taylor

2

Pyth, 34 Bayt

Bu Python cevabımın doğrudan çevirisidir.

*-1*2%Q2+*2*QQ<Q0
*-1*2%Q2+*2*QQ>Q0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.