Sandpile tam sayıları


18

Meydan okuma

nGirdi olarak size pozitif bir tam sayı verilecektir . Çıktı, aşağıda belirtilen kurallar üzerine inşa edilmiş piramit benzeri bir kum havuzu olmalıdır:

  • Her bir tamsayı, aynı başlangıç ​​başlangıç ​​noktasından aşağıya doğru düşer, örneğin kum, konal şekle düşer.
  • Kum yığınına çarptığında doğrudan altındaki sayıdan büyük sayılar, mümkünse sağa düşecektir.
  • Kum yığınına çarptığında doğrudan altındaki sayıdan daha küçük sayılar, mümkünse sola doğru düşecektir.
  • Kumullara çarptığında doğrudan altındaki sayıya eşit sayılar yerinde kalacaktır.
  • Rakamlar aşağı ve sola / sağa hareket edebildikleri takdirde sola / sağa düşebilirler. Yani, zaten aşağıya ve sola / sağa bir sayı varsa, yöne bağlı olarak, o anda düşen sayı hareket etmez.
  • Bir sayı, bir sonraki konumuna hareket ettirilinceye veya zemine çarpıncaya kadar kum yığınını aşağı indirmeye devam edecektir.

notlar

İlk karşılaştırma kontrolü, kum havuzunu yuvarladığı için birbirini izleyen her karşılaşma için değil, yalnızca ilk karşılaşılan tam sayı için geçerlidir.

Sondaki boşluklar iyi ancak sondaki yeni satırlar iyi değil.

Kumulun yapısını korumak için gereken yerler dışında, önde gelen boşluklar veya yeni çizgiler yoktur.

Tam bir program veya işlev yazabilirsiniz.

Girişin yalnızca bir kombinasyon içereceğini varsayabilirsiniz [0-9].

Bu , bayt cinsinden en kısa kod Mart Ides tarafından kazanan olarak işaretlenir

Örnekler

1

1


12345

35
124


54321

 13
245


555444333222111

    2
    2
    2
  135
 1345
13445


111222333444555

4
4
4
135
1235
12235


7313623030872935273465247457435345345350

    3
    3
    3
    3
    34
    355
    3644
   239475
  201277445
020373685575

555444333222111bu üçüncünün 4birinciye bırakılacağı bir hata 4mı?
andlrc

@ dev-null sayıları 'düşmeye' devam edecek, eğer hatırlayabildikleri sürece, daha büyük / daha az / eşit kontrol sadece ilk karşılaşma için geçerlidir.
CzarMatt

Yanıtlar:


4

JavaScript (ES6), 260 208 bayt

s=>[...s].map(c=>a[g(n,(c>(l=a[n].slice(-1)))-(c<l))]+=c,n=s.length,a=Array(n+n).fill(''),g=(i,d)=>a[i].length>a[i+d].length?g(i+d,d):n)&&[...a[n]].map((_,i)=>a.map(c=>c?c[i]||' ':c).join``).reverse().join`\n`

Düzenleme: İlk karakterin özel bir durum olmadığını fark ederek 25 bayt kaydetti. Karakter dizisi dizeleri yerine dizeler dizisi kullanılarak 15 bayt kaydedildi. Değişmez \n(gösterilmiyor) kullanımı da dahil olmak üzere çeşitli düzeltmelerde 12 bayt kaydedildi . Bu% 20 daha kısa! Ben kurtulmak istedim reversemaliyetleri ancak daha Sonra can daha kurtardı değiştirerek mapile replace.

Ungolfed:

function sandpile(str) {
    var arr = new Array(str.length * 2); // max width of sandpile is approx. 2√n but this is close enough
    for (i = 0; i < arr.length; i++) arr[i] = '';
    for (i = 0; i < str.length; i++) {
        var digit = str[i];
        var pos = str.length; // start dropping here
        if (digit < str[pos][str[pos].length - 1]) {
            while (str[pos - 1].length < str[pos].length) pos--;
        } else if (digit > str[pos][str[pos].length - 1]) {
            while (str[pos + 1].length < str[pos].length) pos++;
        }
        str[pos] += digit; // drop the digit
    }
    var len = arr[str.length].length; // final height
    // remove the unused columns, and then pad the columns with spaces for the transpose
    for (i = 0; i < arr.length; ) {
        if (!arr[i]) arr.splice(i, 1);
        else arr[i++] += ' '.repeat(len);
    }
    ans = '';
    for (i = len; i-- > 0; ) {
        for (j = 0; j < arr.length; j++) ans += arr[j][i];
        ans += '\n';
    }
    return ans;
}
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.