Dolna część klepsydry

14

Wyzwanie:

Dane wejściowe: trzy liczby całkowite: długość dolnej krawędzi; początkowa ilość ziaren piasku; indeks

Wyjście: Wyświetla stan dolnej części klepsydry przy danym wskaźniku, na podstawie podanej długości dolnej krawędzi i ilości ziaren piasku.

Zasady konkursu:

  • Symulujemy ziarna piasku za pomocą cyfr 1-9
  • Pozostałą ilość ziaren piasku umieszczamy na górze pośrodku, a następnie jeden wybrany przez Ciebie znak (z wyłączeniem cyfr, białych znaków i nowych wierszy; tj. -) W wierszu poniżej
  • Kiedy klepsydra jest napełniana, wypełniamy ją w rzędzie, po jednej cyfrze na raz
  • Kiedy piasek może iść w lewo lub w prawo, ZAWSZE idziemy w prawo (to samo dotyczy równoważenia pozostałej ilości ziaren piasku powyżej klepsydry)
  • Kiedy osiągnęliśmy 9, jest wypełniona i nie możemy już zmieścić piasku w tym konkretnym miejscu klepsydry
  • Pozostała ilość ziaren piasku jest zawsze odpowiednio wyrównana
  • Gdy dolna połowa klepsydry zostanie całkowicie wypełniona lub ilość pozostawionych ziaren piasku osiągnie 0, nie możemy iść dalej, a to byłby wynik dla wszystkich indeksów poza tym punktem
  • Dozwolone jest zarówno indeksowanie 0, jak i indeksowanie 1, i proszę podać, czego użyłeś w swojej odpowiedzi.
  • Spacje końcowe i wiodące oraz pojedyncza spacja lub wiodąca nowa linia są opcjonalne
  • Możesz użyć dowolnego innego znaku zamiast zera, aby wypełnić puste miejsca w dolnej części klepsydry (z wyłączeniem cyfr, nowych wierszy lub znaku, którego użyłeś jako szyi), jeśli zdecydujesz się je wyświetlić.
  • Długość dolnej krawędzi zawsze będzie nieparzysta
  • Długość dolnej krawędzi będzie >= 3; i ilości ziaren piasku>= 0
  • Jeśli chcesz, możesz również wydrukować wszystkie stany do podanego indeksu włącznie
  • Możesz założyć, że indeks (0-indeksowany) nigdy nie będzie większy niż całkowita ilość ziaren piasku (więc gdy jest 100 ziaren piasku, indeks 100 jest maksymalnym prawidłowym wejściem indeksu).
  • Pierwszy indeks (0 dla 0-indeksowanych; 1 dla 1-indeksowanych) wyśle ​​pustą klepsydrę z ilością ziaren piasku nad nią.

Przykład: zdjęcia (lub ascii-art) mówią więcej niż tysiąc słów, więc oto przykład:

Wprowadź długość dolnej krawędzi: 5
Wprowadź ilość ziaren piasku:100
Zamiast bieżącego indeksu wyświetlam tutaj wszystkie kroki:

Dane wyjściowe dla wszystkich możliwych wskaźników o długości dolnej krawędzi 5i ilości ziaren piasku 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

Jako przykład:

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

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

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi odnoszą się standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe:

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
Kevin Cruijssen
źródło
1
Na 5,100,10000dlaczego 20+9+9+9+9+9+9+9+9+9 = 101?
Neil
@Neil Zmienię trochę reguły, aby indeks nigdy nie przekroczył sumy. Prawdopodobnie lepiej to zrozumieć.
Kevin Cruijssen
3
Powiązane
Laikoni
czy pierwsze wejście jest zawsze liczbą nieparzystą?
Brian H.
@BrianH. „ Długość dolnej krawędzi zawsze będzie nieparzysta ” Zdaję sobie sprawę, że mam trochę za dużo reguł w tym wyzwaniu, więc rozumiem, że przeczytałeś już to. :)
Kevin Cruijssen

Odpowiedzi:

3

05AB1E , 68 63 59 57 56 bajtów

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

Wypróbuj online!

Wyjaśnienie

IÅÉÅ9
Inicjujemy stos za pomocą listy 9.
Każda lista reprezentuje wiersz, więc długość każdej listy jest nieparzysta, a długość ostatniej listy jest równa pierwszej wartości wejściowej.
Wprowadzenie 5 spowoduje, że[[9], [9, 9, 9], [9, 9, 9, 9, 9]]

[DOO²Q#ćD_Piˆëć<¸«¸ì]
Następnie iterujemy te elementy, zmniejszając elementy listy, aż lista będzie się składać tylko z zer, a następnie przejdziemy do następnej. Zatrzymujemy się, gdy suma będzie równa drugiej wartości wejściowej.

[     #              ]   # 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

Teraz musimy posortować ostatnią listę symulującą usuwanie elementów z naprzemiennych boków zamiast od lewej do prawej, tak jak to robiliśmy.

ć                   # 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

Teraz poprawnie formatujemy dane wyjściowe

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
Emigna
źródło
Naprawdę? Czy to było skomplikowane?
Magic Octopus Urn
@MagicOctopusUrn: Serdecznie zapraszam do mnie outgolf :) Niektóre rzeczy związane z tą metodą stały się nieco nieporządne z powodu dziwactw językowych, których nie znalazłem lepszego rozwiązania. Może jest lepszy sposób? Może coś bardziej matematycznego?
Emigna
Myślałem o użyciu liczb binarnych w jakiś sposób ... nie wymyśliłem tego w pełni, nie miałem wolnej godziny.
Magic Octopus Urn
Minęło trochę czasu, odkąd próbowałem przechytrzyć jedno z twoich rozwiązań, które ma więcej niż 20 bajtów. Nie wstydzę się tego przyznać, ale kiedy widzę twoje odpowiedzi, zwykle nie marnuję czasu na szukanie ulepszeń; bo zwykle nie mogę znaleźć żadnego hah!
Magic Octopus Urn
@MagicOctopusUrn: Szkoda. Zwykle udaje ci się znaleźć ciekawe alternatywy (i / lub ulepszenia) do moich rozwiązań. Dużym programom w językach golfowych z pewnością trudniej jest poświęcić trochę czasu.
Emigna
5

Czysty , 305 289 bajtów

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))])

Wypróbuj online!

Obrzydliwe
źródło
1
@KevinCruijssen Naprawiono.
Οurous
1

Perl 5 , 301 bajtów

($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''}

Wypróbuj online!

Xcali
źródło
1

Węgiel , 68 63 62 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 5 bajtów, usuwając niepotrzebne teraz sprawdzanie zakresu indeksu. Wyjaśnienie:

NθNηNζ

Wprowadź długość do q, liczbę ziaren piasku hi indeks do z.

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

Pętlę nad (q+1)/2rzędami (od dołu do góry), następnie 9 ziaren w każdej komórce w rzędzie, a następnie zapętlić cyfry w rzędzie.

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

Przejdź do cyfry.

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

Jeśli to możliwe, rozprowadź ziarno piasku na tej cyfrze, zmniejszając ilość piasku i pozostałego wskaźnika. Jeśli minęliśmy indeks, nadal konwertuje spacje na zera, wypełniając klepsydrę. Cyfra jest drukowana w górę, ponieważ oznacza to, że kursor znajdzie się na szyi po ostatniej cyfrze.

↑-

Wydrukuj szyję.

M⊘⊖LIη←Iη

Wyśrodkuj i wydrukuj pozostałą ilość piasku.

Neil
źródło