Opis zadania:
Napisz program tak krótki, jak to możliwe, aby narysować gradient promieniowy w sztuce ASCII. Rozmiar siatki wyjściowej jest predefiniowany. Punkt środkowy i znaki używane w gradiencie są dostarczane jako dane wejściowe do programu.
Rozmiar gradientu będzie wynosił 70 x 25 znaków, z następującymi specyfikacjami
- Lewy górny róg siatki ma współrzędne (0, 0).
- Gradient, składający się z dostarczonych znaków, jest odwzorowany na 35 jednostek długości . Jednostka długości to jeden znak wysokości i dwa znaki szerokości (ponieważ
monospaced fonts
zwykle mają znaki dwa razy wyższe niż są szerokie). - W obrębie tych 35 LU bieżącą odległość od punktu środkowego mnoży się przez liczbę znaków gradientu / 35, aby uzyskać indeks znaku do narysowania w tym punkcie. Liczby ułamkowe dla indeksu są tutaj zaokrąglane w kierunku zera. Jednostki długości należy pozostawić jako liczbę rzeczywistą. (Oczywiście, jeśli wyniki są takie same, wdrożenie nie ma znaczenia.)
- Poza tymi 35 LU pojawia się tylko ostatni znak gradientu. Ponieważ jednak »pasmo« ostatniego gradientu zaczyna się już w 35 LU, ostatni znak zaczyna już pojawiać się poniżej 35 LU.
Wejście:
Dane wejściowe podane są na standardowym wejściu i składają się z trzech linii, każda zakończona podziałem linii:
- W x współrzędnych punktu środkowego gradientu
- Y współrzędnych punktu środkowego gradientu
- Znaki używane do rysowania gradientu. Mogą to być spacje.
Wynik:
Dane wyjściowe to gradient zdefiniowany w powyższych regułach dotyczących wyjścia standardowego. Standardowy strumień błędów jest ignorowany. Każda linia gradientu kończy się podziałem linii. Nie mogą występować żadne inne znaki oprócz tych zdefiniowanych przez dane wejściowe.
Przykładowe wejście 1:
58
14
.:;+=xX$&
Przykładowy wynik 1:
&&$$$$$$$$XXXXXXXXxxxxxxxxx===========++++++++++++++++++++++++++++++++
&$$$$$$$$XXXXXXXXxxxxxxxxx=========+++++++++++++;;;;;;;;;;;;;;;;;;;;;+
$$$$$$$$XXXXXXXXxxxxxxxx=========+++++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;
$$$$$$$XXXXXXXXxxxxxxxx========++++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$$$$$$XXXXXXXXxxxxxxxx========+++++++++;;;;;;;;;;;;;:::::::::::::;;;;;
$$$$$XXXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;;;:::::::::::::::::::::;
$$$$$XXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;:::::::::::::::::::::::::
$$$$XXXXXXXXxxxxxxx=======++++++++;;;;;;;;;:::::::::::::::::::::::::::
$$$$XXXXXXXxxxxxxx========+++++++;;;;;;;;::::::::::...............::::
$$$XXXXXXXXxxxxxxx=======+++++++;;;;;;;;:::::::::...................::
$$$XXXXXXXxxxxxxx=======++++++++;;;;;;;::::::::.......................
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;::::::::......... ........
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::........ ......
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::....... .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::....... .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::....... .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::........ ......
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;::::::::......... ........
$$$XXXXXXXxxxxxxx=======++++++++;;;;;;;::::::::.......................
$$$XXXXXXXXxxxxxxx=======+++++++;;;;;;;;:::::::::...................::
$$$$XXXXXXXxxxxxxx========+++++++;;;;;;;;::::::::::...............::::
$$$$XXXXXXXXxxxxxxx=======++++++++;;;;;;;;;:::::::::::::::::::::::::::
$$$$$XXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;:::::::::::::::::::::::::
$$$$$XXXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;;;:::::::::::::::::::::;
$$$$$$XXXXXXXXxxxxxxxx========+++++++++;;;;;;;;;;;;;:::::::::::::;;;;;
Przykładowe wejście 2:
0
0
X.X.X.X
Przykładowe wyjście 2:
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXX............XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXX.............XXXXXXXXXX...........XXXXXXXXXX..........XXXXXXXXXX
..................XXXXXXXXXXX..........XXXXXXXXXX...........XXXXXXXXXX
................XXXXXXXXXXXX...........XXXXXXXXXX..........XXXXXXXXXXX
...............XXXXXXXXXXXX...........XXXXXXXXXX...........XXXXXXXXXXX
............XXXXXXXXXXXXXX...........XXXXXXXXXXX..........XXXXXXXXXXXX
.........XXXXXXXXXXXXXXX............XXXXXXXXXXX...........XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXX...........XXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX.............XXXXXXXXXXX...........XXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXX...........XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX................XXXXXXXXXXXX............XXXXXXXXXXXXXXX
XXXXXXXXXXX..................XXXXXXXXXXXXX............XXXXXXXXXXXXXXXX
...........................XXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXX
........................XXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXX
......................XXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXX
..................XXXXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXXXX
.............XXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX.................XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX...................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXX......................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Przykładowe wejście 3:
70
25
.:+#
Przykładowe wyjście 3:
######################################################++++++++++++++++
#################################################+++++++++++++++++++++
#############################################+++++++++++++++++++++++++
##########################################++++++++++++++++++++++++++++
#######################################+++++++++++++++++++++++++++++++
####################################++++++++++++++++++++++++++++++++++
##################################++++++++++++++++++++++++++++++++++++
################################++++++++++++++++++++++++++++++++++++++
##############################++++++++++++++++++++++++++++++++::::::::
#############################+++++++++++++++++++++++++++::::::::::::::
###########################+++++++++++++++++++++++++::::::::::::::::::
##########################++++++++++++++++++++++++::::::::::::::::::::
#########################++++++++++++++++++++++:::::::::::::::::::::::
########################+++++++++++++++++++++:::::::::::::::::::::::::
#######################++++++++++++++++++++:::::::::::::::::::::::::::
######################++++++++++++++++++++::::::::::::::::::::::::::::
#####################+++++++++++++++++++::::::::::::::::::::::::::::::
####################+++++++++++++++++++::::::::::::::::::::::::.......
####################++++++++++++++++++::::::::::::::::::::::..........
###################+++++++++++++++++++::::::::::::::::::::............
###################++++++++++++++++++:::::::::::::::::::..............
###################+++++++++++++++++:::::::::::::::::::...............
##################++++++++++++++++++::::::::::::::::::................
##################++++++++++++++++++:::::::::::::::::.................
##################++++++++++++++++++:::::::::::::::::.................
Przykładowe wejście 4
59
1
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<>|,.-#+!$%&/()=?*'_:;
Próbka wyjściowa 4
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCBzyxwutsrqonmlkjhgfedcbbbcdefghjkl
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCAzyxwutsrqonmljihgfdcba abcdfghijl
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCBzyxwutsrqonmlkjhgfedcbbbcdefghjkl
!+#-,|><97654310ZYXVUTSQPONMKJIHGEDCBAyxwvutrqponmkjihgffeedeeffghijkm
$+#-.|><98654320ZYXWUTSRQONMLKIHGFEDBAzyxwutsrqponmlkjihhggggghhijklmn
$!#-.,|<987643210YXWVUSRQPONLKJIHGEDCBAzywvutsrqponmllkjjjiiijjjkllmno
$!+#.,|><87654210ZYXVUTSRQONMLKJHGFEDCBAzywvutsrrqponnmmlllllllmmnnopq
%!+#-.|><987543210YXWVUTRQPONMLJIHGFEDCBAzyxwvutsrrqppooonnnnnoooppqrr
%$!+-.,|><87654310ZYXWVTSRQPONMLJIHGFEDCBAzyxxwvuttssrrqqqqqqqqqrrsstt
&%!+#-.,><987643210ZYXVUTSRQPONMLKJIHGFEDCBAzyyxwvvuutttssssssstttuuvv
&%$!+#.,|><986543210ZYWVUTSRQPONMLKJIHGFEDDCBAzzyyxwwwvvvuuuuuvvvwwwxy
/&%$!#-.,|><976543210ZYXVUTSRQPONMLKKJIHGFEEDCBBAAzzyyyxxxxxxxxxyyyzzA
(/&%!+#-.,|><876543210ZYXWVUTSRQPONMLKJJIHGGFEEDCCBBBAAAzzzzzzzAAABBBC
)(/%$!+#-.,|><876543210ZYXWVUTSRQPPONMLKKJIIHGGFFEEDDDCCCCCCCCCCCDDDEE
=)(&%$!+#-.,|><986543210ZYYXWVUTSRQPPONMMLKKJIIHHGGGFFFEEEEEEEEEFFFGGG
?=)(&%$!+#-.,|><9876543210ZYXWVVUTSRRQPOONMMLLKJJJIIIHHHHHHHHHHHHHIIIJ
*?=)(/%$!+#-.,|><98765432210ZYXWWVUTSSRQQPOONNMMLLLKKKJJJJJJJJJJJKKKLL
'*?=)(/&%$!+#-.,|><98765432110ZYXXWVUUTSSRRQPPOOONNNMMMMMLLLLLMMMMMNNN
_'*?=)(/&%$!+#-.,|><988765432210ZYYXWWVUUTTSSRRQQQPPPOOOOOOOOOOOOOPPPQ
:_'*?=)(/&%$!+##-.,|><9877654332100ZYYXXWVVUUTTTSSSRRRRQQQQQQQQQRRRRSS
;;:_'*?=)(/&%$!+#-.,,|><98876554322100ZZYYXXWWVVVUUUTTTTTTTTTTTTTTTUUU
;;;:_'*?=)(/&&%$!+#-.,,|><9987665443321100ZZYYYXXXWWWWVVVVVVVVVVVWWWWX
;;;;;:_'*?=)(/&%$$!+#-..,|>><9887665544322211000ZZZYYYYYYYYYYYYYYYYYZZ
;;;;;;:_'*??=)(/&%%$!+##-.,,|><<99877665544333222111100000000000001111
;;;;;;;;:_'*?==)(/&&%$!++#--.,,|>><<9887766655544433333322222223333334
Minął tydzień. Czas zaprezentować rozwiązania z konkursu naszej uczelni:
167 - Python
189 - Haskell
203 - C
210 - VB.NET
219 - C
I nasze własne rozwiązania:
91 - GolfScript
125 - Ruby
157 - PowerShell
Odpowiedzi:
Ruby 1.9,
116 114 108101 znakówźródło
Brainfuck - 1286
To jedno z moich ulubionych dzieł. Obejmuje działającą (dla niektórych definicji działających) funkcję pierwiastka kwadratowego.
Wyjście jest nieco wyłączone z powodu błędów zaokrąglania, ale nadal jest rozpoznawalne. Punkt zmiennoprzecinkowy jest powyżej mojego obecnego poziomu umiejętności. Niestety będzie to działać tylko z 16-bitowymi komórkami, co oznacza, że będzie to pies wolny.
Wyjście 1:
Wyjście 2:
źródło
Python - 141 znaków
źródło
Delphi, 200 (i 185)
Ponieważ podoba mi się tutaj ascii-art, wersja tego kodu golfowego w wersji Delphi:
Niezbyt imponujący pod względem charakteru, ponieważ musiałem użyć jednostki Math, aby połączyć się w funkcji Min (). Ponadto ReadLn () w jakiś sposób nie odczytuje liczb całkowitych i ciągów w jednym wywołaniu, więc jest to również dość drogie. Nowa linia również potrzebuje wielu znaków. Ponadto Delphi potrzebuje sporo białych znaków wokół słów kluczowych. Niezbyt dumny z tego.
W każdym razie dane wyjściowe próbki 4 dają mi:
Jeśli zaakceptujesz wcięcie, ta wersja jest nieco krótsza, zmieniając znak nowej linii na wcięcie, które prowadzi do zawijania 80 znaków (symulując znak nowej linii na standardowych konsolach 80x25):
(oszczędza to 15 znaków, w sumie 185 znaków). Jego wynikiem dla „0 0 XXXX” jest:
(Czy widzisz wcięcie ?! ;-))
źródło
APL (74)
Powodem tego, że jest zawinięty w funkcję, jest to, że modyfikacja
⎕IO
nie dotyczy reszty systemu.Wyjaśnienie:
L←⍴⊃C Y X⎕IO←⍞⎕⎕0
: Ustaw⎕IO
na0
(tworzenie tablic opartych na 0 zamiast na 1), ustaw X na⎕
(odczyt pierwszego wiersza), ustaw Y na⎕
(odczyt drugiego wiersza), ustaw C na⍞
(odczyt trzeciego wiersza, bez formatowania) i ustaw L do długości (⍴
) zC
.25 70
: wymiary matrycy.¨⍳⍵
: dla każdego elementu w macierzy, w którym każdy element ma własne współrzędne ...⍵-Y X
: różnica między punktem bieżącym a punktem środkowym1 2÷⍨
: podziel współrzędną X przez 2 (ponieważ znak jest w połowie tak szeroki, jak jest wysoki).5*⍨+/2*⍨
: weź pierwiastek kwadratowy z sumy kwadratów35÷⍨
: podziel przez 35⌊L⌊
: weź minimum liczby znaków i bieżącą wartość i zaokrągl ją w dół,/
: Wartości są nadal zawinięte w listę (tylko jednego elementu), a to utworzy odstępy na wyjściu, więc „uwolni” wartości z ich list.C[
...]
: użyj wartości, którą znaleźliśmy jako indeksu na liście znaków⎕←
: mamy teraz macierz, w której każdy element (x, y) jest znakiem dla (x, y), więc wypisz macierz.źródło
Perl 5.10, 103 znaki
źródło
Perl, 120 znaków
źródło
abs
jest tam z jakiegoś powodu.$x,$y=<>,<>;
.Windows PowerShell, 157
Nic godnego uwagi. Pobity już na śmierć:
źródło
C 176
Oto tłumaczenie mojego rozwiązania Delphi na C, oszczędzając 24 znaki:
Możesz przetestować ten kod tutaj: http://www.ideone.com/oTvHt
źródło
main()
i chyba zapisać średnik w ten sposób.Common Lisp, 173 znaków
Jedyną sztuczką, której tu używam, jest użycie
jako dosłowny znak nowej linii
źródło
scala 223 (204 bez opakowania aplikacji)
Dynamiczne ustawienie kolumn i wierszy (70, 25) pozwoliłoby na wypełnienie gradientów.
źródło
C # 311
Pomyślałem, że stworzę długi program, aby inni poczuli się lepiej:
Dane wejściowe są pobierane z konsoli, jedna linia na raz (dwie linie dla współrzędnych i jedna dla znaków gradientu).
Dzięki Joey za wskazówki.
Próbka 1: http://ideone.com/X0jIZ
Próbka 2: http://ideone.com/RvICt
źródło
int
zamiast tego użyjemyfloat
wyrażeńx-i
iy-j
staniemy się typemint
. Z tego powodu zamiast liczby zmiennoprzecinkowej zostanie wywołana wartość `int Math.Abs (wartość int), co spowoduje utratę precyzji. Próbowałem i mam jakieśint
s zaoszczędzą więcej;)). Aha, i*.5
kosztuje tylko jeden znak.