N-Boyutlu Vektörleri Numaralandırma


17

Pozitif bir tamsayı k > 1ve negatif olmayan bir tamsayı verildiğinde i, negatif olmayan tamsayıların bir k-tülü (veya k-boyutlu vektörü) üretilir . Her için k, ℕ için ℕ gelen harita k , bijective olmalıdır . Yani, her girdi ifarklı bir demet üretmeli ve olası her demet bir girdi tarafından üretilmelidir i.

STDIN (veya en yakın alternatif), komut satırı bağımsız değişkeni veya işlev bağımsız değişkeni ile girdi alarak ve sonucu STDOUT (veya en yakın alternatif), işlev dönüş değeri veya işlev (çıkış) parametresi aracılığıyla çıktı alarak bir program veya işlev yazabilirsiniz.

Çıktı için uygun, açık, düz liste biçimini kullanabilirsiniz.

Çözümünüz yapay sınırlar getirmemelidir kve idilinizin yerel tamsayı boyutuna uyduğunu varsayabilirsiniz. En azından, 255yerel tamsayı boyutunuz bundan daha küçük olsa bile değerleri desteklemelisiniz .

Herhangi biri için 1 < k < 32, kodunuz birkaç saniye içinde bir sonuç üretmelidir (elbette, cevabınız önceki kural nedeniyle bu kadar büyük desteklemiyorsa , sınır buna göre ayarlanır). Bu hiçbir sorun olmalıdır: o 2 kadar çalışır, öyle ki bu sorunu çözmeye mümkün 128 birkaç saniye içinde, ancak sınır aslında yinelerler gelen önlemek cevaplara yoktur için sonuç bulmayı.i < 231i0i

Lütfen yanıtınıza seçtiğiniz eşlemenin bir açıklamasını ve neden iki yönlü olduğuna dair bir gerekçe ekleyin (bunun resmi bir kanıt olması gerekmez).

Bu kod golf, en kısa cevap (bayt cinsinden) kazanır.

İlgili Zorluklar

Yanıtlar:


5

Pyth, 15 12 bayt

ms+0_%Q>_zdQ

Test odası

Dönüşümüm xnor'lardan birine benzer, ancak taban 10'da. Giriş k ayrı sayılara çıkartılarak çalışır:

n = 21003034
k = 3

21003034
 1  3  4    134
2  0  3     203
  0  0        0

Sayılar, en sağdaki basamağın azalan konumunda sıralanır, böylece herhangi bir sayı grubunun tüm sıralamaları mümkündür.

Kodun çalışması, girdiyi tersine çevirip son 0, 1, ... k-1haneleri dilimledikten sonra her bir kbasamağı alır, tekrar tersine çevirir 0, başlangıçta a yapıştırır ve int'e dönüştürürüz.


4

CJam, 20 bayt

q~({4b2fmd2/z2fb~p}*

Bu cevaptan eşleme uyguladığından eşleme iki yönlüdür k - 1 kez .

Program girişi olarak okur i k. CJam yorumlayıcısında çevrimiçi deneyin .

Fikir

F (i) 'yi aşağıdaki gibi tanımlayarak f : N → N2 iki yönlü bir harita oluşturabiliriz :

  • Dönüştürme i ikilik basamak diziye.

  • Tek sayıda basamak varsa bu diziye 0 ekleyin .

  • Ortaya çıkan diziyi deinterleave işlemi sırasında yenilerini oluşturur.

  • Bu dizileri taban 2'den tamsayıya dönüştürün. F 1 (i) ve f'yi tanımlayınSonuç olarak 2 (i).

İki yönlü bir harita elde etmek için g: N → N3 , g (n): = (f 1 (i), f 1 (f 2 (i)), f 2 (f 2 (i))).

Bir örten eşleme elde etmek için h: N → N 4 biz tanımlayabilir h: (i) = (g 1 (i), g 2 (i) f 1 (g 3 (i)), f 2 (g 3 ( i))) .

Yukarıdaki sürece devam ederek, sonunda iki yönlü bir haritaya ulaşıyoruz N → N k .

kod

q~      e# Read and evaluate all input. This pushes i and k.
({      e# Do k-1 times:
  4b    e#   Convert the integer on the stack (initially i) to base 4.
  2fmd  e#   Replace each base-4 digit d by d/2 and d%2.
  2/    e#   Split into the chunks [d/2 d%2].
  z     e#   Transpose. This collects all quotients in one array and all
        e#   residues in another one.
  2fb   e#   Convert each array from base 2 to integer.
  ~     e#   Dump both integers on the stack.
  p     e#   Print the topmost one.
}*      e#

xnor'ın fikri de 20 bayt verir (veya benden daha iyi golf yaparsanız daha az): q~2bW%1$Te]/zWf%2fbp(ters giriş sırası)
Martin Ender

3

CJam, 18 bayt

q~({)2bW%_1#p))b}*

Daha aptal bir formül kullanır.

Burada deneyin .

açıklama

q~          e# Read input.
({          e# Repeat k-1 times:
    )       e# Increment the current integer (initially i), to make it positive.
    2b      e# Convert to binary.
    W%      e# Reverse the binary.
            e# The result can be any non-empty binary string without trailing 0s.
    _1#     e# Find the position of the first 1, or the number of initial 0s.
    p       e# Print.
    )       e# Extract the final bit, which is always 1.
            e# An array that can be any binary string is left in the stack.
    )       e# Increment the 1 to make it 2.
    b       e# Convert the binary string to a number using base 2.
            e# Only the number of initial 0s doesn't affect the result,
            e# which is exactly what is printed before.
}*          e# The final integer is printed automatically when the program ends.

Özetle, pozitif bir tamsayıyı şuna eşler:

  1. Sondaki sıfır sayısı.
  2. Sondaki sıfırlar kaldırılmış, ters çevrilmiş ve sondaki (başlangıçta başlangıç) 1 olan orijinal tam sayı kaldırılmıştır.

3

Python 2, 62

lambda z,k:[int('0'+bin(z)[~i:1:-k][::-1],2)for i in range(k)]

Bu kod çirkin ve golf edilebilir, ancak fikir çok basit.

Paketleyin kher okuyarak birine ikili genişletmeler kfarklı uzaklıklar inci basamak. Örneğin k=3, giriş şununla 357eşleşir (3,0,7):

101100101 <- 357
  1  0  1 -> 5
 0  0  0  -> 0
1  1  1   -> 7

Sayıları bir araya getirmek tersine çevirir, bu bir bijection. Bunu yaparken, ikili açılımları sonsuz sayıda önde gelen sıfıra sahip olarak düşünün.


3

J, 38 28 27 bayt

(({.,g^:_1@}.)g=:_ q:>:)~<:

Bu, i ve k'yi sol ve sağ argümanlar olarak alan örtük, ikili bir fiildir . J.js ile çevrimiçi deneyin .

Fikir

Bir harita tanımlayan N → N: f k tarafından = (α: f: (i) 1 , ... α k-1 , s 1 α k ... s 2 α k + 1 - 1 ...) , ⟨p n olduğu asal sayıların sırası ve i + 1 = p 1 α 1 p 2 α 2 .

Temel Aritmetik teoremi, harita ile gr N → K Q ile tanımlanan g: (i) = (α 1 , α 2 , ...) (asal çarpanlarına üsler i + 1 örten bir).

Yana f (i) = (g 1 (i) ... g k-1 (i), g -1 (g K (l), G , k + 1 (i) ...)) , harita f olarak örten bir iyi.

kod

                            Left argument: i -- Right argument: k
                         <: Decerement k.
(                      )~   Reverse the order of the arguments and apply the
                            dyadic verb inside the parentheses to k-1 and i.
              g=:            Define a monadic helper verb g:
                     >:       Increment its right argument.
                 _ q:         Calculate the exponents of the prime factorization.
                             (implicit) Apply g to i.
(            )               Apply the dyadic verb inside the parentheses to k-1
                             and (g i).
           }.                 Drop the first k-1 elements of (g i)...
          @                   and...
     g^:_1                    apply the inverse of g to the result.
  {.                          Take the first k-1 elements of (g i).
    ,                         Append the rightmost result to the leftmost one.

İşleviniz neden iki yönlü?
xnor

@xnor En azından açıklamamdan biri değildi, çünkü yanlışlıkla birkaç endeksi değiştirmiştim. Bir kanıt taslağı ekledim.
Dennis

1

Python 2, 72

q=lambda z:z and z%2+2*q(z/4)
g=lambda z,k:1/k*[z]or[q(z)]+g(q(z/2),k-1)

İşlev q, sondan başlayarak her ikinci biti alarak ikili sayılar üzerinde işlem yapar. Sonuç olarak q(z), q(z>>1), ikili basamakları vermek için kesişen iki sayı verir z. Örneğin 594, 12 ve 17'ye ayrılır.

1001010010   <- 594
 0 1 1 0 0   ->  12
1 0 0 0 1    ->  17

Bu bir bijection çünkü orijinal numarayı kurtarmak için sayıları bir araya getirebiliriz.

İşlev , gbu bijeksiyon k-1sürelerini tek bir elemandan bir çifte, üçe ... kbire doğru genişletir. Her seferinde, son öğe iki öğeye genişletilir. Bu, girişi bijeksiyon yoluyla bir çiftle eşleyerek, çıktının ilk girişi için çiftin ilk elemanını alarak k-1ve geri kalan girişleri üretmek için fonksiyonu ikinci elemanına tekrar tekrar uygulayarak tekrarlamalı olarak yapılır.


Bu yolu çok karmaşık hale getirdiğimi fark ettim ...
xnor
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.