Намалюйте цей алмазний візерунок


24

Наведена нижче модель буде основою цього виклику.

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

З огляду на ширину та висоту вводу, кожен із них >=1виводить вищевказаний художній зразок ASCII, який багато разів повторювався, приєднуючись (і перекриваючись) невеликими діамантами.

Наприклад, ось вхід з width = 2та height = 1:

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

Ось вхід width = 3і height = 2:

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

Правила та введення-виведення

  • Введення та вихід можуть бути надані будь-яким зручним методом .
  • Ви можете роздрукувати його до STDOUT або повернути його як результат функції.
  • Прийнятна або повна програма, або функція.
  • Будь-яка кількість сторонніх пробілів є прийнятною, доки символи не належним чином розташовуються.
  • Стандартні лазівки заборонені.
  • Це тому діють усі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Відповіді:


10

Полотно , 26 25 24 21 18 байт

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

Спробуйте тут!

-3 байти шляхом виправлення не повторюваного полотна

Пояснення:

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

wow полотно O_o занадто коротке
лише ASCII

6

JavaScript (ES8), 167 161 159 байт

NB: Це кодування шаблону. Побачити іншу мою відповідь щодо коротшого математичного підходу.

Вводиться як " (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)

Спробуйте в Інтернеті!

Як?

Верхню половину шаблону кодуємо цифрами:

  • 0 означає\
  • 1 означає/
  • n=2 до7 означаєn1 пробіл

Це дає:

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

Для нижньої половини використовуємо рядки 4,3,2,0 з /і \перевернуті.


6

JavaScript (ES6), 139 байт

Це використовує зовсім інший підхід від моєї початкової відповіді, тому я публікую це окремо.

Вводиться як "(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)

Спробуйте в Інтернеті!

Як?

Враховуючи ширину ш і висоту h , ми намалюємо вихідний символ за символом через сітку, яка є:

  • 10w+3 символів
  • 10h+2 символи у висоту

х10w+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

Для всіх інших комірок ми обчислюємо:

  • a=(xy)mod10
  • d=(x+y)mod10

Малюємо а, "/"якщо:

((умод10)>3 і г=5) або ((умод10)<6 і г=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   | ....../........./........./.....

Малюємо а, "\"якщо:

((умод10)>3 і а=8) або ((умод10)<6 і а=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   | .....\.........\.........\......

Або ми малюємо пробіл, якщо жодна з цих умов не виконується.


Це дійсно круто.
AdmBorkBork


@Arnauld Я знав, що це твоя відповідь, просто подивившись на код: D
недолік

6

C ++ (gcc) , 137 байт

#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;}

Спробуйте в Інтернеті!

Пояснення

_______________________________
   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

1
Недійсна, не повна програма, ані функція
лише для ASCII

1
Але, 10/10, дуже приємний метод
лише для ASCII

1
Які відповіді точно не є повноцінними програмами чи функціями? (просто запитую, можливо, це пропустили) Зверніть увагу, що деяким мовам (наприклад, мовам сценаріїв) не потрібна табличка для повних програм
лише для ASCII


1
159 , але не впевнений, чи правильне виведення з функції (можливо, це)
лише для ASCII

4

Haskell , 179 байт

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)$["\\/\\      /","   \\    / ","    \\  /  ","     \\/   ","     /\\   "]

Спробуйте в Інтернеті!


Haskell , 181 байт

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)

Спробуйте в Інтернеті!


1
Використання клавіші reverse.map(map k)<>idOver (++).reverse=<<map(map k)заощаджує 3 байти в обох рішеннях.
ბიმო

1
Ах, і в 2 - м один map tможе стати t<$>і take$10*x+2зберігає ще один байт теж , і , нарешті , ви можете використовувати cycle"\\ /"!!nбільш "\\ /"!!mod n 3- тепер другий один коротше :) Спробуйте його в Інтернеті!
ბიმო

3

Вугілля , 24 22 20 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

´\/↘²

Намалюйте одну вісімку оригінального візерунка.

‖M↘L

Дублюйте його три рази, щоб завершити оригінальний візерунок.

F⊖NCχ⁰

Скопіюйте потрібну кількість разів горизонтально.

F⊖NC⁰χ

Скопіюйте потрібну кількість разів вертикально.


3

Powershell, 146 байт

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+$_]})}

Пояснення

Візерунок - це масив 10x10 символів:

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

Сценарій:

  • повторює візерунок;
  • додає стовпці [0,1] до кінця кожного рядка;
  • додає рядки [0,1] до кінця виводу.

Дві речі для гольфу:

  1. Масив шаблонів, відображений у рядок довжиною 100 байт;
  2. Рядок, зведений простим replace.


1

PHP, 159 байт

візерунок, узятий з маззи; переведений на 1-2-3, перетворений на базовий26 -> розшифрований програмою

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,"\ /")),"
";

потрібен PHP 5.5 або новішої версії. Запустіть -nrабо спробуйте в Інтернеті .

обчислення може бути коротшим (як це було для Арнальда). Я можу розібратися в цьому.



1

Пітон 3 , 194 192 187 127 байт

@ Рішення лише для ASCII:

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))

Спробуйте в Інтернеті!


Оригінальне рішення

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]

Спробуйте в Інтернеті!

-2 байти завдяки @Black Owl Kai, який показує, що вершини та днища можна отримати з генерованого масиву замість окремих змінних.

Ще 5 байт завдяки @Black Owl Kai, який використовує більш креативний спосіб зберігання алмазів

Створює цю частину кожного алмазу:

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

/\Додається в кінці кожного рядка , щоб завершити його. Потім /s і \s поміняються місцями, щоб утворювати верх кожного алмазу, і порядок ліній змінюється на нижню половину. Нарешті, він додає в самому верхньому рядку /\s та в нижньому рядку \/s для завершення зображення.


192 байти , не використовуючи змінні b і c
Чорна сова Кай

187 байт , видаливши два +=/ *=завдання та перевернувши увесь діамант догори дном, полегшивши зберігання останнього рядка
Чорна сова Кай


147 , використовує рішення c ++
лише для ASCII

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.