Wyzwanie
Biorąc pod uwagę ciąg takich jak Hello World!
, rozbicie go na jego wartości znakowych 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33
.
Następnie należy obliczyć różnicę pomiędzy każdą kolejną parą znaków: 29, 7, 0, 3, -79, 55, 24, 3, -6, -8, -67
.
Wreszcie, podsumować je i wydrukować wynik końcowy: -39
.
Zasady
- Obowiązują standardowe luki
- Brak korzystania z gotowych funkcji wykonujących dokładnie to zadanie
- Zachęca się do kreatywnych rozwiązań
- baw się dobrze
- Jest to oznaczone jako golfowy , najkrótsza odpowiedź w bajtach wygrywa, ale nie zostanie wybrana.
code-golf
string
number
arithmetic
array-manipulation
dkudriavtsev
źródło
źródło
Odpowiedzi:
Python, 29 bajtów
Suma różnic tworzy szereg teleskopowy, więc większość sum anuluje się i
(s 1 - s 0 ) + (s 2 - s 1 ) +… + (s n-1 - s n-2 ) + (s n - s n-1 ) = s n - s 0 .
Jeśli pobieranie ciągu bajtów jako danych wejściowych jest dozwolone
będzie działać również dla 19 bajtów .
Przetestuj oba na Ideone .
źródło
MATL , 2 bajty
Wypróbuj online!
Wyjaśnienie:
d
pobiera różnicę między kolejnymi znakami is
sumuje wynikową tablicę. Następnie wartość na górze stosu jest domyślnie drukowana. Niewiele więcej na ten temat.Co ciekawe, mimo że Dennis odkrył niesamowity skrót, użycie go w MATL byłoby znacznie dłuższe.
źródło
Galaretka , 3 bajty
Wypróbuj online!
Weź wartości
O
końcowe znaków ciągu wejściowego, następnieI
części tej listy, a następnieS
um tej listy.źródło
MATLAB, 16 bajtów
Stwarza anonimową funkcję nazwaną
ans
który można nazwać tak:ans('Hello world!')
.Oto demo online w Octave, które wymaga dodatkowego bajtu,
+
aby jawnie przekonwertować ciąg wejściowy na tablicę numeryczną przed obliczeniem różnicy między elementamiźródło
Python, 63 bajty
Ideone to!
źródło
Cubix , 13 bajtów
Cubix to dwuwymiarowy język owinięty wokół sześcianu.
Przetestuj online! Odwzorowuje to na następującą sieć kostek:
Gdzie IP (wskaźnik instrukcji) zaczyna się w lewym górnym rogu skrajnie lewej twarzy.
Jak to działa
Po pierwsze, adres IP uderza w lustro,
/
które przekierowuje go nai
górną powierzchnię. Górna powierzchnia jest pętlą, która nieustannie wprowadza kody znaków, aż do osiągnięcia EOF. Gdy dane wejściowe są puste, wynikiemi
jest -1; adres IP skręca w lewo od?
, uderzając/
w skrajnie prawą twarz i wykonując następujące polecenia:;
- Pop najwyższy element (-1).#
- Naciśnij długość stosu.t
- Pop najwyższy przedmiot i dostać przedmiot o tym indeksie na stosie. To pociąga za sobą dolny element.-
- Odejmować.O
- Wyjście jako liczba całkowita./
- Odrzuca adres IP do@
, co kończy program.źródło
C #, 22 bajty
Pełny kod źródłowy z przypadkiem testowym:
C # z LINQ, 17 bajtów
Krótsza wersja, wykorzystująca LINQ, dzięki hstde :
Konieczny jest jednak dodatkowy import:
źródło
s=>s.Last()-s[0];
byłoby tylko 17 bajtówRubinowy, 23 bajty
Przypisz do zmiennej like
f=->s{s[-1].ord-s[0].ord}
i call likef["Hello World!"]
Wykorzystuje obserwację Dennisa na temat serii teleskopów.
źródło
$><<
.siatka, 12 bajtów
Wypróbuj online!
Korzystając z obserwacji Dennisa , możemy skrócić proces iteracyjny do prostszego.
źródło
Brain-Flak , 51 bajtów
48 bajtów kodu plus trzy bajty dla
-a
flagi, która umożliwia wejście ASCII (ale wyjście dziesiętne. Jak wygodne.: D)Wypróbuj online!
To trochę trudniejsze niż moja inna odpowiedź, haha. Przejdźmy przez to.
źródło
05AB1E , 3 bajty
Wypróbuj online!
Wykorzystuje kodowanie CP-1252.
Wyjaśnienie
źródło
Brachylog , 7 bajtów
Wypróbuj online!
Wyjaśnienie
Ponieważ odejmowanie działa tylko dla wejścia dwóch liczb całkowitych, odniesie sukces, gdy wybrany zostanie prefiks
[33, 72]
.źródło
Haskell, 32 bajty
źródło
R,
69 4332 bajtyBardzo niekonkurencyjna odpowiedź, chociaż pomyślałem, że fajnie byłoby zaprezentować możliwe rozwiązanie w R.
Jedynym interesującym aspektem tej odpowiedzi jest użycie
sapply
icharToRaw
. Najpierw podzielę ciąg na wektor znaków, który chcę przekonwertować na reprezentacje liczb całkowitych ASCII.charToRaw
Funkcja jest wektorowy w R i zamiast pętli na każdej wartości powyżej wektora I użytkusapply
, które skutecznie vectorizes funkcję. Następnie weź 1. różnicę, a następnie zsumuj.Edycja: Okazuje się, że
charToRaw
przekształca ciąg znaków w wektor, w którym każdy element jest surową reprezentacją każdego znaku, stąd nie ma potrzeby używaniastrsplit
isapply
Edit2: okazuje się, że jest jeszcze lepszy sposób, funkcja
utf8ToInt(x)
robi dokładnie to, costrtoi(charToRaw(x),16)
dzięki czemu możemy zaoszczędzić kilka więcej bajtów (Idea pochodzi użytkownika @ rturnbull odpowiedź na inne pytanie):źródło
Perl, 19 bajtów
Obejmuje +1 dla
-p
Podaj dane wejściowe STDIN bez ostatniej nowej linii
slope.pl
:Jeśli masz pewność, że łańcuch wejściowy ma co najmniej 2 znaki, ta 17-bajtowa wersja również działa:
źródło
NodeJS, 82 bajty
Wyjaśnienie:
JavaScript, 79 bajtów
Taki sam pomysł, jak powyżej, z wejściem funkcji zamiast argumentu.
źródło
x
to dane wejściowe. Musisz uzyskać dane wejściowe.f=x=>{...;return t}
aby zapisać 2 bajty;)JavaScript ES6,
4239 bajtówWykorzystując obserwację @Dennis na temat sum teleskopu.
Myślę, że w tym przypadku trywialne rozwiązanie jest najkrótsze.Zaoszczędzono 3 bajty, pozbywając się
charCodeAt
powtórzeń, jak sugeruje @Neil.źródło
s=>s.slice(-1).charCodeAt()-s.charCodeAt()
, to ta sama długość.charCodeAt
jest dość długi, prawdopodobnie istnieje sposób na zaoszczędzenie bajtów poprzez unikanie powtórzeń.f=s=>(s[1]?-f(s.slice(-1)):0)-s.charCodeAt()
Dalej, 28 bajtów
Pobiera listę znaków ze stosu (standardowa metoda pobierania parametrów przez Fortha). Znaki są pobierane w taki sposób, że góra stosu jest pierwszym znakiem ciągu. Przesuwam dół stosu na górę, zamieniam, a następnie odejmuję i drukuję. Śmieci zostają na stosie, a dane wyjściowe są drukowane na standardowym wyjściu.
Gdyby każdy znak był wypychany na stos w kolejności zamiast w odwrotnej kolejności, program byłby o 2 bajty krótszy. Nie jestem jednak pewien, czy jest to dozwolone, ponieważ zwykle wypychasz argumenty w odwrotnej kolejności.
Wypróbuj online
Nazywany tak:
źródło
Java, 42
Nie golfowany:
Wyjaśnienie:
Działa to na tej samej zasadzie co teleskopowanie:
Uogólniona dla dowolnej sekwencji znaków długości
n
, odpowiedź jest taka,c[n-1] - c[0]
że wszystkie elementy w środku są anulowane.źródło
PHP 7.1,
3331 bajtówWykorzystuje ujemne przesunięcia ciągów zaimplementowane w PHP 7.1.
Uruchom tak:
Poprawki
$argn
źródło
RProgN , 142 bajtów, niekonkurujący
Niekonkurencyjny, ponieważ po odkryciu tego wyzwania dodano komendę „tostack” (mimo że ma straszną liczbę bajtów)
Przypadki testowe
Wyjaśnienie
RProgN to ezoteryczny język, nad którym pracowałem z myślą o odwrotnej notacji polskiej. Obecnie jest dość gadatliwy, a zmienne przypisanie ma 4 znaki, ale planuję dodać w przyszłości trochę cukru syntaktycznego.
Ponadto RProgN domyślnie uzyskuje dostęp do argumentów ze stosu i zwraca je w ten sam sposób. Wszelkie dane łańcuchowe pozostawione na stosie po zakończeniu programu są domyślnie drukowane.
źródło
~{bid☼[+
i to trochę urocze.PHP, 36 bajtów
→ suma różnic == różnica między pierwszym i ostatnim znakiem
ord()
w PHP działa na pierwszym znaku ciągu→ nie ma potrzeby jawnego zmniejszania go do jednego znaku
źródło
Brain-Flak ,
3432 + 3 = 35 bajtów+3 z powodu
-a
flagi wymaganej w trybie ascii.Wypróbuj online
O dziwo, bardziej efektywne jest użycie definicji użytej w specyfikacjach niż „sztuczka” polegająca na odejmowaniu najpierw od ostatniego.
Działa to poprzez wykonanie dokładnie tego.
źródło
CJam ,
85 bajtówOgromne podziękowania dla Dennisa za dwie sugestie, które usunęły 3 bajty
Wypróbuj online!
Wyjaśnienie
Oblicza ostatnią wartość minus pierwsza wartość.
źródło
)
zamiastW=
, nie potrzebujesz_
. Równieżc
jako skrót do0=
.Haskell, 36 bajtów
stosowanie:
Haskell (Lambdabot), 31 bajtów
źródło
sum.(tail>>=zipWith(-)).map fromEnum
na przykład jest funkcją.Zsh , 22 bajty
Wypróbuj online!
W trybie arytmetycznym
#name
pobiera kod pierwszego znaku wname
. Ustawiamyc
na ostatni znak i uwzględniamy różnicę między pierwszym a ostatnim kodem.źródło
Haskell , 30 bajtów
Wypróbuj online!
Odejmuje wartość porządkową ostatniego znaku od pierwszego.
źródło
Haskell, 61 bajtów
źródło
Java 7,
10096 bajtówKod niepoznany i testowy:
Wypróbuj tutaj.
Wynik:
-39
źródło
Clojure, 31 bajtów
Ktoś zredukował to zadanie do jednej operacji.
źródło