Hilbert'in İkili Oteli


18

Bu meydan okumada, iki özelliği yerine getiren herhangi bir işlevi (veya tam programı) uygulamanız istenecektir. Bu özellikler:

  • İşleviniz, negatif olmayan tamsayı katsayıları olan polinomlardan negatif olmayan tamsayılara kadar yerinde olmayan (tersinir) bir işlev olmalıdır. Bu, iki eşit olmayan girişin eşit bir çıkışla eşlenemeyeceği anlamına gelir.

  • Fonksiyonunuz girişinden çıkışına kadar olan toplam "bit" sayısını korumalıdır. Bu, polinomun her katsayısının 1 bitini sayarsanız, toplamlarının, çıktının ikili gösterimindeki 1 bit sayısıyla aynı olması gerektiği anlamına gelir. Örneğin ikiliktir 9, 1001bu yüzden 2 1biti vardır.


IO

Negatif olmayan bir tamsayı polinomu, negatif olmayan tamsayıların sonsuz bir listesiyle aynıdır, böylece belirli bir noktadan sonra tüm tamsayılar sıfır olur. Böylece, polinomlar ya sonsuz listelerle (bu muhtemelen istenmese de) ya da listenin bitiminden sonra örtük sıfırlar içeren sonlu listelerle temsil edilebilir.

Polinomlar ve sonlu listeler arasındaki temel ayrım, listenin sonuna sıfır eklenmesinin listeyi değiştirmesidir:

Listeler

Bir polinomun sonuna sıfır eklenirken değeri değişmez:

Polinomlar

Dolayısıyla, işleviniz girdi olarak bir polinomu temsil eden sonlu bir liste alıyorsa, sıfır eklemek sonucunu değiştirmemelidir.

Polinomları liste olarak temsil ederken, bunları sabit terimi temsil eden ilk veya son girişle temsil edebilirsiniz. Örneğin, aşağıdaki olasılıklardan birine sahip olabilirsiniz:

İleri veya geri

İlk durumda, listenin sonuna sıfırlar eklemek sonucu değiştirmemelidir; ikinci durumda, listenin önüne sıfırlar eklemek sonucu değiştirmemelidir.

Tabii eğer diliniz polinomları destekliyorsa, bunları girdi olarak alabilirsiniz.

Çıktı, herhangi bir standart yöntemle negatif olmayan bir tamsayı çıktısı olmalıdır.


Bu bu yüzden cevaplar bayt cinsinden puanlanacak, daha az bayt daha iyi olacak.


[]yoksa [0]geçerli bir girdi?
JungHwan Min

1
@JungHwanMin Evet, ikisi de sıfır polinom.
Rock Garf Hunter Post

Sıfırları bölmek için 1 koymak istediğinizi biliyorum, ancak bazı yollar işe yarayabilir ve o kadar iyi görünmüyor ...
l4m2

1
@ l4m2 Üzgünüm, ama yorumlarınızdan hiçbirini anlamıyorum. Sorunuz ilerledikçe, neye sıfırlar? Polinom, katsayılar? "Yazılı sıfırlar" ile ne demek istediğinden emin değilim.
Rock Garf Hunter Post

1
Görüntüler gerçekten gerekli mi (yani zengin metin kullanılarak temsil edilemezler) ??? Çünkü görüntüleri görme yeteneği olmayan insanlar meydan okumanızı bütünüyle göremezler.
Mindwin

Yanıtlar:


6

Jöle , 8 bayt

BFṢḄæ«ÆẸ

Çevrimiçi deneyin!

Sol ters, 5 bayt

Bċ0ÆE

Çevrimiçi deneyin!

Nasıl çalışır

BFṢḄæ«ÆẸ  Main link. Argument: A (array)

B         Binary; convert each integer in A to base 2.
 F        Flatten; concatenate the resulting binary arrays.
  Ṣ       Sort the resulting bit array.
   Ḅ      Convert from base 2 to integer, yielding an integer x with as much set
          bits as there are set bits in A.
      ÆẸ  Unexponents; convert A = [a1, a2, ...] to y = (p1**a1 + p2**a2 + ...),
          where pn is the n-th prime number.
          By the fundamental theorem of arithmetic, the resulting integer is unique
          for each array A without trailing zeroes.
    æ«    Bitshift left; compute x * 2**y.

6

Wolfram Dili (Mathematica) , 36 20 bayt

x#/.x->2^(#/.x->2)!&

Çevrimiçi deneyin!

Giriş olarak bir polinom f (x) alır. Y * f (y) 'yi değerlendirir; burada y = 2 ^ (f (2)!). Ne yazık ki, bu çıktıların oldukça büyük olduğu anlamına gelir.

Y * f (y) değerlerinin değerlendirilmesi, y, herhangi bir katsayıdan 2 daha büyük bir güç olduğunda, 1-bit sayısını koruyacaktır; bu, yukarıda seçilen değer için geçerlidir. Sonucu injektif yapmak için y = 2 ^ (f (2)!) Seçiyoruz:

  • Aynı y değerine sahip iki farklı giriş, farklı çıktılar verecektir çünkü temelde y tabanındaki iki farklı sayıyı okuyoruz.
  • K = f (2) ve dolayısıyla y'yi düzeltirsek, giriş k'ye eşit sabit bir polinom olduğunda en büyük y * f (y) değerine ulaşılır ve giriş, tabanı veren polinom olduğunda en büyük değere ulaşılır -2 k genişlemesi. İlk durumda, y * f (y) = 2 ^ (k!) * K ve ikinci durumda, y * f (y) <2 ^ (k! * Tavan (lg k)), ki bu daha az 2 ^ ((k + 1)!) * (k + 1).
  • Sonuç olarak, f (2) <g (2) olan iki f ve g polinomu için, f'den elde ettiğimiz tam sayı, g'den elde ettiğimiz tam sayıdan daha az olacaktır.

5

Wolfram Dili (Mathematica) , 61 bayt

Tr[2^((2#2-1)2^#)&@@@Position[Reverse/@#~IntegerDigits~2,1]]&

Çevrimiçi deneyin!

İki pozitif tam sayı, tek bir pozitif tam sayı ile eşlenebilir. Izin a, bvermek iki pozitif tamsayı olmak. O zaman a, b -> (2a - 1) 2^(b-1)NxN'den N'ye bir bijection olur.

Bu işlev herkesin konumunu bulur 1 , girişteki bitlerin (1'lerin bulunduğu yerden) her bir konuma yukarıdaki haritanın yalnızca iç içe bir varyantını uygular. Daha sonra, elde edilen her sayı ikisinin gücüne yükseltilir ve tüm sayılar birlikte eklenir (bu, bir NxN -> N haritası uyguladığımızdan beri tamamdır).

Örneğin:

{1, 2, 3}
{{1}, {1, 0}, {1, 1}}             (* Convert to binary *)
{{1}, {0, 1}, {1, 1}}             (* Reverse each *)
{{1, 1}, {2, 2}, {3, 1}, {3, 2}}  (* Position of 1s *)
{2, 12, 8, 24}                    (* Inject to N *)
{4, 4096, 256, 16777216}          (* Raise to the power of 2 *)
16781572                          (* Add *)

Ters fonksiyon (124 bayt)

##+#&~Fold~#&@*Reverse/@Normal@SparseArray[{Log2[j=#~BitAnd~-#],(#/j+1)/2}->1&@@@(Reverse[#~IntegerDigits~2]~Position~1-1)]&

İşte enjektiviteyi test etmek için ters bir fonksiyon.

Çevrimiçi deneyin!


5

Piton 2 , 118 117 114 103 100 bayt

Jonathan Frech tarafından 100 bayt:

a=input()
while a[0]<1:a.pop(0)
y="".join("2"+bin(v)[2:]for v in a)
print~-2**y.count("1")<<int(y,3)

Çevrimiçi deneyin!

Golf imkanı ile 103 bayt 1

a=input()
while a[0]<1:a.pop(0)
x="".join(map(bin,a))
print~-(1<<x.count("1"))<<int(x.replace(*"b2"),3)

Çevrimiçi deneyin!

Jonathan Frech sayesinde -15 bayt

Öncelikle "bitler" i ve daha sonra üçlü bir sayı olarak yorumlanan dizinin tekli gösterimini içeren bir sayı oluşturur.

Üçlü sayı, sayıları ikili dizelere ( 0bNNN) dönüştürüp ardından ile değiştirerek boluşturulur 2.

1 Bunun yerine 14-bayt'ı baz-12 numarasına çevirerek kurtarabilirdim, ama TIO'nun belleği tükendi, bu yüzden kullanmaya karar verdim.



1

05AB1E , 14 bayt

gÅpImPoIbS{2β*

Çevrimiçi deneyin!

Dennis 'Jelly çözeltisi ile aynı sonuçları verir, ancak teknik biraz farklıdır.

Nasıl?

Girdiyi deneyelim [1, 2, 3]:

gÅpImPoIbS{2β* | Full program.
               | STACK: [[1, 2, 3]]
               |
g              | Push the length.
               | STACK: [3]
 Åp            | Generate the first N primes.
               | STACK: [[2, 3, 5]]
   Im          | Push the input, and apply pairwise exponentiation.
               | STACK: [2, 9, 125]
     P         | Push the product.
               | STACK: 2250
      o        | Push 2 ** N.
               | STACK: 2 ** 2250 (way too large)
       Ib      | Push the input and convert to binary.
               | STACK: [2 ** 2250, ['1', '10', '11']].
         S{    | Sort all the characters.
               | STACK: [2 ** 2250, ['0', '1', '1', '1', '1']]
           2β  | Convert from binary.
               | STACK: [2 ** 2250, 15]
             * | Multiplication.
               | STACK: [2 ** 2250 * 15]
               | Implicitly print the top of the stack (2 ** 2250 * 15).


0

JavaScript 6, 96 83 Bayt

x=>(t=x.map(k=>(x[0]+=k)&&2+k.toString(2)).join``).replace(/0|2/g,'')+'0'.repeat(t)

ikili ifade verir

([1,2]) => 3*2^21210(Decimal)
([0,1,2]) => 3*2^21210
([1,2,0]) => 3*2^2121020
([1,2,3,4]) => 31*2^212102112100(Threotically)

sıfır, sıfırı temsil eden boş bir dizeye yol açar
l4m2

replace(/0|2/g,0)da görünüyor, ama kodunu çözmek daha zor
l4m2

Emin değilim x=>(t=x.map(k=>(x[0]+=k)&&2+k.toString(2)).join``).replace(/2/g,'0'.repeat(t)). İyi hissediyorum ama kanıtlayamıyorum
l4m2
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.