Kum saatinin alt kısmı


14

Meydan okuma:

Girdi: Üç tamsayı: alt kenar uzunluğu; kum tanelerinin başlangıç ​​miktarı; indeks

Çıktı: Bir kum saatinin alt kısmının durumunu, verilen alt kenar uzunluğuna ve kum tanelerinin miktarına bağlı olarak, belirtilen dizinde çıktılar.

Zorluk kuralları:

  • 1-9 arasındaki rakamlarla kum tanelerini simüle ediyoruz
  • Şu anda kalan kum tanelerini, kendi seçiminizin tek bir karakterini (rakamlar, beyaz boşluklar ve yeni satırlar hariç; yani -) takip ederek ortadaki en üste yerleştiriyoruz.
  • Kum saati dolduğunda, her satıra birer birer dolduruyoruz
  • Kum sola veya sağa gidebiliyorsa, DAİMA sağa gidiyoruz (aynısı kumun kalan kum taneciklerinin saat camının üzerinde dengelenmesi için de geçerlidir)
  • 9'a ulaştığımızda dolu ve kum saatindeki o belirli yere daha fazla kum sığamıyoruz
  • Kalan kum taneleri de her zaman doğru şekilde hizalanır
  • Kum saatinin alt yarısı tamamen dolduğunda veya kalan kum tanesi miktarı 0'a ulaştığında, daha ileri gidemeyiz ve bu, bu noktanın ötesindeki tüm dizinler için çıktı olacaktır
  • Hem 0-endeksli hem de 1-endekslemeye izin verilir ve lütfen yanıtınızda ne kullandığınızı belirtin.
  • Sondaki ve önde gelen alanlar ve tek bir sondaki veya önde gelen yeni satır isteğe bağlıdır
  • Göstermeyi seçerseniz, kum saatinin alt kısmındaki boş alanları (rakamlar, yeni satırlar veya boyun olarak kullandığınız karakter hariç) doldurmak için sıfır yerine başka bir karakter kullanmanıza izin verilir.
  • Alt kenar uzunluğu her zaman garip olacaktır
  • Alt kenar uzunluğu >= 3; ve kum tanelerinin miktarları>= 0
  • İsterseniz, verilen dizine kadar ve bu dizini içeren tüm durumları yazdırmanıza izin verilir
  • (0 ile indekslenmiş) endeksin hiçbir zaman toplam kum tanesinden daha büyük olmayacağını varsayabilirsiniz (bu nedenle 100 kum tanesi olduğunda, 100 endeksi maksimum geçerli indeks girişi olur).
  • İlk indeks (0 indeksli için 0; 1 indeksli için 1), üzerinde kum taneleri olan boş bir kum saati verecektir.

Örnek: Resimler (veya ascii-art) binden fazla kelime söylüyor, işte bir örnek:

Giriş alt kenar uzunluğu: 5
Kum tanelerinin giriş miktarı: 100
Geçerli bir dizin yerine, tüm adımları burada görüntülerim:

Alt kenar uzunluğu 5ve kum tanesi miktarı olan tüm olası indeksler için çıktı 100:

 100
  -
  0
 000
00000

  99
  -
  0
 000
00100

  98
  -
  0
 000
00110

  97
  -
  0
 000
01110

  96
  -
  0
 000
01111

  95
  -
  0
 000
11111

  94
  -
  0
 000
11211

  93
  -
  0
 000
11221

  92
  -
  0
 000
12221

  91
  -
  0
 000
12222

  90
  -
  0
 000
22222

  89
  -
  0
 000
22322

  88
  -
  0
 000
22332

  87
  -
  0
 000
23332

  86
  -
  0
 000
23333

  85
  -
  0
 000
33333

  84
  -
  0
 000
33433

  83
  -
  0
 000
33443

  82
  -
  0
 000
34443

  81
  -
  0
 000
34444

  80
  -
  0
 000
44444

  79
  -
  0
 000
44544

  78
  -
  0
 000
44554

  77
  -
  0
 000
45554

  76
  -
  0
 000
45555

  75
  -
  0
 000
55555

  74
  -
  0
 000
55655

  73
  -
  0
 000
55665

  72
  -
  0
 000
56665

  71
  -
  0
 000
56666

  70
  -
  0
 000
66666

  69
  -
  0
 000
66766

  68
  -
  0
 000
66776

  67
  -
  0
 000
67776

  66
  -
  0
 000
67777

  65
  -
  0
 000
77777

  64
  -
  0
 000
77877

  63
  -
  0
 000
77887

  62
  -
  0
 000
78887

  61
  -
  0
 000
78888

  60
  -
  0
 000
88888

  59
  -
  0
 000
88988

  58
  -
  0
 000
88998

  57
  -
  0
 000
89998

  56
  -
  0
 000
89999

  55
  -
  0
 000
99999

  54
  -
  0
 010
99999

  53
  -
  0
 011
99999

  52
  -
  0
 111
99999

  51
  -
  0
 121
99999

  50
  -
  0
 122
99999

  49
  0
 222
99999

  48
  -
  0
 232
99999

  47
  -
  0
 233
99999

  46
  -
  0
 333
99999

  45
  -
  0
 343
99999

  44
  -
  0
 344
99999

  43
  -
  0
 444
99999

  42
  -
  0
 454
99999

  41
  -
  0
 455
99999

  40
  -
  0
 555
99999

  39
  -
  0
 565
99999

  38
  -
  0
 566
99999

  37
  -
  0
 666
99999

  36
  -
  0
 676
99999

  35
  -
  0
 677
99999

  34
  -
  0
 777
99999

  33
  -
  0
 787
99999

  32
  -
  0
 788
99999

  31
  -
  0
 888
99999

  30
  -
  0
 898
99999

  29
  -
  0
 899
99999

  28
  -
  0
 999
99999

  27
  -
  1
 999
99999

  26
  -
  2
 999
99999

  25
  -
  3
 999
99999

  24
  -
  4
 999
99999

  23
  -
  5
 999
99999

  22
  -
  6
 999
99999

  21
  -
  7
 999
99999

  20
  -
  8
 999
99999

  19
  -
  9
 999
99999

Örnek olarak:

inputs: 5,100,1
output:
  99
  -
  0
 000
00100

Same example with another valid output format:
  99
  ~
  . 
 ...
..1..

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyon / yöntemi uygun parametrelerle, tam programları kullanmanıza izin verilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, gerekirse bir açıklama ekleyin.

Test senaryoları:

INPUTS: bottom-edge length, amount of grains of sand, index (0-indexed)

inputs: 5,100,1
output:
  99
  -
  0
 000
00100

inputs: 5,100,24
output:
  76
  -
  0
 000
45555

inputs: 5,100,100
output:
  19
  -
  9
 999
99999

inputs: 5,10,15
output:
  0
  -
  0
 000
22222

inputs: 3,30,20
output:
 10
 -
 0
677

inputs: 3,3,0
 3
 -
 0
000

inputs: 9,250,100
   150
    -
    0
   000
  00000
 2333332
999999999

inputs: 9,225,220
    5
    -
    4
   999
  99999
 9999999
999999999

inputs: 13,1234567890,250
  1234567640
      -
      0
     000
    00000
   0000000
  344444443
 99999999999
9999999999999

inputs: 25,25,25
             0
             -
             0
            000
           00000
          0000000
         000000000
        00000000000
       0000000000000
      000000000000000
     00000000000000000
    0000000000000000000
   000000000000000000000
  00000000000000000000000
 1111111111111111111111111

1
For 5,100,10000neden yaptığını 20+9+9+9+9+9+9+9+9+9 = 101?
Neil

@Neil Dizin asla toplamın ötesine geçemeyecek şekilde kuralları biraz değiştireceğim. Muhtemelen anlamak daha iyidir.
Kevin Cruijssen


ilk giriş her zaman tek bir sayı mıdır?
Brian H.

@BrianH. " Alt kenar uzunluğu her zaman tuhaf olacak " Bu meydan okumada biraz fazla kuralım olduğunu fark ettim, böylece onu okuduğunuzu anlayabiliyorum. :)
Kevin Cruijssen

Yanıtlar:


3

05AB1E , 68 63 59 57 56 bayt

IÅÉÅ9[DOO²Q#ćD_Piˆëć<¸«¸ì]ćā<ΣÉ}2äćR¸ì˜è¸ì¯ìJDSOIα'-‚ì.C

Çevrimiçi deneyin!

açıklama

IÅÉÅ9
Yığını 9'luk bir liste ile başlatırız.
Her liste bir satırı temsil eder, böylece her listenin uzunluğu tek ve son listenin uzunluğu ilk girişe eşittir.
Bir giriş 5 neden olacaktır[[9], [9, 9, 9], [9, 9, 9, 9, 9]]

[DOO²Q#ćD_Piˆëć<¸«¸ì]
Daha sonra, liste yalnızca sıfırdan oluşup bir sonrakine geçene kadar bir listedeki azalan öğeleri listeler. Toplam toplam ikinci girdiye eşit olduğunda dururuz.

[     #              ]   # loop until
 DOO                     # the sum of the list of lists
    ²Q                   # equals the second input
        ć                # extract the first list
         D_Pi            # if the product of the logical negation of all elements is true
             ˆ           # add the list to the global list
              ë          # else
               ć<        # extract the head and decrement it
                 ¸«      # append it to the list
                   ¸ì    # and prepend the list to the list of lists

Şimdi, yaptığımız gibi soldan sağa değil, alternatif taraflardan elemanları kaldırma simüle eden son listeyi çıkarmamız gerekiyor.

ć                   # extract the row we need to sort
 ā<                 # push a list of indices of the elements [0 ... len(list)-1]
   ΣÉ}              # sort it by even-ness
      2äćR¸ì˜       # reverse the run of even numbers
                    # the resulting list will have 0 in the middle,
                      odd number increasing to the right and
                      even numbers increasing to the left
             è      # index into our final row with this
              ¸ì¯ì  # reattach all the rows to eachother

Şimdi çıktıyı doğru biçimlendiriyoruz

J              # join list of lists to list of strings
 DSOIα         # calculate the absolute difference of sum of our triangle and the 3rd input
      '-‚ì     # pair it with the string "-" and append to the list of rows
          .C   # join by newlines and center each row

Gerçekten mi? Bu karmaşık mıydı?
Sihirli Ahtapot Urn

@MagicOctopusUrn: Beni geride bırakmaya çok açıksınız :) Bu yöntemle ilgili bazı şeyler, daha iyi bir yol bulamadığım dil tuhaflıkları nedeniyle biraz dağınık hale geldi. Belki de daha iyi bir yol var mı? Belki daha matematiksel bir şey?
Emigna

İkili sayıları bir şekilde kullanmayı düşünüyordum ... tam olarak düşünmedim, boş bir saatim yoktu.
Sihirli Ahtapot Urn

20 bayttan fazla çözümlerinizden birini geçmeye çalıştığımdan beri bir süredir. İtiraf etmekten utanıyorum, ama cevaplarınızı gördüğümde genellikle artık iyileştirme bulmak için zaman harcamıyorum; çünkü genellikle hah bulamıyorum!
Sihirli Ahtapot Urn

@MagicOctopusUrn: Çok kötü. Genellikle çözümlerime ilginç alternatifler (ve / veya geliştirmeler) bulmayı başarırsınız. Golf dillerindeki büyük programların üzerinde çalışmak için zaman ayırmak kesinlikle daha zordur.
Emigna

5

Temiz , 305 289 bayt

import StdEnv
@[h:t]|all((==)9)h|t>[]=[h: @t]=[h]
#s=length h/2
#m=hd(sort h)+1
=[updateAt(hd[e\\e<-flatten[[s+i,s-i]\\i<-[0..s]]|h!!e<m])m h:t]
$a b c=flatlines(map(cjustify(a+1))[fromString(fromInt(b-c)),['-']:reverse(map(map(toChar o(+)48))((iterate@[repeatn(a-r)0\\r<-[0,2..a]])!!c))])

Çevrimiçi deneyin!


1
@KevinCruijssen Düzeltildi.
Οurous

1

Perl 5 , 301 bayt

($x,$t,$u)=<>;$s=$x;$t-=$g=$t>$u?$u:$t;while($s>0){@{$a[++$i]}=((0)x$s,($")x($x-$s));$a[$i][$_%$s]++for 0..($f=$g<$s*9?$g:$s*9)-1;$g-=$f;$s-=2}say$"x(($x-length($g+=$t))/2+.5),$g,$/,$"x($x/2),'-';while(@b=@{pop@a}){for($i=1;$i<@b;$i+=2){print$b[-$i]}print$b[0];for($i=1;$i<@b;$i+=2){print$b[$i]}say''}

Çevrimiçi deneyin!


1

Odun kömürü , 68 63 62 bayt

NθNηNζF⊘⊕θF⁹F⁻θ⊗ι«J⊘⎇﹪λ²⊕λ±λ±ι≔¬¬ζλ↑I⁺λIKK≧⁻λη≧⁻λζ»↑-M⊘⊖LIη←Iη

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Düzenleme: Şimdi gereksiz dizin aralığı denetimini kaldırarak 5 bayt kaydedildi. Açıklama:

NθNηNζ

Uzunluğu q, kum tanelerini hve indeksi girin z.

F⊘⊕θF⁹F⁻θ⊗ι«

(q+1)/2Satırların üstünden (alttan üste), sonra sıradaki her hücrede 9 tane, sonra sıradaki basamakların üzerinde döngü yapın.

J⊘⎇﹪λ²⊕λ±λ±ι

Rakama atla.

≔¬¬ζλ↑I⁺λIKK≧⁻λη≧⁻λζ»

Mümkünse, bir kum tanesi bu rakama dağıtarak kalan kum ve indeks miktarını azaltır. Dizini geçtiysek, bu yine de boşlukları kum saatini doldurarak sıfırlara dönüştürür. Rakam yukarı doğru yazdırılır, çünkü bu, imlecin son rakamdan sonra boyunda olacağı anlamına gelir.

↑-

Boynu yazdırın.

M⊘⊖LIη←Iη

Kalan kum miktarını ortalayın ve yazdırın.

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.