To wyzwanie przynosi ci prawdziwa (i tragiczna) inspiracja. Ostatnio wiersz liczb na mojej klawiaturze był nieco sporadyczny. Klucze 1-9
działają czasami - ale innym razem nie dają rezultatu. Jako zapalony programista jest to okropne! (Widzisz ten wykrzyknik? W ten sposób wiesz, że teraz działają.) Nie tylko często potrzebuję samych liczb, ale symboli!@#$%^&*(
są również całkowicie nieskuteczne w połowie czasu! Jako programista języka C, zamiast oderwać się od mojego napiętego harmonogramu szkicowania kodu w celu naprawy laptopa, byłem bardziej zainteresowany obejściem problemu. W ciągu ostatnich kilku tygodni powoli wszystkie literały liczbowe w moim kodzie zostały zamienione na szesnastkowe, aby nie musiałem szukać liczb do skopiowania i wklejenia. Jednak niektóre cyfry nie są łatwe do wpisania bez klawiszy 1-9
. Na przykład liczby 1
nie można zapisać tak po prostu w systemie szesnastkowym, i postanowiłem zastąpić 1
s w moim kodzie 0xF - 0xE
. Jedyne klucze, które są dotknięte są 1-9
, więc utrzymanie pełnego wykorzystania symboli, takich jak +
, -
i /
. Nie mogę jednak używać mnożenia ani nawiasów, ponieważ*
i (
często są zepsute. To prowadzi do twojego wyzwania.
Wkład
Liczba całkowita, n
do stdin lub odpowiednika twojego języka. Jeśli chcesz, liczba całkowita może być poprzedzona lub uzupełniona nową linią lub innym znakiem spacji. Alternatywnie możesz otrzymać dane wejściowe za pomocą argumentu wiersza poleceń.
Twój program powinien poprawnie reagować na negatywne dane wejściowe i być w stanie obsłużyć co najmniej 32-bitowe liczby całkowite ze znakiem.
Wydajność
Twój program powinien wypisać, w pewnej możliwej do zaobserwowania formie, najkrótszy (zapisany spacjami) możliwy sposób zapisania liczby n
jako sumy, różnicy lub podziału jednej lub więcej wartości szesnastkowych. Jest więcej niż jeden sposób rozwiązania tego problemu i nie ma wymogu, aby faworyzować jakiekolwiek wyjście o równej długości w stosunku do jakiegokolwiek innego.
Dane wyjściowe powinny mieć postać, w A % A % A...
której A
następuje wartość szesnastkowa, 0x
zawierająca tylko cyfry A-F a-f
, i %
jeden z symboli -+/
. Opiszmy /
dzielenie całkowite, a nie zmiennoprzecinkowe.
(Należy pamiętać, że wyniki powinny wynikać z n
oceny najpierw podziałów, od lewej do prawej, a następnie dodawania i odejmowania, od lewej do prawej, jak to jest w konwencji).
Przypadki testowe
Wejście wyjście
1
0xF - 0xE
(lub0xF-0xE
lub0xB-0xA
lub0xd - 0xc
lub0xF/0xF
)15
0xF
255
0xFF
30
0xF + 0xF
Punktacja i zasady
To jest golf golfowy. Twój wstępny wynik to liczba bajtów w pliku źródłowym.
NIE możesz używać żadnych cyfr 1-9
w swoim źródle.
MOŻESZ używać symboli !@#$%^&*(
w swoim źródle, ale każdy z nich ma karę +20 do twojego wyniku.
Twój program może zostać zastąpiony przez funkcję, która bierze n
pod uwagę argument, o ile funkcja ta generuje jakąś formę danych wyjściowych czytelnych dla człowieka. Wartość zwracana przez twoją funkcję NIE jest liczona jako wynik.
Standardowe luki są niedozwolone.
Najniższy wynik wygrywa! Powodzenia!
Czy zrobiłem coś głupiego pod względem formatowania / zadawania pytań / przejrzystości? Daj mi znać! To jest moje pierwsze zgłoszenie do tej strony!
źródło
Odpowiedzi:
JavaScript 287 (187 + 20 * 5)
295 (195 + 20 * 5) 338 (198 + 20 * 7)Funkcja, która sprawdza wszystkie możliwe kombinacje 6 dozwolonych cyfr szesnastkowych (0xA do 0xF) i 3 dozwolonych operatorów. Wyprowadzanie za pomocą wyskakującego okienka i nie zwracanie wartości, zgodnie z żądaniem.
Użyłem [] do grupowania wyrażenia oddzielonego przecinkami, ale nie mogłem uniknąć 5
7otwartych nawiasów dla pętli i wywoływania funkcji.Aby uniknąć cyfr, istnieją zmienne A, B, C dla 1,2,3 (to sprawia, że kod jest jeszcze bardziej niejasny)
Zmodyfikowano kod, koncentrując się na unikaniu „(”. Usunięto
if
s i jawne tworzenie RegExpUwaga: ta funkcja jest niezwykle powolna, przekroczy limit czasowy dla skryptu w FireFox, nawet dla małych danych wejściowych, takich jak 90.
Aby wyliczyć wszystkie możliwe wyrażenia, używam liczby zaczynającej się od 3 i idącej w górę na zawsze. Kodowanie cyfr:
0,1,2 to operatory +, -, /
4 do 9 to cyfry szesnastkowe A..F
3 jest niedozwolone
Każda liczba jest sprawdzana za pomocą wyrażenia regularnego,
/3|[0-2]{2}/
aby uniknąć cyfry 3 i mającego 2 kolejne operatory ( sprawdź także unikaj śledzenia i wiodących operatorów - patrz kod)Wynikowy ciąg znaków jest podobny do
0xA + 0xA - 0xD
poprawnego kodu JavaScript, więc używam eval do jego oceny. Niestety, operator „/” jest zmiennoprzecinkowy i nie jest liczbą całkowitą w JavaScript, więc nie jestem w 100% pewien, że wynik jest prawidłowym rzutowaniem zdarzeń w celu uzyskania wyniku końcowego (ale jestem całkiem pewien, biorąc pod uwagę, że mały błąd zaokrąglenia nie może być wzmocnione przez „*”)Coś innego
Teraz coś zabawniejszego. Użyłem uproszczonego parsera expressione, aby uniknąć wywołania eval i, co zabawne, okazało się, że jest znacznie szybsze.
Parser jest naprawdę uproszczony, w prawdziwym parserze V i O powinny być tablicami zawierającymi stos wartości oczekujących i stos operatorów oczekujących. Tutaj V jest pojedynczą oczekującą wartością (a także wartością zwracaną), a O jest łańcuchem zawierającym maksymalnie 2 znaki. P zawiera tabelę priorytetów operatorów dla „- + /” => „112”
Daje to 275 + 4 * 20 => 355
Przetestuj W przeglądarce Firefox / FireBug zmień alert z powrotem (znacznie bardziej użyteczny)
Tylko trochę mniej oczywiste (ale bądź cierpliwy)
źródło
Python 2: 185 bajtów + 2 * 20 = 225
Zbyt długo na poważną odpowiedź. Ale ponieważ nie ma jeszcze odpowiedzi, i tak opublikuję.
product
tworzy wszystkie różne układy dozwolonych znaków.exec
próbuje to odkodować. To niestety zwraca wyjątek, stąd długitry - catch
blok. Jeśli wynik jest w porządku, drukuje się i istnieje.2-krotna kara za te nawiasy klamrowe podczas wywołań funkcji.
źródło
0
nie jest literałem szesnastkowym; (2) Podział obejmujący liczbę ujemną w Pythonie daje inny wynik niż w C.