W poprzednim wyzwaniu dla kodu poprosiłem cię o napisanie funkcji, która poinformuje cię, która z linii została usunięta.
Instrukcje były:
Napisz funkcję zawierającą pięć wierszy.
Jeśli uruchomisz funkcję taką, jaka jest, powinna zwrócić 0.
Jeśli usuniesz jeden z pięciu wierszy i uruchomisz funkcję, powinna ona powiedzieć, która z linii została usunięta (np. Jeśli usuniesz ostatnią linię, powinna ona zwrócić 5).
Spróbujmy teraz czegoś nieco trudniejszego.
Postępuj zgodnie z tymi samymi zasadami, co powyżej, ale tym razem funkcja powinna zwrócić tablicę informującą, które DWIE wiersze zostały usunięte.
Na przykład, jeśli usunę linie 1 i 5, wartość zwracana powinna wynosić [1,5], a jeśli usunę linie 3 i 4, wartość zwracana powinna wynosić [3,4].
Ponownie, jeśli żadne linie nie zostaną usunięte, funkcja powinna zwrócić 0. Punkty bonusowe, jeśli możesz również obsłużyć przypadek usunięty z jednej linii, ale nie jest to absolutnie konieczne.
Czy umiesz korzystać z funkcji pomocniczych? Tak, ale tylko jeśli musisz. Idealna jest pojedyncza, niezależna funkcja, która to umożliwia.
Podobnie jak w przypadku ostatniego wyzwania, wygrywa najwyżej ocenione rozwiązanie. Wybiorę zwycięzcę za tydzień lub wcześniej, jeśli nie otrzymamy nowych zgłoszeń w ciągu 24 godzin.
źródło
Odpowiedzi:
Perl
To faktycznie działa na dowolną liczbę usuniętych linii (o ile nie wszystkie linie, to znaczy) i może być trywialnie przedłużone do więcej niż 5 linii. Nie są używane żadne funkcje pomocnicze, a nawet używa tylko jednej instrukcji w wierszu. Opiera się na fakcie, że przy braku wyraźnego
return
instrukcji zwracana wartość funkcji Perl jest wartością ostatniej instrukcji w niej zawartej.Zauważ, że (w kontekście listy) ten kod zwraca pustą listę zamiast liczby 0, jeśli nie zostały usunięte żadne wiersze. Można to naprawić (np. Dodając „
@a ? @a : 0;
” do ostatniego wiersza), ale sprawi, że kod będzie brzydszy. W każdym przypadku, w skalarnego kontekście nie zwróci ilość usuniętych linii, która będzie wynosić 0, jeśli żadne linie zostały usunięte. ;-)źródło
Rubin
Podobne do wersji Perla, ale w Rubim. Zwracam 0, jeśli żadne wiersze nie są usuwane zgodnie z żądaniem, ale zgadzam się, że kod jest brzydszy i nie ma sensu jako wartość zwracana.
Jeśli pusta tablica jest akceptowana jako wartość zwracana, gdy nie zostaną usunięte żadne wiersze, kod wygląda następująco:
Obie metody działają dla dowolnej liczby linii usuniętych między 0 a 5.
źródło
JavaScript, 152 znaki w golfa
Gra w golfa:
Samodzielny (ale brzydki):
Zasadniczo wykorzystuje funkcję
toString
, numerując każdą linię. Pamiętaj, że z tego powodu musisz usunąć linię (komentowanie jej nie zadziała).To faktycznie działa na dowolną liczbę usuniętych linii ! Zwróci tablicę usuniętych linii lub pustą tablicę, jeśli żadna nie została usunięta. (Można łatwo zmienić w celu powrotu do zera (zastępując
return ra
zreturn ra || 0
), ale tak jak na pustym roztworu tablicy ponieważ byłoby bardziej użyteczne w świecie rzeczywistym).Na przykład usunięcie pierwszego wiersza zwraca
[1]
i usuwanie wszystkiego oprócz pierwszego wiersza[2,3,4,5]
. (Oczywiście nie działa, jeśli usuniesz wszystkie linie;-)
)źródło
Rubin
Jak to działa: moim pomysłem było: utworzyć tablicę i w każdej linii usunąć określoną wartość. Tak więc w pierwszym wierszu mam tablicę
[ 1, 2, 3, 4, 5]
z1
usuniętym elementem . W drugim wierszu, jeślia
jest już zdefiniowany, usuń element2
. W przeciwnym razie utwórz nową tablicę z2
usuniętym elementem . Zrób to samo dla linii 3. W linii 4 możesz mieć pewność, że tablica jest już utworzona, więc po prostu usuń element4
. W linii 5 najpierw usuń element5
, a jeślia
jest to pusta tablica, zwróć0
. W przeciwnym razie wróća
.źródło
Pyton
Zwraca 0, jeśli żadna linia nie jest usuwana, w przeciwnym razie zwraca usunięte linie. Możesz usunąć 1 do 5 linii, z wyjątkiem linii 0 i 6 ;-).
źródło
JavaScript, samodzielny, działa dla 0, 1, 2 usuniętych linii (
607315186 znaków)→ demo na żywo ←
Nadużywanie zmiennego podnoszenia JS i globalnego wycieku, jak w innym wyzwaniu :)
do wywołania z tablicą [1,2,3,4,5] jako parametrem.
315 znaków
do wywołania z pustą tablicą jako parametrem.
wersja bez golfa
(działa również dla usuniętych 3 i 4 linii):
do wywołania z pustą tablicą jako parametrem.
źródło
JavaScript:
skrzypce
źródło
JavaScript
Nazwij to, co lubisz, ale myślę, że tak ładne .
Informuje, które linie zostały usunięte (1 lub więcej), lub 0, jeśli nie zostały usunięte żadne linie. Wszystkie 5 linii może usunąć.
EDYTOWAĆ:
Ponieważ zwrócono mi uwagę, że mój kod może faktycznie składać się z 6 wierszy i narusza reguły, dostosowałem go do następujących elementów:
To samo dotyczy - zwróci tablicę usuniętych linii od 1- Wszystkie lub 0, jeśli nie ma żadnych.
źródło
function(){
i}
(oraz wszelkie funkcje pomocnicze). Policz liczbę linii.Common Lisp
Działa w celu usunięcia 1-4 linii. Jeśli usuniesz wszystkie linie, zwróci to samo, jakbyś nie usunął żadnych.
Uwaga: Posiadanie końca nawiasu we własnej linii jest uważane za zły styl, ale ponieważ inne języki mają
end
i}
zakładam, że jest to dozwolone.źródło
Pyton
Działa dla wszystkich linii - ale tylko wtedy, gdy dwie zostaną usunięte. Jeśli tylko jedna linia zostanie usunięta, wydrukuje usuniętą linię i linię 5. Jeśli zostanie usuniętych zbyt wiele linii, nic nie wydrukuje.
Używa to funkcji pomocnika, ponieważ słowa kluczowego del nie można używać w linii z; (o ile wiem)
Zasadniczo każda linia usuwa się z tablicy zadeklarowanej w konstruktorze, a następnie, jeśli usunięto wystarczającą liczbę linii, tablica jest drukowana.
Ta funkcja nie spełnia specyfikacji na dwa sposoby:
print
ireturn
są wymienneźródło
print ''
jednak nie wygeneruje dodatkowego znaku nowej linii?Déjà Vu
Działa w celu usunięcia dowolnej liczby linii (pod warunkiem pozostawienia co najmniej jednej linii)
źródło
R
Mam inną wersję w R, która moim zdaniem jest lepsza (ale używa funkcji pomocnika):
Można też uniknąć korzystania z funkcji pomocniczej, definiując ją jako domyślny argument (działa identycznie, ale jest mniej czytelny - jednak nie używa funkcji pomocniczej „oddzielnie zdefiniowanej”):
Oba
reportRemovedLines()
ifunnyVersion()
działają z dowolną liczbą usuniętych linii - chyba że usuniesz wszystkie linie (w takim przypadku zostaną zwróconeNULL
). W rzeczywistości zwracają numery wierszy, a nie tylko je drukują - tak jak w R, wartość ostatniego wyrażenia obliczonego w funkcji zostanie automatycznie zwrócona.Jak to działa? Sztuczka polega na
trick
funkcji, która pobiera wszystkie obiekty ze swojego „środowiska nadrzędnego” (tj. Środowiska funkcji, która ją wywołuje), łączy ich wartości w wektorze i zwraca, których wartości od 1 do 5 nie są reprezentowane.źródło
JavaScript (136/166 znaków)
Mniejsza wersja z niektórymi wartościami zadeklarowanymi na początku:
Samodzielna wersja (nie musisz niczego przekazywać - jest tam argument b, więc mogę sprawdzić, czy zdefiniowano b
||
)Tak, oba mają
return
stwierdzenia, ale jest to uczciwe tylko wtedy, gdy konkuruję z językami z niejawnym zwrotem.źródło
R
Prosta wersja (nie jest niezawodna, ponieważ jeśli usuniesz wiersz 5, pojawi się błąd):
I niezawodna wersja:
Działa z dowolną liczbą usuniętych linii (chyba że usuniesz wszystkie linie) i może być łatwo przedłużony do więcej niż 5 linii. Uruchomienie go „tak, jak jest” powróci,
integer(0)
co jest koncepcyjnie podobne do powrotu właśnie0
. Zwrócenie rzeczywistego 0 uczyniłoby go brzydszym i dłuższym, ale nie byłoby skomplikowane.Wreszcie wersja wykorzystująca magię:
Funkcja pomocnika:
Rzeczywista funkcja:
źródło
C ++
Sposób użycia: wywołaj funkcję za pomocą i i użyj func2, aby zrozumieć, co mówi funkcja.
Jeśli zmienisz wiersz int arr [] = {0,0} na int arr [] = {0,0,0,0,0}} to będzie działało również dla wszystkich pięciu wierszy, jest to również przypadek usunięcia wiersza testowego z jednej linii automatycznie, po prostu używam bitów zmiennej jako flagi dla każdej linii ....
źródło
function
ma sześciu linii, a nie pięciu?