Celem tego wyzwania jest wyprodukowanie wersji ASCII okładki tego wspaniałego albumu zespołu rockowego Pink Floyd.
Ceglane skrzyżowania składają się z postaci _
i |
. Cegły mają szerokość 7 i wysokość 2 znaki, z wyłączeniem skrzyżowań. Zatem podstawową jednostką, w tym skrzyżowaniami, jest:
_________
| |
| |
_________
Każdy rząd cegieł jest przesunięty o połowę szerokości cegły (4 znaki) w stosunku do poprzedniego rzędu:
________________________________________
| | | | |
| | | | |
________________________________________
| | | | |
| | | | |
________________________________________
| | | | |
| | | | |
Ściana jest parametryzowana w następujący sposób. Wszystkie parametry są mierzone w znakach, w tym skrzyżowaniach:
- Poziome przesunięcie pierwszego rzędu
F
. Jest to odległość między lewym marginesem a pierwszym pionowym skrzyżowaniem najwyższego rzędu. (Pamiętaj również o względnym przesunięciu między cegłami między rzędami). Jego możliwych wartości0
,1
, ...,7
. - Całkowita szerokość ,
W
. Obejmuje to skrzyżowania. Jego wartość jest dodatnią liczbą całkowitą. - Łączna wysokość ,
H
. Obejmuje to skrzyżowania. Jego wartość jest dodatnią liczbą całkowitą.
Szczyt ściany zawsze pokrywa się z górą rzędu. Dno może być poszarpane (jeśli całkowita wysokość nie jest wielokrotnością 3
). Na przykład, tutaj jest wyjście 6
, 44
, 11
:
____________________________________________
| | | | |
| | | | |
____________________________________________
| | | | | |
| | | | | |
____________________________________________
| | | | |
| | | | |
____________________________________________
| | | | | |
oraz wizualne objaśnienie parametrów:
F=6
......
. ____________________________________________
. | | | | |
. | | | | |
. ____________________________________________
. | | | | | |
H=11 . | | | | | |
. ____________________________________________
. | | | | |
. | | | | |
. ____________________________________________
. | | | | | |
............................................
W=44
Dodatkowe zasady
Możesz podać program lub funkcję.
Format wejściowy jest elastyczny jak zwykle. Dane wyjściowe mogą być przekazywane przez STDOUT lub argument zwracany przez funkcję. W tym przypadku może to być ciąg znaków z nowymi liniami lub tablica ciągów.
Końcowe spacje lub znaki nowej linii są dozwolone.
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
Dane wejściowe są w podanej wyżej kolejności, to znaczy: przesunięcie w poziomie pierwszego rzędu, całkowita szerokość, całkowita wysokość.
6, 44, 11:
____________________________________________
| | | | |
| | | | |
____________________________________________
| | | | | |
| | | | | |
____________________________________________
| | | | |
| | | | |
____________________________________________
| | | | | |
2, 20, 10:
____________________
| | |
| | |
____________________
| |
| |
____________________
| | |
| | |
____________________
1, 1, 1:
_
1, 2, 3:
__
|
|
3, 80, 21:
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
Odpowiedzi:
Pyth,
4327 bajtówI potrzebują do golfa to mocno ... wynik jest zbyt wstydliwe.
Wypróbuj już online.
Format wejściowy
Format wyjściowy
Wyjaśnienie
źródło
C,
86858382 bajtów3 bajty zapisane dzięki Lynn.
1 bajt zapisany dzięki Charlie.
źródło
for(i=0;++i<w*h;)
lub jeślii
jest lokalny (param trick):for(;++i<w*h;)
i;
nai=1;
i zapisz jeszcze jeden bajt w pętli for.for(i=1;i<w*h;++i)
->for(i=0;++i<w*h;)
zapisuje 1C, 92 bajty
Wywołaj jako
b(F, W, H)
.źródło
Perl, 63 bajty
Licząc shebang jako 2, dane wejściowe są pobierane ze standardowego wejścia, oddzielone spacjami.
Przykładowe użycie
źródło
Haskell, 83 bajty
Definiuje to potrójną funkcję poprawki,
!
która zwraca listę ciągów znaków. Przykład użycia:Jak to działa:
źródło
JavaScript (ES6),
9695 bajtówObjaśnienie: Tworzy ciąg powtarzających się 7 spacji plus
|
wzorzec lub tylko powtarzane_
s, ale co najmniej wystarczająco długi, aby móc wyodrębnićw
znaki wymagane dla każdego wiersza. Pierwsze trzy rzędy zaczynają się od pozycji,f^7
a następnie następne trzy rzędy zaczynają się od pozycjif^3
, więc osiągam to poprzezprzełączanie bitu 2 zza pomocą przeciwnego bitu 2 w ostatnich dwóch rzędach każdego bloku 6 dla oszczędności 1 bajt.f
co trzeciego rzęduźródło
MATL,
423633 bajtówFormat wejściowy jest:
nCols
,offset
,nRows
Wypróbuj online
Podejście polega na tym, że ustawiamy „szablon”, do którego następnie indeksujemy, używając indeksów wierszy (
[1 2 ... nRows]
) i indeksów kolumn przesuniętych o pierwsze wejście ([1 2 ... nCols] - shift
). Dzięki modułowemu indeksowaniu MATL, automatycznie wygeneruje kafelkowe wyjście. Na marginesie, aby zaoszczędzić trochę miejsca, technicznie pracuję z transponowaną wersją szablonu, a następnie biorę transpozycję (!
) na końcu.Szablon jest następujący:
źródło
Python 2,
9388 bajtówDrugi poziom wcięcia to zakładkaOszczędność niektórych bajtów dzięki Dziurawej Zakonnicy i własnym modyfikacjom, teraz także poprawne przesunięcie:poprzedni kod:
Taka sama długość jak nienazwana lambda:
źródło
F,W,H=input()
print
h/3%2*4
lubh%6/3*4
zamiast4*(h%6>3)
print
oświadczenie w tym samym wierszu, cofor
oświadczenie"| "
jest krótszy niż,("|"+7*" ")
jeśli liczę poprawnieQBasic,
121109 bajtów(Testowane na QB64)
Dzięki @DLosc za grę w golfa moim
IF
stwierdzeniem z matematycznym odpowiednikiem. To było warte 12 bajtów.Ogólna metoda:
Pętli każdej komórce jednej na raz i ustalić, czy powinien to być
_
,albo
|
w zależności od jego lokalizacji.MOD
instrukcje i logika logiczna służą do określania granic cegieł i tego, jak bardzo rozłożyć cegły.Kod:
Uwaga dotycząca użytkowania:
QBasic oczekuje, że dane wejściowe będą liczbami oddzielonymi przecinkami.
źródło
IF
/THEN
dodaje jeszcze więcej nawiasów, ale oszczędza 12 bajtów:?CHR$((y MOD 3>0)*(((x-(y MOD 6>3)*4)MOD 8=F)*92+63)+95);
Java,
149,147,146, 143 bajtówGra w golfa:
Nie golfowany:
źródło
> 0
co mogłoby zapisać dwie postacie. I oczywiście można łączyć deklaracje zint y=0,x
.int
przedx
i użyćint y=0,x
w pierwszej pętli for, aby zapisać 2 bajty. Ponadto obecnie możesz zmienićy%3==0
nay%3<1
. (To nie jest możliwe,...%8==0
aby...&8<1
chociaż, ponieważ operacja może wrócić liczbę ujemną.)int...o
jako parametru i zamianaw
nao[1]
,h
nao[2]
io
nao[0]
to -3 bajty.Rubin,
7266 bajtówDzięki @Value Ink za 6 bajtów!
Proste mnożenie i krojenie ciągów.
Działa w Ruby 2.3.0 (w wersji 2.1 ideone wystąpił błąd składniowy).
źródło
i%6/4*4
zamiast(i%6>3?4:0)
i użyj?_
zamiast'_'
,?|
zamiast'|'
.?
sztuczce single char, a część „matematyczna” robi wrażenie!((' '*7+?|)*w)[f^7^i%6&4,w]
oszczędza ci dwa bajty.Julia:
150128116108107 bajtówuruchomić z argumentami:
julia -e 'o=2;h=18;w=40;include("codegolf.jl")'
Jeśli czujesz, że dzwonienie z bash jest oszustwem i chcesz mieć funkcję wewnątrz interpretera, to wersja funkcji ma 117 bajtów :)
próbny
(Dzięki, @ glen-o za dodatkową wskazówkę oszczędzającą bajty!)
źródło
h
iw
na cegły, nie w znakachrepmat([32],6,8)
), a następnie zmieniając nazwę repmat, aby ogolić inny znak (g=repmat;b=g([32],6,8)
i późniejb=g(b,h,w)[1:h,o+1:o+w+1]
). Następnie zastąpićreinterpret
zmap
. Według moich obliczeń zaoszczędzisz 9 bajtów między tymi zmianami.JavaScript,
172168165157147142137 137 bajtówźródło
s.repeat(w)
zamiastArray(w).fill(s).join``
?Dyalog APL, 29 bajtów
↑⎕⍴⎕⍴¨a,4⌽¨a←'_',2⍴⊂⌽⎕⌽¯8↑'|'
Testy:
6 44 11
,2 20 10
,1 1 1
,1 2 3
,3 80 21
⎕
jest analizowany wkład; jako wyrażenie wykonuje od prawej do lewej, to prosi oF
,W
iH
w tej kolejności¯8↑'|'
jest' |'
⎕⌽
obraca się, tnie znaki F z przodu i kładzie je na końcu łańcuchadrugi
⌽
oznacza odwrócenie'_',2⍴⊂
tworzy 3 krotkę „_”, a następnie dwie osobne kopie ciągua,4⌽¨a←
dodajmy 4-rotację wszystkiego do tej pory, otrzymujemy 6-krotność⎕⍴¨
przekształć każdy element na szerokość⎕⍴
zmienić kształt na wysokość↑
zmieszać wektor wektorów w macierzźródło
Faktycznie ,
444340 bajtówJest to właściwie port algorytmu w odpowiedzi JS Neila . Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!
Ungolfing:
źródło
PowerShell ,
10188 bajtówWypróbuj online!
źródło
Oktawa
8076 bajtówuruchomić z terminala:
octave --eval "o=2;h=18;w=44; codegolf"
(alternatywnie, jeśli uważasz, że wywołanie terminalu oszukuje: p, wówczas implementacja funkcji anonimowej zajmuje 86 bajtów :)
Zadzwoń
f(2,18,44)
do tłumacza oktawy.źródło
Bash + Sed,
411395381370 bajtów:Cóż, oto moja pierwsza odpowiedź w języku Bash lub w dowolnym innym języku skryptowym. Jest to także zdecydowanie najdłuższa odpowiedź tutaj. Pobiera sekwencję rozdzielonych spacjami argumentów wiersza poleceń w formacie
Offset Width Height
. Może to być prawdopodobnie o wiele krótsze niż obecnie, więc wszelkie wskazówki i / lub triki dotyczące gry w golfa są doceniane bardziej.źródło
Delphi / Object Pascal,
305,302, 292 bajtówPełny program konsoli, który odczytuje 3 parametry.
bez golfa
Niestety, Delphi nie ma potrójnego operatora i jest to dość szczegółowy język.
walizka testowa
Edycja: Można ogolić 3 bajty, używając bajtu jako typu dla wszystkich zmiennych.
Edycja 2: A aplikacje konsolowe nie potrzebują deklaracji programu, -10
źródło