Osuwiska
W tym wyzwaniu Twoim zadaniem jest przewidzieć zakres szkód spowodowanych przez ogromne osuwiska. Używamy do tego następującego uproszczonego dwuwymiarowego modelu, parametryzowanego przez wysokość początkową h >= 0
i współczynnik krytyczny c > 0
. Zaczynasz od klifu wysokości h
i zakłada się, że teren jest całkowicie płaski nieskończenie po lewej i po prawej stronie. Dla h = 6
, jak wygląda sytuacja w tym:
##########
##########
##########
##########
##########
##########
-----------------------
Są -
to nieruchome podłoże skalne i #
niestabilna gleba. Jeśli różnica wysokości między dwiema sąsiednimi kolumnami jest większa niż c
, następuje osunięcie się ziemi : górne c
jednostki gleby z lewej kolumny spadają do następnych c
kolumn po prawej, po jednej do każdej. Najbardziej wysunięta na prawo niepusta kolumna na rysunku jest niestabilna c = 2
, więc następuje osunięcie się ziemi:
#########
#########
##########
##########
##########
############
-----------------------
Kolumna jest nadal niestabilna, co powoduje drugie osunięcie się ziemi:
#########
#########
#########
#########
############
############
-----------------------
Teraz kolumna po jego lewej stronie stała się niestabilna, dlatego zostaje tam wywołane nowe osunięcie się ziemi:
########
########
#########
###########
############
############
-----------------------
Po tym klif znów jest stabilny. Zaletą tego modelu jest to, że kolejność przetwarzania osuwisk nie ma znaczenia: wynik końcowy jest taki sam.
Zadanie
Twój program otrzymuje parametry całkowite h
i c
jako dane wejściowe (kolejność nie ma znaczenia, ale musisz podać go w odpowiedzi) i powinien on wypisać całkowitą liczbę kolumn , na które ma wpływ osuwisko. Oznacza to liczbę kolumn w powstałym stabilnym klifie, którego wysokość jest ściśle pomiędzy 0
a h
. W powyższym przykładzie poprawne wyjście to 4
.
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
Są one podane w formacie h c -> output
.
0 2 -> 0
2 3 -> 0
6 2 -> 4
6 6 -> 0
10 1 -> 10
15 1 -> 14
15 2 -> 11
15 3 -> 6
40 5 -> 16
80 5 -> 28
80 10 -> 17
CJam - 70
Wypróbuj na http://cjam.aditsu.net/
Wyjaśnienie:
h
Operator sprawdza ostatnią wartość na stosie bez usuwania go. Jeśli wystąpił osunięcie się ziemi, wartością jest tablica klifowa, która przyjmuje wartość true, ponieważ nie jest pusta. Jeśli nie, ostatnia wartość to 0 (fałsz).Tak więc w przypadku osuwiska pętla jest kontynuowana z tablicą na stosie, w przeciwnym razie kończy się z 0 wciśniętym za tablicą. To 0 jest następnie usuwane z tablicy przez następnego
-
operatora.źródło
Python,
200190174Wersja rozszerzona:
Edycja: Po pewnej optymalizacji wyeliminowałem nieporęczne zakończenie pętli przez przerwanie (oszczędza 1 bajt). Zmieniono także slajd z opartego na wycinku na oparty na pętli.
źródło
sum
na 2 bajty. Zazwyczaj lepiej jest zdefiniować pełny program w Pythonie, przyjmując dane wejścioweh,c=input()
i wypisując wynik na końcu.sum
Można zapisać jeden:sum(h>i>0for i in q)
.c=0
zapisuje bajt (nie mogę skomentować twojej odpowiedzi).Python 2 -
194158 bajtów(Zauważ, że interpreter przeceny SE przekształca dosłowne tabulatory na 4 spacje. Linie 7 i 8 tego programu mają tylko jedną tabulację [tj. Jeden bajt] wcięcia.)
h
Najpierw pobiera dane wejściowe na standardowe wejście . Na przykład:Ten program przeszedł wiele ulepszeń. Edytowałem tę odpowiedź, aby wyjaśnić niektóre z ważniejszych zmian, ale robiła się dość długa. Możesz sprawdzić historię edycji, jeśli jesteś ciekawy.
Wyjaśnienie
Po pierwsze,
h
ic
są odczytywane ze standardowego wejścia. W Pythonie 2input()
jest równoważneeval(raw_input())
i dlatego proszę o przecinek oddzielający liczby.input()
daje zwrot krotki ints, konwersja nie jest wymagana.Następnie tworzona jest lista liczb całkowitych. To jest
2*h
długie Pierwsza połowa to,h
a druga połowa to 0. Nie mam żadnego uzasadnienia, aby wykazać, że to wystarczy, aby zasymulować nieskończoneh
s po lewej i 0 po prawej. Po prostu natknąłem się na to i działa dla wszystkich przypadków testowych, więc jeśli ktoś może znaleźć dane wejściowe, to nie działa, chętnie to zmienię. W każdym razie ta lista jest wywoływanal
, ale wywoływana jest inna jej kopiab
.b
wartość nie ma znaczenia, liczy się tylko to, że jest prawdą. Niepusta lista jest prawdziwa, a jedynym sposobem nab
opróżnienie jest tuh
0, w którym to przypadku poprawna odpowiedź jest nadal drukowana. W każdym innym przypadkub
musi być prawdomówna, aby zapewnić, że wejdziemy wwhile b:
pętlę. Jednak pierwszą rzeczą, która dzieje się w pętli, jest ustawienieb
na 0, wartość falsey. Podczas każdego powtórzenia pętlab
musi być specjalnie ustawiona z powrotem na prawdę, inaczej pętla się zakończy.Reszta pętli to rzeczywista symulacja. Jest to bardzo naiwne, w zasadzie jest to tłumaczenie kodu opisu problemu. Jeśli jakikolwiek element
l
jestc
większy niż element następujący po nim, jest odejmowany przez,c
a kolejnec
elementy mają 1 dodany do nich. (Nawiasem mówiąci+1+j
, zastosowana tutaj magia bitowa jest po prostu krótszym sposobem pisania .) Podczas dokonywania tych transformacjib
jest ustawiona na 1. Za pierwszym razem, gdy żadne transformacje nie zostaną wykonane,b
pozostanie 0 i pętla się zakończy.Każde prawdziwe wyrażenie ocenia na
True
, a kiedy próbujesz wykonać matematykę,True
to ocenia na 1. To samo dotyczy wartościFalse
0. 0. Ostatni wiersz programu używa każdego elementul
jake
w wyrażeniuh>e>0
i sumuje wynik. Daje to liczbę kolumn większą niż 0, ale niższą niż pierwotna wysokość klifu, czyli o wartość, o którą pyta pytanie. Jest drukowany i program kończy pracę.źródło
c-=c
równoważne zc=0
?i+1+j
można zapisać jakoi-~j
Haskell,
163156151 bajtówZastosowanie:
h#c
np.6#2
Które wyjścia4
.Jak to działa: funkcja pomocnika
s
wykonuje pojedyncze osunięcie się ziemi. Powtarzaj,s
dopóki dane wyjściowe już się nie zmienią. Policz dotknięte elementy.Znaleziono funkcję „stosuj, aż dane wyjściowe się nie zmienią” (tj.
until=<<((==)=<<)
) W Stackoverflow .źródło
f
jako infix (h#c=...
) i przenoszącwhere
klauzulę do tej samej linii. Poza tym wciąż jest kilka nawiasów do zrzucenia$
, chociaż nie jestem pewien, ile ...()
go$
to dla mnie ślad i błąd.Mathematica,
1081041009795Stosowanie:
Przykład:
źródło
C #
303295To działa!
Ale to jest ....
Muszę znaleźć nowy język;)
Sprawdzę to CJam ...
Ulepszony:
źródło
int z=i;int y=i-1;
może byćint z=i,y=i-1;
. Tefor
pętle nie są skomplikowane rzeczy z ich indeksów, więc na przykładfor(int i=s.Count-1;i>0;i--)
może byćfor(int i=s.Count;--i>0;)
.1<0
jest krótszym sposobem pisaniafalse
. Podejrzewam, żeif(s[s.Count-1]>0)s.Add(0);
może stracić ten stan bez wpływu na poprawność, po prostu szybkość.