Narysuj ten wzór diamentu

24

Poniższy wzór będzie stanowił podstawę tego wyzwania.

     /\
     \/
     /\
    /  \
   /    \
/\/      \/\
\/\      /\/
   \    /
    \  /
     \/
     /\
     \/

Biorąc pod uwagę szerokość i wysokość wejściową, każdy z nich >=1, wyjściowy wzór artystyczny ASCII powtórzył to wiele razy, łącząc (i nakładając się) na małe diamenty.

Na przykład oto dane wejściowe za pomocą width = 2i height = 1:

     /\        /\
     \/        \/
     /\        /\
    /  \      /  \
   /    \    /    \
/\/      \/\/      \/\
\/\      /\/\      /\/
   \    /    \    /
    \  /      \  /
     \/        \/
     /\        /\
     \/        \/

Oto dane wejściowe width = 3i height = 2:

     /\        /\        /\
     \/        \/        \/
     /\        /\        /\
    /  \      /  \      /  \
   /    \    /    \    /    \
/\/      \/\/      \/\/      \/\
\/\      /\/\      /\/\      /\/
   \    /    \    /    \    /
    \  /      \  /      \  /
     \/        \/        \/
     /\        /\        /\
     \/        \/        \/
     /\        /\        /\
    /  \      /  \      /  \
   /    \    /    \    /    \
/\/      \/\/      \/\/      \/\
\/\      /\/\      /\/\      /\/
   \    /    \    /    \    /
    \  /      \  /      \  /
     \/        \/        \/
     /\        /\        /\
     \/        \/        \/

Reguły i I / O

  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Możesz wydrukować go do STDOUT lub zwrócić jako wynik funkcji.
  • Dopuszczalny jest pełny program lub funkcja.
  • Dopuszczalna jest dowolna ilość obcych białych znaków, o ile znaki są odpowiednio ustawione w jednej linii.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
AdmBorkBork
źródło
1
Luźno spokrewniony
Luis Mendo,

Odpowiedzi:

10

Płótno , 26 25 24 21 18 bajtów

4/╬/╬⁰r:⤢n↷⁸{A×├m↷

Wypróbuj tutaj!

-3 bajty poprzez naprawienie nie powtarzającego się płótna

Wyjaśnienie:

4/╬                 quad-palindromize a 4-long diagonal - big inner diamond
   /╬               quad-palindromize "/" - small diamond
     ⁰r             join the two vertically, centered
       :⤢n          overlap with transpose
           ↷        and rotate the thing clockwise
            ⁸{      for each input
              A×      times 10
                ├     plus 2
                 m    mold the canvas to that width
                  ↷   and rotate clockwise, setting up for the next iteration
dzaima
źródło
wow O_o płótno jest za krótkie
tylko ASCII,
6

JavaScript (ES8), 167 161 159 bajtów

NB: To koduje wzorzec. Zobacz moją drugą odpowiedź na krótsze podejście matematyczne.

Pobiera dane wejściowe jako (width)(height).

w=>h=>(g=h=>h?g(--h)+`
`+([4106,4016,31305,21504,17010]['0102344320'[h%=10]]+'').replace(/./g,c=>'\\/'[c^h>5]||''.padEnd(c-1)).repeat(w+1).slice(8):'')(h*10+2)

Wypróbuj online!

W jaki sposób?

Górną połowę wzoru kodujemy cyframi:

  • 0 oznacza\
  • 1 oznacza/
  • n=2 do7 oznaczan1 spacji

To daje:

0  ···/\·····  -->  [3 spaces] [/] [\] [5 spaces]             -->  4106
1  ···\/·····  -->  [3 spaces] [\] [/] [5 spaces]             -->  4016
0  ···/\·····  -->  [3 spaces] [/] [\] [5 spaces]             -->  4106
2  ··/··\····  -->  [2 spaces] [/] [2 spaces] [\] [4 spaces]  -->  31305
3  ·/····\···  -->  [1 space] [/] [4 spaces] [\] [3 spaces]   -->  21504
4  /······\/\  -->  [/] [6 spaces] [\] [/] [\]                -->  17010

W dolnej połowie używamy wierszy 4,3,2,0 z /i \odwróconych.

Arnauld
źródło
6

JavaScript (ES6), 139 bajtów

Używa to zupełnie innego podejścia niż moja pierwotna odpowiedź, więc zamieszczam to osobno.

Pobiera dane wejściowe jako (width)(height).

w=>h=>(g=x=>y>8?` /\\
`[a=(x+y*9)%10,d=(x+y)%10,x?(y%10>3&&2*(a==8)|d==5)|(y%10<6&&2*(a==6)|d==7):3]+g(x--?x:--y&&w):'')(w=w*10+2,y=-~h*10)

Wypróbuj online!

W jaki sposób?

Biorąc pod uwagę szerokość w wysokość h , znak wyjściowy znak po znaku rysujemy na siatce, która jest:

  • 10w+3 znaki szerokości
  • 10h+2 znaki wysokości

x10w+20y10h+109

w=3h=2

(32,30)(31,30)(0,30)(32,29)(31,29)(0,29)(32,9)(31,9)(0,9)

x=0

Dla wszystkich innych komórek obliczamy:

  • a=(xy)mod10
  • d=(x+y)mod10 (stała ponad przekątnymi)

Rysujemy, "/"jeśli:

((ymod10)>3 and d=5) or ((ymod10)<6 and d=7)

 y  | y % 10 | output (w = 3, h = 1)
----+--------+----------------------------------
 20 |    0   | ...../........./........./......
 19 |    9   | ....../........./........./.....
 18 |    8   | ...../........./........./......
 17 |    7   | ..../........./........./.......
 16 |    6   | .../........./........./........
 15 |    5   | /./......././......././......./.
 14 |    4   | ./......././......././......././
 13 |    3   | ......../........./........./...
 12 |    2   | ......./........./........./....
 11 |    1   | ....../........./........./.....
 10 |    0   | ...../........./........./......
  9 |    9   | ....../........./........./.....

Rysujemy, "\"jeśli:

((ymod10)>3 and a=8) or ((ymod10)<6 and a=6)

 y  | y % 10 | output (w = 3, h = 1)
----+--------+----------------------------------
 20 |    0   | ......\.........\.........\.....
 19 |    9   | .....\.........\.........\......
 18 |    8   | ......\.........\.........\.....
 17 |    7   | .......\.........\.........\....
 16 |    6   | ........\.........\.........\...
 15 |    5   | .\.......\.\.......\.\.......\.\
 14 |    4   | \.\.......\.\.......\.\.......\.
 13 |    3   | ...\.........\.........\........
 12 |    2   | ....\.........\.........\.......
 11 |    1   | .....\.........\.........\......
 10 |    0   | ......\.........\.........\.....
  9 |    9   | .....\.........\.........\......

Lub rysujemy miejsce, jeśli żaden z tych warunków nie jest spełniony.

Arnauld
źródło
To jest naprawdę fajne.
AdmBorkBork,
@Arnauld Wiedziałem, że to twoja odpowiedź, patrząc tylko na kod: D
flawr
6

C ++ (gcc) , 137 bajtów

#include<cstdio>
auto p(int x,int y){int n=10,t=x=++x*n;for(++y*=n;y>8;)t>7?putchar(t<9?y--,n:t%n-y%n+4&7?t%n+y%n-5&7?32:47:92),t--:t=x;}

Wypróbuj online!

Wyjaśnienie

_______________________________
   098765432109876.... 
   9    \/    .     factor =y%10 - x10
   8    /\    .     if factor = -4 || 4. Print --> '\'  47
   7   /  \   . 
   6  /    \  .     factor =x%10+y%10;  
   5\/      \/*-.   if factor = 5 || 13 --> /  92
   4/\      /\   `.
   3  \    /       `->  * is 9,5 => \
   2   \  /      
   1    \/   
   0    /\       
   9
AZTECCO
źródło
1
Niepoprawny, nie pełny program ani funkcja
tylko ASCII
1
Ale 10/10 bardzo fajna metoda
tylko ASCII
1
Które odpowiedzi dokładnie nie są pełnymi programami lub funkcjami? (tylko pytam, mogłem to przeoczyć) Zauważ, że niektóre języki (np. języki skryptowe) nie potrzebują podstaw dla pełnych programów
tylko ASCII
1
159 , ale nie jestem pewien, czy wyjście z funkcji jest poprawne (prawdopodobnie tak jest)
tylko ASCII
4

Haskell , 179 bajtów

k '\\'='/'
k '/'='\\'
k x=x
f x=take(10*x+2)
w#h=map(f w.cycle).f h.drop 9.cycle$(++).reverse=<<map(map k)$["\\/\\      /","   \\    / ","    \\  /  ","     \\/   ","     /\\   "]

Wypróbuj online!


Haskell , 181 bajtów

k '\\'='/'
k '/'='\\'
k x=x
f x=take(10*x+2)
w#h=map(f w.cycle).f h.drop 9.cycle$(++).reverse=<<map(map k)$map t[49200,36058,31630,30010,29038]
t 0=""
t n="\\ /"!!mod n 3:t(div n 3)

Wypróbuj online!

ovs
źródło
1
Użycie reverse.map(map k)<>idover (++).reverse=<<map(map k)pozwala zaoszczędzić 3 bajty w obu rozwiązaniach.
ბიმო
1
Ach, a na drugim map tmożna stać się t<$>i take$10*x+2oszczędzać kolejny bajt, a na koniec możesz użyć cycle"\\ /"!!nwięcej "\\ /"!!mod n 3- teraz drugi jest krótszy :) Wypróbuj online!
ბიმო
3

Węgiel drzewny , 24 22 20 bajtów

\/↘²‖M↘LF⊖NCχ⁰F⊖NC⁰χ

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

´\/↘²

Narysuj jedną ósmą oryginalnego wzoru.

‖M↘L

Powiel go trzy razy, aby ukończyć oryginalny wzór.

F⊖NCχ⁰

Skopiuj wymaganą liczbę razy w poziomie.

F⊖NC⁰χ

Skopiuj wymaganą liczbę razy w pionie.

Neil
źródło
3

PowerShell, 146 bajtów

param($w,$h)0..9*$h+0,1|%{$y=$_
-join(0..9*$w+0,1|%{('3  /\33  \/33  /\33 /  \3  /3 \ /\/33\\/\33/3\3 /3  \  /33 \/3'-replace3,'   ')[$y*10+$_]})}

Wyjaśnienie

Wzór ma tablicę 10x10 znaków:

     /\   
     \/   
     /\   
    /  \  
   /    \ 
/\/      \
\/\      /
   \    / 
    \  /  
     \/   

Scenariusz:

  • powtarza wzór;
  • dołącza kolumny [0,1] na końcu każdej linii;
  • dołącza wiersze [0,1] na końcu wyniku.

Dwie rzeczy do golfa:

  1. Tablica wzorców odwzorowana na łańcuch o długości 100 bajtów;
  2. Ciąg zredukowany przez proste replace.
mazzy
źródło
2

Perl 5 -p , 148 bajtów

$_='3A3'x$_.$/.'3B3
3A3
2/2\\2
1/4\\1
A6A
B6B
1\\4/1
2\\2/2
3B3
3A3
'=~s/^.*$/$&x$_/mger x<>.'3B3'x$_;s|A+|/\\|g;s|B+|\\/|g;s/\d/$"x$&/ge;s|^ |  |gm

Wypróbuj online!

Xcali
źródło
1

PHP, 159 bajtów

wzór zaczerpnięty z mazzy; przetłumaczone na 1-2-3, przekonwertowane na base26 -> zdekodowane przez program

while($y<$argv[2]*10+2)echo str_pad("",$argv[1]*10+2,strtr(base_convert([jng1,jnnb,jng1,jofn,k333,"1h4p5",23814,k94d,k02h,jnnb][$y++%10],26,4),312,"\ /")),"
";

wymaga PHP 5.5 lub nowszego. Uruchom -nrlub wypróbuj online .

obliczenia mogą być krótsze (jak w przypadku Arnaulda). Mogę spojrzeć na to.

Tytus
źródło
1

Kotlin , 196 135 bajtów

Zaoszczędzono 61 bajtów dzięki sugestii ASCII-only, aby użyć algorytmu C ++ AZTECCO.

{h,w->var r=""
for(l in 9..h*10+10){for(c in 9..w*10+10){r+=when{(l%10+c%10)%8==5->'/'
(l%10-c%10+8)%8==4->'\\'
else->' '}}
r+='\n'}
r}

Wypróbuj online!

JohnWells
źródło
1
136 , kradzież z nowej odpowiedzi w C ++
tylko
1

Python 3 , 194 192 187 127 bajtów

Rozwiązanie @ ASCII-only:

lambda w,h,n=10:"\n".join("".join([" /","\\"][(j%n-i%n)%8==4][(j%n+i%n)%8==5]for i in range(-1,w*n+1))for j in range(-1,h*n+1))

Wypróbuj online!


Oryginalne rozwiązanie

n="\n"
def f(w,h):a=[r"     /\   "*w,r"     \/   "*w,r"    \  /  "*w,r"   \    / "*w,r"\/\      /"*w+r"\/"];return a[0]+n+n.join(([i.translate({47:92,92:47})for i in a]+a[::-1])*h)+n+a[1]

Wypróbuj online!

-2 bajty dzięki @Black Owl Kai pokazując, że dostęp do górnych i dolnych części można uzyskać z wygenerowanej tablicy zamiast w osobnych zmiennych.

-5 więcej bajtów dzięki @Black Owl Kai wykorzystującym bardziej kreatywny sposób przechowywania diamentów

Generuje tę część każdego diamentu:

     /\
     \/
    \  /
   \    /
\/\      /\/

/\Dodany na końcu każdego rzędu w celu jej zakończenia. Następnie, /s i \s są zamieniane, aby utworzyć górę każdego diamentu, a kolejność linii jest odwrócona, aby utworzyć dolną połowę. Na koniec dodaje w samym górnym wierszu /\s i w dolnym rzędzie \/s, aby uzupełnić obraz.

Neil A.
źródło
192 bajty , nie używając zmiennych b i c
Black Owl Kai
187 bajtów poprzez usunięcie dwóch +=/ *=przypisań i odwrócenie całego diamentu do góry nogami, co ułatwia przechowywanie ostatniego ciągu
Black Owl Kai
181
Tylko ASCII
147 , używa rozwiązania c ++
tylko ASCII
127
Tylko ASCII