sb , 83 bajty
^<b[1]>>>w[B!0]{<w[B!0]{t[B]<b[T]>>}<b[0]<b[0]<[X]>>}w[B=0]{<}t[B]<[X]t[B+T]vb[T/2]
Chociaż w ciągu wejściowym są co najmniej 3 znaki, pierwszy i ostatni są usuwane. Pozostawia to 1 znak (należy wydrukować niezmodyfikowany) lub 2 (należy uśrednić i wydrukować). Aby sobie z tym poradzić, pierwszy i ostatni znak ciągu są dodawane razem i dzielone przez dwa. Jeśli istnieje tylko jedna postać, (a+a)/2==a. Jeśli były dwa,(a+b)/2 to znak, który należy wydrukować. pb „pożycza” ocenę wyrażeń Pythona ( def expression(e): return eval(e, globals())), więc jest ona automatycznie przenoszona.
Obsługa pustych danych wejściowych kosztuje mnie 5 bajtów. W szczególności <b[1]>w pierwszej linii. Wcześniej, kiedy powiedziałem „sznurek”, było to całkowite kłamstwo. pb nie ma ciągów, ma znaki, które są blisko siebie. Szukanie „ostatniej postaci sznurka” oznacza po prostu przesuwanie pędzla w lewo, aż uderzy on w postać. Gdy nie podano danych wejściowych, pętla „dopóki są co najmniej 3 znaki” jest całkowicie pomijana i zaczyna szukać ostatniego znaku. Bez tego <b[1]>wyglądałoby to wiecznie. Ten kod umieszcza znak o wartości 1 w (-1, -1), który można znaleźć, gdy dane wejściowe są puste. Po znalezieniu „ostatniego znaku” struny pędzel przyjmuje, że pierwszy ma wartość (0, -1) i idzie tam bezpośrednio, znajdując wartość 0. (1+0)/2wynosi 0 w pb,
Ale jednoszynowy, to wciąż drukuje! Specyfikacja wyzwania mówi (empty input) => (empty output)! Czy nie jest drukowaniem znaku o zerowej wartości? To też nie ma związku, ale jesteś bystry i przystojny.
Dzięki, hipotetyczny pytający. Wcześniej, kiedy powiedziałem „drukuj”, było to całkowite kłamstwo. W PB naprawdę nie drukujesz wartości, po prostu umieszczasz je na płótnie. Zamiast „sposobu na wyjście”, bardziej dokładne jest wyobrażenie sobie płótna jako nieskończenie dużej tablicy 2D. Pozwala na ujemne wskaźniki w obu wymiarach, a wiele programów w pb polega na upewnieniu się, że pędzel dotrze do miejsca na płótnie, które chcesz. Po zakończeniu wykonywania programu wszystko na płótnie z nieujemnymi współrzędnymi X i Y jest drukowane w odpowiednim miejscu na konsoli. Po uruchomieniu programu całe płótno jest wypełnione wartościami 0. Aby nie trzeba było drukować nieskończonej liczby linii, każda z nieskończoną liczbą bajtów zerowych, każdy wiersz wyniku jest drukowany tylko do ostatniego niezerowego znaku, a linie są drukowane tylko do ostatniego z niezerowym znakiem. Więc umieszczenie0 at (0, 0) jest nadal pustym wyjściem.
Nie golfowany:
^<b[1]> # Prevent an infinite loop on empty input
>>w[B!0]{ # While there are at least 3 chars of input:
<w[B!0]{ # Starting at the second character:
t[B]<b[T]>> # Copy all characters one position to the left
# (Effectively erasing the first character)
}
<b[0]<b[0] # Delete both copies of the last character
<[X]>> # Get in place to restart loop
}
w[B=0]{<} # Go to last character of remaining string
t[B]<[X]t[B+T] # Find it plus the first character
vb[T/2] # Divide by 2 and print