Interpretuj luźne zakresy
ListSharp to interpretowany język programowania, który ma wiele funkcji, jedną z nich jest kreator zasięgu oparty na indeksie 1, który działa w następujący sposób:
Definiujesz zakres jako (INT) TO (INT)
lub tylko (INT)
tam, gdzie oba lub pojedyncze int mogą przejść od wartości minimalnej do maksymalnej wartości int32
Następnie możesz użyć tych zakresów, aby wyodrębnić elementy tablicy bez obawy przekroczenia jej granic
w związku z tym:
1 TO 5
generuje: {1,2,3,4,5}
3
generuje: {3}
Zakresy można dodawać za pomocą AND
operatora
1 TO 5 AND 3 TO 6
generuje: {1,2,3,4,5,3,4,5,6}
pamiętaj, że działa to również z liczbami ujemnymi
3 TO -3
generuje: {3,2,1,0,-1,-2,-3}
Wyzwanie jest następujące:
Wejście
Tablica znaków i poprzednio zdefiniowana klauzula zakresu jako ciąg
Wynik
Elementy w lokalizacjach zakresu na podstawie 1 indeksu (nieistniejące / ujemne indeksy tłumaczą się na pusty znak)
Jak wygrać
Jako wyzwanie do gry w golfa musisz stworzyć program z jak najmniejszą liczbą bajtów do wygrania
Podkreślono, że puste postacie nie istnieją, dlatego należy je ignorować (pokazałem je tutaj tylko po to, aby ułatwić ich zrozumienie, ale pomieszały ludzi)
Przypadki testowe:
input array is:
{'H','e','l','l','o',' ','W','o','r','l','d'}
range clause:
"1 TO 3" => "Hel"
"5" => "o"
"-10 TO 10" => "Hello Worl"
"0 AND 2 AND 4" => "el"
"8 TO 3" => "oW oll"
"-300 AND 300" => ""
"1 TO 3 AND 3 TO 1" => "HelleH"
"-20 TO 0 AND 1 AND 4" => "Hl"
źródło
"0 TO 2"
=>{'H', 'e', 'l'}
?3 TO 3
Kiedykolwiek będzie wejściem i jakie jest oczekiwane wyjście?AND
generowania wielu zakresów. Ponadto nie odpowiedziałeś, czy możemy korzystać z indeksowania zerowego, co jest standardem w większości języków.Odpowiedzi:
Python 2 -
239211210 bajtówDzięki @ mbomb007 i @Cyoce za dalsze granie w golfa w tym rozwiązaniu!
Proste podejście. Wypróbowałem generatory i wersję rekurencyjną, ale nie potrafiły pokonać prostych dla każdej pętli. Jestem golfistą noob, więc najprawdopodobniej można to trochę poprawić. Główną wadą tego fragmentu jest to, że zakres jako obiekt listy jest obliczany ponownie za każdym razem, gdy element jest pobierany z tablicy znaków (patrz ostatni wiersz, opis listy). Oznacza
r(s)
to, że wykonywane sąlen(r(s)) + 1
czasy.Nieskluczony kod:
Przypadki testowe:
Wynik:
źródło
if
tym samym wierszem i oddzielić je średnikami. I usuń spację[x] for
. Ponadto,1if b else-1
mogą być zastąpione albob and 1or-1
czy2*bool(b)-1
zapisać bajt.lambda
, ponieważ nie jest to rekurencyjne.t+=[int(x)]
canbecomet+=int(x),
Groovy (
9997 bajtów)Wypróbuj tutaj: https://groovyconsole.appspot.com/edit/5155820207603712
Wyjaśnienie:
.replaceAll(" TO ","..")
- Zamień na na tradycyjny zakres..replaceAll(" AND ", ",")
- Zastąp wszystkie znaki przecinkiem."[${...}]"
- Otocz go notacją „list” w Groovy.Eval.me(...)
- Oceń ciąg jako kod Groovy..flatten()
- Spłaszcz mieszaninę tablicy 2D i tablicy 1D do tablicy 1D..collect{v[it]}
- Zbierz wskaźniki z tablicy w jedną strukturę.Oto
115113 bajtowe rozwiązanie usuwające wartości null z wyniku: https://groovyconsole.appspot.com/edit/5185924841340928Oto 117-bajtowe rozwiązanie, jeśli powiesz, że MUSI być indeksowane na 1 zamiast 0: https://groovyconsole.appspot.com/edit/5205468955803648
Jeśli chcesz, żebym podmienił oryginał na bajt 113/117, daj mi znać.
źródło
Eval.me(...)
; użycie go w praktyce byłoby absurdalnie niepewne, co nadal jest fajną rzeczą.C #, 342 bajtów
Metoda bez golfa:
Pełny program z przypadkami testowymi:
Naiwne rozwiązanie, wykorzystujące listę
' '
znaków , która używa jako pustej postaci i wykonuje zadanie. Mając nadzieję na poprawę wkrótce.źródło
Scala, 165 bajtów
Wyjaśnienie:
źródło
Python 2,
156155 bajtówMoja odpowiedź ma kilka podobnych pomysłów jak odpowiedź 1Darco1 , ale stosując inne podejście od samego początku ( odcinanie łańcuchów zamiast list), skończyło się to nieco krócej. Byłoby cztery bajty krótsze, gdyby dozwolone było indeksowanie 0.
Wypróbuj online
Na szczęście mogę parsować ciągi zawierające spacje na liczby całkowite. Negatywne indeksowanie w indeksach Pythona od końca łańcucha, więc używam
i[-1]
albo tej sameji[0]
wartości, albo drugiej wartości, jeśli taka istnieje. Następnie muszę dostosować wszelkie ujemne wartości zakresu do bardziej ujemnych, aby nie zadzierały z krojeniem. Pomnożenie wartości ujemnych przez11**9
(2357947691
) uwzględni zakresy przy użyciu minimalnej liczby całkowitej. Następnie po prostu pokrój łańcuch, używając odwrotnego plasterka, jeśli zakres jest odwrócony.Z indeksowaniem zerowym (151 bajtów):
źródło
range
podejście jest w gruncie rzeczy po prostu bardzo gadatliwą formą właśnie tego. I nawet pozbyłeś się całejif"T"in x: else:
części. +1R, 142 bajty
Zakładając, że poprawnie zrozumiałem wyzwanie, tutaj zakładam, że
r
jest to wstępnie zdefiniowana klauzula zakresu w formacie łańcuchowym i że tablica wejściowa (w przykładach „Hello world”) jest odczytywana ze standardowego wejścia.Niektóre przypadki testowe:
Niegolfowane / wyjaśnione
Linia 1
R ma ładny operator infix,
:
który generuje sekwencje.1:5
daje[1, 2, 3, 4, 5]
i0:-2
daje[0, -1, -2]
. Zastępujemy więcTO
klauzulę w swobodnym zakresie:
.Tłumaczenie ustne
AND
jest po prostu konkatenacją. Możemy do tego użyć funkcjic
, która z łatwością może przyjąć dowolną liczbę argumentów oddzielonych przecinkami. Więc zastąpićAND
z,
a następnie owinąć w całość
c(
,)
.Daje to ciąg znaków, który mógłby wyglądać
c( 1 : 5 , 7 )
. Wzywamyparse
do konwersji do typu „wyrażenie”, a następnieeval
do oceny wyrażenia. Wynikowa sekwencja liczb jest następnie ponownie przypisywana do zmiennejr
.Linia 2
Teraz część brzydka - radzenie sobie z łańcuchami w R, które szybko się psują. Najpierw określamy,
e
że jest to pusty ciąg (będziemy go później potrzebować).Czytamy ze standardowego wejścia i konwertujemy ciąg znaków na tablicę pojedynczych znaków, dzieląc pusty ciąg. (Np. Przechodzimy z „Cześć” do [„H”, „i”].). Zwraca to listę o długości 1, więc musimy poprosić o pierwszy element,
[[1]]
aby uzyskać tablicę, z którą możemy pracować. Ugh, ostrzegałem cię, że to bałagan.Indeksy R zaczynają się od 1 i mają ładną funkcję z liczbami ujemnymi. Załóżmy, że
x
jest['a', 'b', 'c']
. Dzwonieniex[1]
nic dziwnego powraca'a'
. Wywołaniex[-1]
zwraca wszystkiex
oprócz indeksu1
, tj['b', 'c']
. To fajna funkcja, ale oznacza, że musimy uważać na nasze negatywne wskaźniki tego problemu. Na razie zwracamy tylko elementy tablicy wejściowej z indeksem>0
i przypisujemy wynik doo
.Linia 3
Jest jednak problem! Dla indeksów, które są większe niż długość tablicy, R po prostu zwraca
NA
wartości. Potrzebujemy go, aby zwrócić puste ciągi. Zatem redefiniujemy elementy,o
dla którychis.na(o)
maTRUE
być pusty ciąg.Linia 4
Wreszcie, jak radzimy sobie z ujemnymi (i zerowymi) wskaźnikami? Wszystkie muszą zwrócić pusty ciąg, więc powtarzamy pusty ciąg N razy, gdzie N jest liczbą indeksów
<1
.Na koniec łączymy wcześniej zdefiniowaną
o
z tą (potencjalnie pustą) listą.źródło
JavaScript (ES6), 141
Nienazwana funkcja z 2 parametrami, pierwszy to tablica znaków (może być także ciągiem znaków), drugi to ciąg znaków zawierający definicję zakresu.
Zwracana wartość to tablica, w której każdy element może być pojedynczym znakiem lub wartością js
undefined
. Po zszeregowaniu skutkuje to sekwencją rozdzielonych przecinkami znaków, których niezdefiniowanie jest pokazane jako „pusty” znak - jako przypadki testowe w pierwszej wersji pytania.Za pomocą tej opcji
.join
możesz uzyskać wynik łańcucha podobny do wyniku uzyskanego w przypadku testowym w bieżącej wersji pytania.Mniej golfa
Test
źródło
Perl - 110 bajtów
Wywołanie skryptu w wierszu polecenia z ciągiem jako pierwszym argumentem i zakresem jako drugim.
Usunięto zaciemnienie:
źródło
Python 2, 146 bajtów
Wszystkie testy są w idealnym stanie
Dzieli klauzulę
s
na „AND”, dzieli każdą z powstałych pod-klauzul na „TO”, konwertuje otrzymane ciągi naint
użyciemap
. Każdy z wyników będzie zawierał 1 lub 2 elementy (1, jeśli w podsekcji nie było „TO”).Konstruuje zakresy oparte na 0 dla każdego z nich, używając parametru kroku zakresu jako 1 lub -1, sprawdzając wartości o indeksach 0 i -1 (lista z jednym wpisem ma ten wpis przy obu indeksach).
Przebiega przez te zakresy i konstruuje listę danych wyjściowych, jeśli podane indeksy są in-range (
if 0<=i<len(a)
).źródło
Galaretka ,
28 2725 bajtówTryItOnline (będzie również działał z łańcuchem zamiast tablicy znaków)
W jaki sposób?
źródło
Clojure
232230229 bajtówOch, jaki potwór stworzyłem ... Ale tak naprawdę było 260, kiedy miałem go zgłosić.
Edycja: usunięty z miejsca
#(get r %_"")
,(if_(< f t)
i(take-nth 2_%)
(oznaczonych jako_
).Mniej golfa:
Używa
clojure.string/split
podziału przez „AND” i „”,take-nth
upuszcza „TO” między liczbami całkowitymi, dopasowanie argumentów funkcji obsługuje przypadek 1 lub 2 argumentów i to wszystko.Konwencja telefoniczna:
(f "Hello World" "1 TO 3 AND 2 AND 8 TO 2")
źródło
#
znakami.#
? Próbowałem bez powodzenia, „scalono” go z poprzednim tokenem. Och, jeszcze jedno miejsce do usunięcia%
.