Загалом, це просто, е, ще одна хитрість у коді гольфу


64

Мета цього виклику - створити версію ASCII обкладинки цього чудового альбому рок-групи Pink Floyd.

Цегляні стики виготовлені з символів _і |. Цегли мають ширину 7 та висоту 2 символи, виключаючи стики. Отже, базовою одиницею, включаючи переходи, є:

_________
|       |
|       |
_________

Кожен ряд цегли зміщується на половину ширини цегли (4 символи) щодо попереднього ряду:

________________________________________
  |       |       |       |       |     
  |       |       |       |       |     
________________________________________
      |       |       |       |       | 
      |       |       |       |       | 
________________________________________
  |       |       |       |       |     
  |       |       |       |       |     

Стіна параметризується наступним чином. Всі параметри вимірюються символами, включаючи переходи:

  1. Горизонтальне зміщення першого ряду, F. Це відстань між лівим полем та першим вертикальним стиком найвищого ряду. (Згадайте також відносне зміщення напівцеглини між рядками). Його можливі значення 0, 1, ..., 7.
  2. Загальна ширина , W. Сюди входять переходи. Його значення - натуральне число.
  3. Загальна висота , H. Сюди входять переходи. Його значення - натуральне число.

Верхівка стіни завжди збігається з верхом ряду. Дно може бути нерівним (якщо загальна висота не кратна 3). Наприклад, ось вихід для 6, 44, 11:

____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       |     
  |       |       |       |       |       |     
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       |     

і наочне пояснення параметрів:

          F=6
         ......   
     .   ____________________________________________
     .         |       |       |       |       |    
     .         |       |       |       |       |     
     .   ____________________________________________
     .     |       |       |       |       |       | 
H=11 .     |       |       |       |       |       |      
     .   ____________________________________________
     .         |       |       |       |       |     
     .         |       |       |       |       |     
     .   ____________________________________________
     .     |       |       |       |       |       |      

         ............................................
                             W=44

Додаткові правила

Ви можете надати програму або функцію.

Формат введення гнучки, як зазвичай. Вихід може бути через STDOUT або аргумент, повернутий функцією. У цьому випадку це може бути рядок з новими рядками або масив рядків.

Дозволені пробіли або нові рядки.

Виграє найкоротший код у байтах.

Тестові справи

Введення в порядку, наведеному вище, тобто горизонтальне зміщення першого ряду, загальна ширина, загальна висота.

6, 44, 11:
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 
  |       |       |       |       |       | 
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       |     


2, 20, 10:
____________________
  |       |       | 
  |       |       | 
____________________
      |       |     
      |       |     
____________________
  |       |       | 
  |       |       | 
____________________


1, 1, 1:
_


1, 2, 3:
__
 |
 |


3, 80, 21:
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    

34
Ви отримали мене з кліком у hnq
Rohan Jhunjhunwala

2
@RohanJhunjhunwala Звучить справа
Insane

4
Дякую вам за відповідність кількості складів у тексті пісень ... Ви б не повірили, скільки людей намагаються відкрутити пісню і неправильно скласти конфігурацію, це зводить мене з гайки!
Кріс Сірефіс

1
@ChrisCirefice Ха-ха, дякую! Назва була важливою частиною цього виклику
Луїс Мендо

Відповіді:


17

Pyth, 43 27 байт

Мені потрібно сильно гольфувати ... оцінка занадто ганебна.

AQVE<*H?%N3X*8d+G*4/N3\|\_H

Спробуйте вже онлайн.

Формат введення

6,44
11

Формат виводу

____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 
  |       |       |       |       |       | 
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 

Пояснення

AQVE<*H?%N3X*8d+G*4/N3\|\_H   First two inputs as list in Q,
                              third input as E.

AQ                            Assign G to the first item in Q
                              and H to the second item in Q.
  VE                          For N from 0 to E-1:
                   /N3            N floor-div 3.
                                    if N gives a remainder of 3 or 4 or 5
                                    when divided by 6, this will be odd;
                                    otherwise, this will be even.
                 *4               Multiply by 4.
                                    if the above is odd, this will leave
                                    a remainder of 4 when divided by 8;
                                    otherwise, the remainder would be 0.
               +G                 Add G (as an offset).
           X*8d       \|          In the string "        " (*8d),
                                  replace (X) the character with the
                                  index above with "|" (modular indexing,
                                  hence the manipulation above).
       ?%N3             \_        If N%3 is non-zero, use the above;
                                  otherwise, use "_".
     *H                           The above repeated H times.
    <                     H       Take the first H characters of above.
                                  Implicitly print with newline.

схоже на те, що ти перемагаєш
словаз того

30

C, 86 85 83 82 байт

3 байти збережено завдяки Лінні.
1 байт збережено завдяки Чарлі.

i;f(o,w,h){++w;for(i=0;++i<w*h;)putchar(i%w?i/w%3?i%w+i/w/3*4+~o&7?32:124:95:10);}

1
for(i=0;++i<w*h;)або якщо iзроблений місцевий (парам-трюк):for(;++i<w*h;)
Чарлі

замінити i;на i=1;і зберегти один байт протягом циклу.
xryl669

for(i=1;i<w*h;++i)-> for(i=0;++i<w*h;)економить 1
Yay295

@ xryl669 Це не вірно, функції повинні бути багаторазовими.
orlp

@ Yay295 Я приписував цьому Чарлі, оскільки він опублікував це на 7 годин раніше.
orlp


13

Perl, 63 байти

#!perl -nl
$y+=print+map$y%3?$_++-$`&7?$":'|':_,($y%6&4)x$&for/ \d+/..$'

Підрахувавши шебанг як 2, вхід береться зі stdin, пробіл відокремлений.

Використання зразка

$ echo 2 20 10 | perl bricks.pl
____________________
  |       |       |
  |       |       |
____________________
      |       |
      |       |
____________________
  |       |       |
  |       |       |
____________________

11

Haskell, 83 байти

q s="_":[s,s]
(f!w)h=take h$cycle$take w.drop(7-f).cycle<$>q"       |"++q"   |    "

Це визначає потрійну функцію інфіксації, !яка повертає список рядків. Приклад використання:

*Main> putStrLn $ unlines $ (3!14) 7
______________
   |       |  
   |       |  
______________
       |      
       |      
______________

Як це працює:

            q"       |"++q"   |    "  -- build a list of 6 strings
                                      --   1:     "_"
                                      --   2:     "       |"
                                      --   3:     "       |"
                                      --   4:     "_"
                                      --   5:     "   |    "
                                      --   6:     "   |    "
         <$>                          -- for each of the strings
     take w.drop(7-f).cycle           -- repeat infinitely, drop the first 7-f chars
                                      --    and take the next w chars
  cycle                               -- infinitely repeat the resulting list
take h                                -- and take the first h elements

1
Такі відповіді змушують мене вивчити цю мову.
GuitarPicker

3
Я подумав про Haskell, читаючи опис проблеми. "Повторювати нескінченно" - це дійсно акуратна функція.
DLosc

10

JavaScript (ES6), 96 95 байт

g=
(f,w,h)=>[...Array(h)].map((_,i)=>(i%3?`       |`:`_`).repeat(w+7).substr(f^7^i%6&4,w)).join`
`
;
<div onchange=o.textContent=g(f.value,w.value,+h.value)><input id=f type=number min=0 max=7 placeholder=Offset><input id=w type=number min=0 placeholder=Width><input id=h type=number min=0 placeholder=Height></div><pre id=o>

Пояснення: створює рядок або повторюваних 7 пробілів плюс |візерунок, або просто повторених _s, але принаймні довгих, щоб можна було витягувати wсимволи, необхідні для кожного рядка. Перші три рядки починаються з позиції, f^7а потім наступні три рядки починаються з позиції f^3, тому я досягаю цього, перемикаючи біт 2 у fкожному третьому ряду, використовуючи протилежний біт 2 на останніх двох рядках кожного блоку 6 для економії 1 байт.


7

MATL, 42 36 33 байт

:-Q'_ | |'[DClCl]Y"8et4YShwi:3$)!

Формат введення: nCols, offset,nRows

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

Підхід тут полягає в тому, що ми встановлюємо "шаблон", який потім індексуємо, використовуючи рядкові індекси ( [1 2 ... nRows]) та індекси стовпців, зміщені за першим входом ( [1 2 ... nCols] - shift). Завдяки модульній індексації MATL це автоматично призведе до виведення плитки. Як зауваження, щоб заощадити простір, технічно я працюю з транспонованою версією шаблону, а потім просто виконую транспонування ( !) в кінці.

Шаблон такий:

________
       |
       |
________
  |     
  |     

1
Хороше використання кодування довжини пробігу для створення шаблону
Луїс Мендо

6

Python 2, 93 88 байт

Другий рівень відступу - це вкладка Збереження деяких байтів завдяки Leaky Nun та деяким власним модифікаціям, також тепер виправте зміщення:

def f(F,W,H):
 for h in range(H):print["_"*W,((("|"+7*" ")*W)[8-F+h%6/3*4:])[:W]][h%3>0]

попередній код:

def f(F,W,H,x="|"+7*" "):
 for h in range(H):
    print ["_"*W,(x[F+4*(h%6>3):]+x*W)[:W]][h%3>0]

Та ж довжина, що і неназвана лямбда:

lambda F,W,H,x="|"+7*" ":"\n".join(["_"*W,(x[F+4*(h%6>3):]+x*W)[:W]][h%3>0]for h in range(H))

F,W,H=input()
Leaky Nun

видалити пробіли післяprint
Leaky Nun

використовувати h/3%2*4або h%6/3*4замість цього4*(h%6>3)
Leaky Nun

Вам не потрібен другий рівень відступу. Просто поставте printзаяву в той самий рядок, що і forтвердження
Leaky Nun

"| "коротше, ніж ("|"+7*" ")якщо я правильно
порахую

6

QBasic, 121 109 байт

(Тестовано на QB64)

Дякуємо @DLosc за те, що я розіграв моє IFтвердження з математичним еквівалентом. Це коштувало 12 байт.

Загальний метод:

Цикл по кожному осередку по одному за раз і визначити , чи повинен він бути _, або в |залежності від його розташування. MODвисловлювання та логічна логіка використовуються для визначення меж цегли та того, на скільки розміщуються цегли.

Код:

INPUT F,W,H
FOR y=0TO H-1:FOR x=0TO W-1
?CHR$((y MOD 3>0)*(((x-(y MOD 6>3)*4)MOD 8=F)*92+63)+95);
NEXT:?:NEXT

Примітка щодо використання:

QBasic очікує, що вхід буде числом, розділеним комами.


1
Використання математики замість IF/ THENдодає ще дужки, але економить 12 байт:?CHR$((y MOD 3>0)*(((x-(y MOD 6>3)*4)MOD 8=F)*92+63)+95);
DLosc

Дякуємо за коментар В задній частині голови я розглядав питання вивчення математики, але цього не робив. Я нещодавно подібний до цього, щоб забарвити зображення в нещодавньому поданні , але в застосуванні, який я використав, не було оператора MOD.
GuitarPicker

5

Java, 149 , 147 , 146 , 143 байт

Гольф:

String f(int o,int w,int h){String s="";for(int y=0,x;y<h;++y){for(x=0;x<w;++x){s+=y%3>0?(x-o+(y-1)/3%2*4)%8==0?'|':' ':'_';}s+='\n';}return s;}

Безголівки:

public class AllInAllItsJustUhAnotherTrickInCodeGolf {

  public static void main(String[] args) {
    int offset = 6;
    int width = 44;
    int height = 11;
    System.out.println(new AllInAllItsJustUhAnotherTrickInCodeGolf()
        .f(offset, width, height));
  }

  // Begin golf
  String f(int o, int w, int h) {
    String s = "";
    for (int y = 0, x; y < h; ++y) {
      for (x = 0; x < w; ++x) {
        s += y % 3 > 0 ? (x - o + (y - 1) / 3 % 2 * 4) % 8 == 0 ? '|' : ' ' : '_';
      }
      s += '\n';
    }
    return s;
  }
  // End golf

}

1
Можливо, ви могли б переключити порядок потрійного, порівнявши, з > 0яким можна зберегти два символи. І звичайно, ви можете комбінувати декларації з int y=0,x.
Фрозн

Як зазначає Frozn , ви можете видалити int перед xі використовувати int y=0,xв першому for-циклі, щоб зберегти 2 байти. Також на даний момент ви можете змінити y%3==0на y%3<1. (Це не можливо , ...%8==0щоб ...&8<1хоча, так як ваша операція може повертати негативне число.)
Кевін Cruijssen

Зроблено і зроблено. Ви вірні, що другий модуль може повернути негатив, і це робилося під час налагодження, коли я спочатку писав цю функцію.

1
Не знаю , як ми пропустили це, але ви можете видалити пробіли в ваших параметрів для -2 байт .. З іншого боку , використовуючи в int...oякості параметра і зміни wв o[1], hщоб o[2]і oдо o[0]-3 байт замість цього.
Кевін Круїссен

4

Рубі, 72 66 байт

->f,w,h{h.times{|i|puts i%3<1??_*w:((?|+' '*7)*w)[8-f+i%6/4*4,w]}}

Дякую @Value Ink за 6 байт!

Просте розмноження та нарізка рядків.

Працює в Ruby 2.3.0 (версія 2.1 Ideone викинула синтаксичну помилку).


2
Використовуйте i%6/4*4замість (i%6>3?4:0)і використовуйте ?_замість '_', ?|а не '|'.
Значення чорнила

Дякую. Я забув про ?єдиний чак-трюк, і "математична" частина справді вражає!
Лейбруг

1
Я думаю, що ((' '*7+?|)*w)[f^7^i%6&4,w]ви заощаджуєте два байти.
Ніл

Дякую @Neil Я відредагую код ..., як тільки зрозумію, як працює ваша пропозиція :)
Лейбруг

4

Джулія: 150 128 116 108 107 байт

# in codegolf.jl
r=repmat;b=r([' '],6,8);b[[1,4],:]='_';b[[2,3,23,24]]='|';b=r(b,h,w)[1:h,o+=1:o+w];b[:,end]=10;print(b'...)

бігти з аргументами: julia -e 'o=2;h=18;w=40;include("codegolf.jl")'

Якщо ви відчуваєте, що дзвонити з bash - це обман і вам потрібна функція всередині інтерпретатора, то версія функції - 117 байт :)

f(o,h,w)=(r=repmat;b=r([' '],6,8);b[[1,4],:]='_';b[[2,3,23,24]]='|';b=r(b,h,w)[1:h,o+=1:o+w];b[:,end]=10;print(b'...))

демонстрація

(Дякую, @ glen-o за додатковий накопичувач байтів!)


Ласкаво просимо до PPCG! Приємно бачити вас і тут!
Луїс Мендо

Зауважте, що дані слід приймати явно, тобто вам потрібен якийсь оператор введення для цих трьох змінних. Або ви можете використовувати функцію, яка сприймає їх як аргументи і виводить або відображає результат. Закінчивши, ви можете опублікувати демонстрацію в Інтернеті, використовуючи Спробуйте в Інтернеті!
Луїс Мендо


ах. так! : p
Tasos Papastylianou

1
Ви можете зберегти кілька символів, скориставшись репматом замість one ( repmat([32],6,8)), а потім перейменувавши репмати для гоління іншого символу ( g=repmat;b=g([32],6,8)і пізніше b=g(b,h,w)[1:h,o+1:o+w+1]). Потім замініть reinterpretна map. По моєму рахунку, ви заощадите 9 байт між цими змінами.
Глен О

3

JavaScript, 172 168 165 157 147 142 137 байт

(O,W,H)=>{t='_'.repeat(W),x='|       '.repeat(W),f=t+`
`;for(i=0;++i<H;)f+=(!(i%3)?t:(i%6)>3?x.substr(O,W):x.substr(8-O,W))+`
`;return f}

N = (O,W,H)=>{t='_'.repeat(W),x='|       '.repeat(W),f=t+`
`;for(i=0;++i<H;)f+=(!(i%3)?t:(i%6)>3?x.substr(O,W):x.substr(8-O,W))+`
`;return f}

let test_data = [[6,44,11],
                 [2,20,10],
                 [1,1,1],
                 [1,2,3],
                 [3,80,21]];

for (test of test_data)
    console.log(N(...test));


Чому б не використовувати s.repeat(w)замість Array(w).fill(s).join``?
Ніл

@Neil: Гарна ідея, але я придумав щось краще.
Yay295

а потім зрозумів, що ваше рішення краще, ніж я думав. Дякую!
Yay295

3

Діалог APL, 29 байт

↑⎕⍴⎕⍴¨a,4⌽¨a←'_',2⍴⊂⌽⎕⌽¯8↑'|'

Тести: 6 44 11, 2 20 10, 1 1 1, 1 2 3, 3 80 21

оцінюється вхід; як вираз виконується справа наліво, він запитує F, Wі саме Hв такому порядку

¯8↑'|' є ' |'

⎕⌽ обертається, він рубає F символів спереду і ставить їх у кінці струни

інший означає зворотний

'_',2⍴⊂ створює 3-трійку '_', а потім дві окремі копії рядка

a,4⌽¨a← додаємо 4-обертання всього поки що, ми закінчуємо 6-кортеж

⎕⍴¨ переформатуйте кожен елемент на ширину

⎕⍴ змінити на висоту

змішати вектор векторів в матрицю


2

Власне , 44 43 40 байт

Це фактично порт алгоритму у відповіді Ніла на JS . Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

╗╝r⌠;6(%4&╜7^^╛'|7" "*+*t╛@H╛'_*3(%YI⌡Mi

Ungolfing:

          Takes implicit input in the order h, w, f.
╗╝        Save f to register 0. Save w to register 1.
r⌠...⌡M   Map over range [0..h-1]. Call this variable i.
  ;         Duplicate i
  6(%       i%6...
  4&        ...&4
  ╜7^^      ...^i^7. Call it c.
  ╛         Push w.
  '|7" "*+  The string "       |"
  *t╛@H     (("       |" * w)[c:])[:w]
  ╛'_*      Push "_" * w
  3(%       Push 3, move duplicate i to TOS, mod.
  YI        If not i%3, take "_"*w, else (("       |" * w)[c:])[:w]
            Function ends here.
i         Flatten the resulting list and print the bricks implicitly.


1

Октава 80 76 байт

% in file codegolf.m
c(6,8)=0;c([1,4],:)=63;c([2,3,23,24])=92;char(repmat(c+32,h,w)(1:h,o+1:o+w))

для запуску з терміналу: octave --eval "o=2;h=18;w=44; codegolf"

(або, якщо ви думаєте, що термінальний дзвінок обманює: p, то реалізація анонімної функції займає 86 байт :)

c(6,8)=0;c([1,4],:)=63;c([2,3,23,24])=92;f=@(o,h,w)char(repmat(c+32,h,w)(1:h,o+1:o+w))

Зателефонуйте f(2,18,44)до перекладача октави.


1

Bash + Sed, 411 395 381 370 байт:

F=`printf '_%.s' $(eval echo {1..$2})`;V="       |";(($[($2-$1)/8]>0))&&L=`printf "$V%.s" $(eval echo {1..$[($2-$1)/8]})`||L=;Z=`printf "%$1.s|%s\n" e "$L"`;I=$[($2-(${#Z}-4))/8];(($I>0))&&W=`printf "$V%.s" $(eval echo {1..$I})`||W=;J=${Z:4}$W;for i in `eval echo {1..$[$3/3+1]}`;{ (($[$i%2]<1))&&O+="$F\n$J\n$J\n"||O+="$F\n$Z\n$Z\n";};echo "`echo -e "$O"|sed -n 1,$3p`"

Ну ось моя найперша відповідь на Bash, або будь-яка мова оболонки сценарію з цього питання. Це також далеко не найдовша відповідь. Бере в послідовності аргументи командного рядка, розділених пробілом, у форматі Offset Width Height. Це, ймовірно, може бути набагато коротшим, ніж це є зараз, тому будь-які поради та / або хитрощі щодо гольфу в цій галузі більше оцінені.


1

Delphi / Object Pascal, 305 , 302 , 292 байт

Повна консольна програма, яка зчитує 3 параметри.

uses SySutils,Math;var i,q,o,w,h:byte;begin o:=StrToInt(paramstr(1));w:=StrToInt(paramstr(2));h:=StrToInt(paramstr(3));for q:=0to h-1do begin for i:=1to w do if q mod 3=0then Write('_')else if IfThen(Odd(q div 3),((i+o)mod 8),((i-o)mod 8))=1then Write('|')else Write(' ');Writeln('');end end.

неозорий

uses
  SySutils,
  Math;
var
  i,q,o,w,h:byte;
begin
  o:=StrToInt(paramstr(1));
  w:=StrToInt(paramstr(2));
  h:=StrToInt(paramstr(3));

  for q := 0 to h-1 do
  begin
    for i := 1 to w do
      if q mod 3 = 0  then
        Write('_')
      else
        if IfThen(Odd(q div 3),((i+o)mod 8),((i-o)mod 8)) = 1 then
          Write('|')
        else Write(' ');
    Writeln('');
  end
end.

На жаль, у Delphi немає термінального оператора, і це досить багатослівна мова.

тестовий випадок

D:\Test\CodeGolfWall\Win32\Debug>Project1.exe 2 20 10
____________________
  |       |       |
  |       |       |
____________________
      |       |
      |       |
____________________
  |       |       |
  |       |       |
____________________

D:\Test\CodeGolfWall\Win32\Debug>Project1.exe 6 44 11
____________________________________________
      |       |       |       |       |
      |       |       |       |       |
____________________________________________
  |       |       |       |       |       |
  |       |       |       |       |       |
____________________________________________
      |       |       |       |       |
      |       |       |       |       |
____________________________________________
  |       |       |       |       |       |

Редагувати: Не вдалося поголити 3 байти, використовуючи байт як тип для всіх змінних.

Редагувати 2: І консольним програмам не потрібно декларації програми, -10

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