Pomóż mi odkładać na później naprawy moich komputerów!

23

To wyzwanie przynosi ci prawdziwa (i tragiczna) inspiracja. Ostatnio wiersz liczb na mojej klawiaturze był nieco sporadyczny. Klucze 1-9dział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 1nie można zapisać tak po prostu w systemie szesnastkowym, i postanowiłem zastąpić 1s 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, ndo 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 njako 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 Anastępuje wartość szesnastkowa, 0xzawierają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 noceny 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. 1

    0xF - 0xE(lub 0xF-0xElub 0xB-0xAlub 0xd - 0xclub 0xF/0xF)

  2. 15

    0xF

  3. 255

    0xFF

  4. 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-9w 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 npod 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!

BrainSteel
źródło
Czy istnieje górna granica wielkości liczby całkowitej? Czy liczby ujemne będą reprezentowane z dowolną dokładnością (tj. 32-bitową)?
FryAmTheEggman
@FryAmTheEggman Edytowano oryginalny post, aby wyjaśnić. Dane wejściowe mogą być ujemne, a program powinien poprawnie reagować na co najmniej 32-bitowe dane wejściowe. Dzięki!
BrainSteel
Wygląda mi to na dość solidną specyfikację, ale jeśli chcesz uzyskać informacje zwrotne, zalecamy opublikowanie go w piaskownicy (na przyszłe wyzwania), abyś mógł uzyskać informacje zwrotne, zanim opublikujesz go na stronie głównej i ludzie zaczną nad nim pracować. .
Martin Ender
1
Podział na liczby całkowite czy zmiennoprzecinkowe?
edc65

Odpowiedzi:

5

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 7 otwartych 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 ifs i jawne tworzenie RegExp

Uwaga: 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 - 0xDpoprawnego 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 „*”)

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,j=0;j?x-~~eval(L):A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',L='',w='0x')?j='':j)
      c>C?w+=' ABCDEF'[c-C]:[L+=w,w=' '+'+-/'[c]+' 0x']
  }
  alert(L)
}

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

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,D=A+C,j=0,P=''+A+A+B;j?x-V:A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',v=V=O=L='',w='0x')?j='':j)
      c>C?
        w+='ABCDEF'[v<<=D,v+=D+A-~c,c-D]
      :[
          P[O[0]]>=P[c]?[v=O>A?V/v|0:O>0?V+v:V-v,O=c]:O=c+O,
          L+=w,w=' '+'-+/'[c]+' 0x',V=v,v=0
      ]
  }
  alert(L)
}

Przetestuj W przeglądarce Firefox / FireBug zmień alert z powrotem (znacznie bardziej użyteczny)

;[0, 1, 15, 255, 30].forEach(x=>console.log(x,F(x)))

0 0xA - 0xA
1 0xA / 0xA
15 0xF
255 0xFF
30 0xF + ​​0xF

Tylko trochę mniej oczywiste (ale bądź cierpliwy)

;[16,40, 51, 62, 73, 84, 95].forEach(x=>console.log(x,F(x)))

16 0xBA / 0xB
40 0xA + 0xF + ​​0xF
51 0xDD - 0xAA
62 0xEA - 0xAC
73 0xA + 0xEA - 0xAB
84 0xFE - 0xAA
95 0xA + 0xFF - 0xAA

edc65
źródło
3

Python 2: 185 bajtów + 2 * 20 = 225

Zbyt długo na poważną odpowiedź. Ale ponieważ nie ma jeszcze odpowiedzi, i tak opublikuję.

from itertools import product as p
n=input()
l=t=0
while~l:
 l=-~l
 for i in p("0xABCDEF+-/",repeat=l):
  j=""
  for k in i:j+=k
  try:exec"t="+j
  except:0
  if t==n:print j;l=~0;break

producttworzy wszystkie różne układy dozwolonych znaków. execpróbuje to odkodować. To niestety zwraca wyjątek, stąd długi try - catchblok. Jeśli wynik jest w porządku, drukuje się i istnieje.

2-krotna kara za te nawiasy klamrowe podczas wywołań funkcji.

Jakube
źródło
2
Ta odpowiedź może mieć kilka problemów: (1) 0nie jest literałem szesnastkowym; (2) Podział obejmujący liczbę ujemną w Pythonie daje inny wynik niż w C.
feersum