Wyzwanie
Biorąc pod uwagę operatora ASCII z poniższej listy i liczbę n, narysuj reprezentację ASCII operatora, używając tego operatora jako znaku z segmentami linii operatora o długości n .
Wkład
Znak ASCII z listy = + - x /
i liczba całkowita n
gdzie n >= 1
. (Używam x
zamiast *
i /
zamiast ÷
, ale możesz użyć jednego z nich, w zależności od tego, które jest łatwiejsze). W przypadku +
i x
musisz obsługiwać liczby nieparzyste, aby uniknąć problemów z wyrównaniem.
Wydajność
Rysunek ASCII operatora złożony z znaku o segmentach o długości n. Części poziome powinny mieć odstępy między znakami, aby zrównoważyć różnice odległości w pionie / poziomie.
Zasady
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach. Standardowe luki są zabronione.
Przykłady
Wkład: + 3
+
+ + +
+
Wkład: = 4
= = = =
= = = =
Wkład: = 10
= = = = = = = = = =
= = = = = = = = = =
Wkład: - 2
- -
Wkład: / 10
/
/
/
/
/
/
/
/
/
/
Wkład: x 7
x x
x x
x x
x
x x
x x
x x
= 10
?Odpowiedzi:
Pip ,
625956 bajtów55 bajtów kodu, +1 dla
-S
flagi.Zauważ, że to rozwiązanie działa z danymi wejściowymi
÷
dla dzielenia i*
mnożenia, chociaż używa tych znaków do rysowania odpowiednio ASCII-art/
ix
. OP wyjaśniła, że to w porządku.Wypróbuj online!W jaki sposób?
Oto częściowo rozstawiona i skomentowana wersja . Zauważ, że
a
ib
są argumentami wiersza poleceń, tj. Odpowiednio operatorem i rozmiarem. Te-S
kontrole flag jak wykazy są wyprowadzane: łączy się na nowej linii pierwszej, ale dołącza żadnych zagnieżdżonych list na przestrzeniach.A oto poszczególne sekcje:
Mnożenie
Dla każdego wiersza na rysunku generujemy ciąg spacji, a następnie zastępujemy dwa z nich znakiem wejściowym. W przypadku wiersza
i
chcemy zastąpić spacje indeksemi
ib-1-i
; ale pamiętaj, że ten ostatni może używać indeksu ujemnego-1-i
. (Jest nawet krótszy, ponieważ zmiennav
jest wstępnie zainicjalizowana na negati v e 1.)Dodanie
Stosując strategię z mojego Draw wydrążony kwadratowy odpowiedź, możemy zdefiniować funkcję, która owija
+
wb/2
kopii jej argument i zwraca wynik w postaci listy znaków. (Dzielenie liczb całkowitych//
nie jest konieczne, ponieważ operator powtarzania łańcuchówX
automatycznie obcina się do liczb całkowitych.) Najpierw wywołujemy tę funkcję na spacji, podając[" ";" ";"+";" ";" "]
; następnie mapujemy tę samą funkcję do tego wyniku, podając[" ";" ";"+";" ";" "]
na większości linii, ale["+";"+";"+";"+";"+"]
na linii środkowej. Ta zagnieżdżona lista jest następnie wyprowadzana, z powodu-S
flagi, ze spacjami między wszystkimi znakami w wierszu i znakami nowej linii między wierszami.Podział
Każdy wiersz ma między
b-1
i0
spacje, po których następuje znak wejściowya
.Odejmowanie
Utwórz oddzielony spacją wiersz znaku wejściowego. Zapisz kopię na później.
Równa się
Krok odejmowania przechowywał połowę tego, czego potrzebujemy - po
y
prostu dwukrotnie.Wartości zastępcze
x
służą do uzupełnienia głównej listy, dzięki czemu modułowe indeksowanie daje unikalny indeks dla każdego wprowadzanego znaku+-*÷=
.źródło
V ,
78, 72, 71, 68, 65, 63, 62, 61 bajtówWypróbuj online!
Jak zawsze bitwa pod szyją z 05AB1E jest naprawdę fajna!
Ponieważ zawiera znaki spoza ASCII, oto zrzut heksowy:
To tworzy wiodące spacje w danych wyjściowych dla
=
i-
, ale wydaje się to dozwolone . Jeśli nie jest to dozwolone, możesz skomentować, a ja cofnę to.Wyjaśnienie
„Polecenie globalne” (np.
ç
) Stosuje określony zestaw poleceń do każdego wiersza pasującego do określonego wyrażenia regularnego. Składnia jest następującaJest to najprostszy sposób na symulację instrukcji warunkowej / przełącznika. W mojej oryginalnej odpowiedzi po prostu stworzyłem całą grafikę ASCII po prawej stronie dla każdej innej postaci, której musimy szukać. Jednak wiele z tych danych wyjściowych wymaga podobnych poleceń. Więc połączyłem je. Pierwsze polecenie („Ç”) jest w rzeczywistości odwrotnością polecenia globalnego, stosuje polecenie do każdej linii, która nie pasuje do wyrażenia regularnego. Więc pierwsze polecenie to:
Następujące polecenie służy do wprowadzania danych „=” i „-”. Te dwa są dogodnie łatwe i podobne. Po tym poleceniu nie potrzebujemy więcej przetwarzania
-
.Stąd wykonujemy dodatkowe polecenia dla każdego możliwego wejścia. Dla
+
:Polecenie równości jest bardzo proste. Po prostu to powielamy
Ä
. Dla/
:Ostatni jest najbardziej skomplikowany. Jest to po prostu część tej odpowiedzi .
źródło
ç
Polecenia (jak również wyszukiwania i zamiany,/
i?
) wszystkie symulacji część linii poleceń Vima, gdzie trzeba nacisnąć enter aby rzeczywiście uruchomić komendę05AB1E ,
8176747370696865646260595756 bajtówObecnie w wojnie z V odpowiedź . Idę po ciebie Dr. McMoylex: str.
Także w wojnie z odpowiedzią Pip . Będę cię obserwował, panie DLosc.
Kod:
Lub w bardziej czytelnej formie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
Python 3,
304283278 bajtówTo proste, po prostu tworzy macierz znaków i stosuje różne operacje w oparciu o to, która z nich jest.
=
I-
mają spacje, jeśli to nie jest tak źle.EDYCJA: Podziękowania dla @Shebang i @Rod za sugestie, które ostatecznie pozwoliły zaoszczędzić 21 bajtów!
EDIT2: Dzięki @Artyer za zapisanie 5 bajtów!
źródło
if'-'==t
linię warunku i zastępując jeden powyżejif t in'=-':b=[[t+' ']*s]*(2*(t>'-'))
(myślę).exec(['+ block','/ block','x block','= block','- block']['+/x=-'.find(t)])
aby zapisać ~ 18 bajtów.split()
(bez argumentów dzieli się na białe znaki). W linii 6 brakowało spacji (b=[[x+' 'for
). Możesz zrobić ostatnią linięprint(*map(''.join,b),sep='\n')
dla 1 mniej bajtów.JavaScript (ES6),
238225215202196 bajtówPrawdopodobnie można grać w golfa, ale to dopiero początek.
źródło
Scala, 275 bajtów
Stosowanie:
Wyjaśnienie:
Kod sprawdza wartość ascii znaku, aby wybrać właściwy sposób generowania obrazu. Wartości ascii tych operatorów to:
('+' -> 43), ('-' ->45), ('/' -> 47), ('=' -> 61), ('x' -> 120)
źródło
JavaScript (ES6), 156 bajtów
Gdzie
\n
reprezentuje dosłowny znak nowej linii.źródło
SyntaxError: invalid property id
to, co jest obecnie napisane, ale to zmieniło odwrotne ukośniki wokół ukośnika na apostrofy. (Dlaczego macie apostrofy zamiast apostrofów?)+
,-
i=
wyglądają inaczej niż rozmowy wyzwaniem: „porcjach poziome powinny mieć odstępy między znakami, aby zrównoważyć pionowo / poziomo różnice odległości.”Dyalog APL ,
9186 bajtówPotrzebuje
⎕IO←0
, co jest domyślne w wielu systemach. Traktuje n jako lewy argument, a jeden z + - × ÷ = jako prawy argument.Wyjaśnienie
źródło
Mathematica, 191 bajtów
Funkcja anonimowa. Pobiera ciąg i liczbę jako dane wejściowe i zwraca ciąg jako dane wyjściowe. Zdecydowanie nie najkrótszy, ale nadal fajnie się pisze.
źródło
C, 396 bajtów
Zadzwoń z:
źródło
SOML ,
104100 bajtów (niekonkurencyjny)Jest to dość konkurencyjne, ponieważ jestem prawie pewien, że wszystko, czego tu użyłem, ma dokumenty na github przed datą opublikowania tych pytań, ale parser nie obsługuje niektórych funkcji, których użyłem, więc idk.
źródło
PHP,
306292281282281275270 bajtówOch, to jest nieporęczne ... potrzebuje dalszej gry w golfa.
Mógłbym zapisać 4 bajty z fizycznymi podziałami linii lub jeden bajt z wstawieniem „\ n” do zmiennej.
źródło
C #, 744 bajtów
Myślę, że ma długość 1 miliona znaków, ale nie obchodzi mnie to, jestem tak szczęśliwy, że rozwiązałem ten problem ...
Gra w golfa:
Nie golfowany:
Testowanie:
Zbyt wiele do wklejenia i sformatowania tutaj, utworzyłem pastebin:
Pastebin
źródło
C, 331 bajtów
Operator jest przekazywany jako kod ASCII do
o
a liczba znaków don
. Dodałem tylko spacje między poziomo kolejnymi znakami do znaku plus, ponieważ był to jedyny, w którym wynik byłby zniekształcony, gdybym tego nie zrobił, a w zadaniu powiedział tylko „powinien”. Używam dwóch zagnieżdżonych pętli odliczających (oprócz-
gdy potrzebuję tylko jednej linii).=
Trzy linie, jedna z nich pusta, prosto+
za pomocąprintf
ze względu na spacje-
bezpośredni/
wydrukuj wewnętrzną pętlę od zera i zacznij od licznika zewnętrznej pętlix
mają wydruk wewnętrznej pętli na liczniku pętli zewnętrznej i jej „odwrotność”n-i
. Nadal muszę sprawdzić, dlaczego jestem tutaj osobno.Przykładowe połączenie:
źródło
Lua,
402344312 bajtów312:
344:
402:
Zmniejszono 90 znaków, a patrzenie na nie jest teraz bolesne nawet po rozwinięciu. : |
źródło