В общем, это просто еще один трюк в коде гольф


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 Звучит правильно
Безумный

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;и сохраните еще один байт в цикле for.
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+/..$'

Считая shebang как 2, ввод берется из стандартного ввода, разделяя пробел.

Пример использования

$ 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 это автоматически приводит к выводу мозаики. Как примечание, чтобы сэкономить место, технически я работаю с транспонированной версией шаблона, а затем просто берут transpose ( !) в конце.

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

________
       |
       |
________
  |     
  |     

1
Хорошее использование кодирования длин серий для генерации шаблона
Луис Мендо

6

Python 2, 93 88 байт

2-й уровень отступа - вкладка Сохранение нескольких байтов благодаря 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))


удалить пробел послеprint
Leaky Nun

использовать h/3%2*4или h%6/3*4вместо4*(h%6>3)
Leaky Nun

Вам не нужен второй уровень отступа. Просто поместите printутверждение в той же строке, что и forутверждение
Leaky Nun

"| "короче, чем ("|"+7*" ")если бы я считал правильно
Leaky Nun

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 байта

Golfed:

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

Ungolfed:

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

Как сказал 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 (синтаксическая ошибка Ideone версии 2.1.


2
Используй i%6/4*4вместо (i%6>3?4:0)и используй ?_вместо '_', ?|вместо '|'.
Value Ink

Спасибо. Я забыл об ?одном трюке, и математическая часть действительно впечатляет!
Leibrug

1
Я думаю, что ((' '*7+?|)*w)[f^7^i%6&4,w]экономит два байта.
Нил

Спасибо @Neil. Я отредактирую код ... как только пойму, как работает ваше предложение :)
Leibrug

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! Приятно видеть вас также здесь!
Луис Мендо

Обратите внимание, что входные данные должны приниматься явно, т. Е. Вам нужен какой-то оператор ввода для этих трех переменных. Или вы можете использовать функцию, которая принимает их в качестве аргументов и выводит или отображает результат. Когда вы закончите, вы можете опубликовать онлайн-демонстрацию с помощью Попробовать онлайн!
Луис Мендо



1
Вы можете сохранить несколько символов, используя repmat вместо ones ( repmat([32],6,8)), а затем переименовав repmat, чтобы побрить другого персонажа ( g=repmat;b=g([32],6,8)и позже b=g(b,h,w)[1:h,o+1:o+w+1]). Затем заменить reinterpretна map. По моим подсчетам, вы сэкономите 9 байтов между этими изменениями.
Глен O

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

Дьялог АПЛ, 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.

ungolfed

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.