W tym wyzwaniu będziesz używać dystrybucji produktu według sum i różnic liczbowych, jak wyjaśniono tutaj .
Przykłady
Input | Output
-------------|-------------
23(12+42) | (23*12)+(23*42)
9(62-5) | (9*62)-(9*5)
4(17+8-14) | (4*17)+(4*8)-(4*14)
15(-5) | -(15*5)
2(3) | (2*3)
8(+18) | +(8*18)
8(-40+18) | -(8*40)+(8*18)
Specyfikacja
Dane wejściowe będą ciągiem postaci n(_)
z pojedynczą dodatnią liczbą całkowitą bez znaku, n
po której nastąpi wyrażenie w nawiasie _
. To wyrażenie _
będzie się składać z sum i różnicy jednego z dodatnich liczb całkowitych, oddzielonych znakami +
i -
. Pierwszy termin może być poprzedzony +
znakiem, -
znakiem lub brakiem znaku.
Na wyjściu n
należy rozdzielić początkową liczbę, aby pomnożyć każdy z warunków. Każdy termin a
należy pomnożyć przez lewo, n
aby utworzyć wyrażenie w nawiasach (n*a)
, a te nowe terminy należy połączyć z znakami +
i -
podpisać w dokładnie taki sam sposób, jak pierwotne terminy.
Nieprawidłowe dane wejściowe
To są przykłady danych wejściowych, których nie musisz obsługiwać.
3(5 plus 3)
6(5 13)
(5+8)(6+6)
(5+3)8
Zwycięski
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
źródło
8(-40+18)
Odpowiedzi:
Pip, 28 bajtów
Wyjaśnienie:
Obiekty Pip's Pattern przeważnie są zgodne ze składnią wyrażeń regularnych Pythona, ale
&
wzorzec zastępczy jest zapożyczony z sed.Przeczytaj więcej o Pip w repozytorium Github
źródło
JavaScript 65 bajtów
To zajmie dane wejściowe. Uzyskaj znak + lub -, a następnie cyfry, a następnie zamień go we właściwej kolejności.
Wyjaśnienie
Stosowanie
Działa to tylko w Firefox i Safari Nightly, może Edge? ponieważ wykorzystuje funkcje ES6. Możesz uruchomić go przez:
źródło
(.?)(\d+)
Jest zepsuty. To się nie udaje23(12+42)
, produkując1(23*2)+(23*42)
.\D?
może być użyty zamiast[+-]?
Python 2.7,
110108 bajtówProgram pobiera dane wejściowe ze standardowego wejścia, wyszukuje dopasowania względem -
([+-]?)(\d+)
regex i tworzy ciąg wyjściowy.Testowanie -
źródło
Siatkówka , 40 bajtów
Każda linia powinna przejść do własnego pliku, ale możesz uruchomić kod jako jeden plik z
-s
flagą. Na przykład:Pierwsze dwa wiersze przesuwają mnożnik obok każdej liczby w oczekiwanej formie:
Ostatnie dwa wiersze usuwają niepotrzebną część końcową:
źródło
sed, 105 bajtów
Chciałem tylko sprawdzić, czy da się to zrobić za pomocą sed.
Może trochę stara szkoła, ale działa.
źródło
rs , 77 bajtów
Demo na żywo i wszystkie przypadki testowe.
To jest pierwszy raz, kiedy makra rs zostały użyte!
źródło
REGXY , 45 bajtów
Używa REGXY, języka opartego na podstawieniu wyrażenia regularnego.
źródło
//
działa Przypuszczam, że zapętla się do góry, dopóki łańcuch się nie zmieni, ale nie mogę znaleźć na stronie esolang dlaczego.//
tworzy nieskończonej pętli, ponieważnothing
zawsze będzie pasować, więc zawsze przeskakujemy z powrotem do pierwszej linii.Perl, 36 bajtów
Kod 35 bajtów + wiersz poleceń 1 bajt
Stosowanie:
źródło
Pyth,
3938 bajtówStraszne rozwiązanie wyrażenia regularnego:
źródło
Ruby, 94 bajty
źródło
CJam, 50 bajtów
Wypróbuj online
CJam nie obsługuje wyrażeń regularnych ani niczego poza wyszukiwaniem i dzieleniem ciągów, co jest bardzo wygodne przy analizie wyrażeń. Jest tu więc trochę pracy.
Wyjaśnienie:
źródło
gawk -
6058Uff ... od dłuższego czasu nie współpracowałem z regexp.
źródło
Perl 5,
70605544 Bajtów + 1 karaRozwiązanie perla, które wykorzystuje tylko wyrażenie rozdzielone i 1 wyrażenie regularne.
Oblicza również dłuższe dane wejściowe.
Test
Wersja, która przyjmuje parametr
Wersja, która używa tylko wyrażeń regularnych.
Ten działa przez grupę przechwytywania z pozytywnym spojrzeniem w przód i leniwym dopasowaniem. Prawdopodobnie zastosowałby pozytywny wygląd, gdyby Perl 5 go wspierał, ale niestety. Zajęło mi trochę czasu, aby dowiedzieć się, że z regexem jest to możliwe.
źródło
-p
opcji wiersza polecenia (myślę, że jest to +1 char vs 9 dla,<>
i;print
), ponieważ domyślniesplit
będzie działać$_
(co będzie, co jest w środku<>
), a druk jest również zawarty w pętli ! Mam nadzieję, że to pomaga!Siatkówka ,
505143 bajtówMyślę, że to może być mój pierwszy program Retina. Jeśli nie, to mój pierwszy program Retina jest tym złożonym (tak naprawdę nie tak złożonym). Każda linia przechodzi we własny plik.
Tak naprawdę nie testowałem tego z Retiną, testowałem to wielokrotnie za pomocą testera zastępującego wyrażenie regularne, ale powinno działać.
Opis pierwszego przykładu:
Ponieważ istnieje parzysta liczba plików, Retina używa trybu zastępowania. Pierwsza zamiana (pierwsze dwa pliki) usuwa liczbę do dystrybucji i dodaje tę parę dystrybucyjną
(23*12)
do końca, dając23(+42)(23*12)
.+`
na początku każe Retinie wielokrotnie wymieniać, aż wzór się nie zgadza, a ponieważ jest to ponownie dopasowane, wzór zastępuje to23()(23*12)+(23*42)
. To się już nie zgadza, więc kolejne 2 pliki są używane do następnej zamiany. Tym razem po prostu usuwa23()
. Działa to ładnie: ponieważ produkty są dołączane na końcu, nie muszę robić nic dziwnego, jeśli liczba nie ma znaku, ponieważ jedyną, która może być bez znaku, jest pierwsza liczba.EDYCJA:
$'
w zamianie reprezentuje resztę ciągu po dopasowaniu, więc mogę usunąć końcowe(.*)
s.źródło
k, 98 bajtów
Niezbyt golfowy.
Podziel na niecyfrowe, usuń pareny, usuń puste ciągi, a następnie zachowaj
x
stałą jako pierwszy ciąg, połącz*
z każdym pozostałym ciągiemy
, nawiasuj rozmiar i przenieś znak na początek, jeśli jest obecny; spłaszcz dane wyjściowe w pojedynczy ciąg.źródło