Codegolf - Сделай Мне Лунный Пирог!

  • Автор темы Bugimot
  • Обновлено
  • 22, Oct 2024
  • #1

фестиваль середины осени началось!

К сожалению, все мои лунные лепешки были украдены — они становятся слишком дорогими для таких маленьких людей, как я, и, боюсь, в этом году я не смогу их съесть!

Поэтому я обращаюсь к вам за помощью. Не могли бы вы сделать мне немного?

Для тех, кто не знает, позвольте мне рассказать вам, как выглядит лунный пирог.


Лунные пряники бывают разных размеров!
Так что я подарю тебе свою вход, н, когда я захочу.

Вот несколько примеров выход Я хочу:

Лунный пирог размера n = 3:

 
     (@@@@@@@@@@@) 

(@         @)

(@    M    @) 

(@    F    @)

(@         @)

(@@@@@@@@@@@) 
 

Лунный пирог размера n = 6:

(@@@@@) (@MAF@) (@@@@@)

То есть лунный пирог размером н является:

  • н линии высокие
  • 2н - 1 @длинный
  • 2н + 1 длинные символы (@s и скобки)

И лучше не бросай мне свои крошечные тренировочные лунные лепешки!
Предположим, что ввод всегда будет n >= 3.

Лунные пряники также содержать одно из следующих украшений:

  • МФ
  • МАФ
  • ХМФ
  • JCJ
  • ТТТ
  • ЗДжей
  • НЧ
  • РФ
  • CF

Какой именно, не важно - лишь бы он был вертикально и горизонтально по центру.
Его можно писать как вертикально, так и горизонтально!

Я хочу разнообразия!
Если ты действительно собираешься сделать мне два одинаковых лунных пирога, украшение лучше будет другим!

То есть, многократное выполнение вашей программы с одним и тем же вводом не всегда должно приводить к одному и тому же оформлению..

Мне не терпится съесть твои лунные пирожные, так что чем скорее я смогу их получить (чем короче ваш код) тем лучше!

Удачи!


Для тех, кто интересуется украшениями:
Это инициалы всех альтернативных названий Праздника середины осени.
Список можно найти на странице Википедии, ссылка на которую находится вверху этого поста.


Уточнения:

Нет никаких правил относительно начальных и конечных пробелов..
Берите столько, сколько захотите!

Украшения должны находиться в самом центре вашего лунного пирога!
Для горизонтальных украшений это означает, что оно должно находиться на средней линии вашего торта, а количество символов слева и справа от строки украшения должно быть одинаковым.
Для вертикальных украшений это означает, что оно должно находиться в средней колонке вашего торта, а количество символов над и под украшением должно быть одинаковым.

Не все украшения необходимо использовать!
Единственное требование состоит в том, что для любого заданного входа должно быть более одной возможности. н. Возможности также не обязательно должны быть четными.

Функции приемлемые.

#код-гольф #ascii-art

Bugimot


Рег
08 Oct, 2010

Тем
71

Постов
185

Баллов
590
  • 26, Oct 2024
  • #2

Пиф, 71 65 59 58 байт

Сэкономлен 1 байт благодаря @StevenH.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
         var v = n % 2 == 0;

int l = n + n - 3, h = n - 2, e = v ? 0 : 1, c = e + 2;

var c2 = v ? "MFZJLFRFCF" : "MAFHMFJCJTTT";

var r = new Random().Next(3 + e);

var f = new String(c2.Skip(c * r).Take(c).ToArray());

var mc = "";

for (var i = 0; i < h; i++)

{

var x = "";

if (!v && i == ((h / 2)))

{

x = f;

}

else if (v && ((i == h / 2) || (i == (h / 2) - 1)))

{

x += f[i % 2 == 1 ? 0 : 1];

}

var emptySpace = x.PadLeft((l / 2) + 1 + e, ' ').PadRight(l, ' ');

mc += "(@" + emptySpace + "@)\n";

}

var b = "(" + "".PadLeft(l + 2, '@') + ")";

mc = b + "\n" + mc + b;

Console.WriteLine(mc);
 

Попробуйте онлайн. Тестовый набор.

Столько набивок.

 

Alex3272


Рег
22 Oct, 2008

Тем
70

Постов
194

Баллов
574
  • 26, Oct 2024
  • #3

JavaScript ES6, 206 196 192 188 187 180 176 169 165 156 байт

var v=n%2==0;int l=n+n-3,h=n-2,e=v?0:1,c=e+2;var c2=v?"MFZJLFRFCF":"MAFHMFJCJTTT";var r=new Random().Next(3+e);var f=new String(c2.Skip(c*r).Take(c).ToArray());var mc="";for (var i=0;i < h;i++) {var x="";if (!v && i==((h / 2))) { x=f;} else if (v && ((i==h / 2) || (i==(h/2)-1))) { x +=f[i%2==1?0:1];} var es=x.PadLeft((l/2)+1+e,' ').PadRight(l,' ');mc +="(@"+es+"@)\n";}var b="("+"".PadLeft(l+2, '@')+")";mc=b+"\n"+mc+ b; Console.WriteLine(mc);

Авария

(@@@@@@@) (@ LF @) (@ @) (@@@@@@@)

Моя первая попытка код-гольфа. Вероятно, здесь можно больше играть в гольф.

сэкономил 4 байта благодаря @ETHProductions

Редактировать Я взял на себя смелость использовать (@@@@@@@) (@ @) (@ LF @) (@@@@@@@) def f(n): import random; import math; return "{a}{}{a}".format( "{d}(@{}{b}F{c}@)\n{e}".format( " "*(math.ceil((2*n-5)/2)), b=random.sample(["L","R"],1)[0], c=" "*((2*n)-(5+math.ceil((2*n-5)/2))), d="(@{}@)\n".format(" "*(2*n-3))*math.ceil((n-3)/2), e="(@{}@)\n".format(" "*(2*n-3))*(n-(3+(math.ceil((n-3)/2))))), a="({})\n".format("@"*(2*n-1))) удовлетворить:

многократное выполнение вашей программы с одним и тем же вводом не всегда должно приводить к одному и тому же оформлению.

это позволяет мне сэкономить еще 7 байт def f(n):import random,math;y=math.ceil;z=str.format;i=y(2*n-5>>1);j=y(n-3>>1);return z("{a}{}{a}",z("{d}(@{}{b}F{c}@)\n{e}"," "*i,b=random.sample(["L","R"],1)[0],c=" "*(2*n-5-i),d=z("(@{}@)\n"," "*(2*n-3))*j,e=z("(@{}@)\n"," "*(2*n-3))*(n-3-j)),a=z("({})\n","@"*(2*n-1)))

сэкономил еще 4 байта благодаря @Arnauld

 

Nero888


Рег
22 Jun, 2014

Тем
55

Постов
205

Баллов
480
  • 26, Oct 2024
  • #4

Пиф, 99 79 71 68 64 байта

Пит очень плохо умеет делать струны. Или, может быть, я просто плохо играю в гольф.

for( $p=[M,MA,R,HM][rand()&2|1&$n=$argv[1]].F; // pick decoration $i<$n*$w=2*$n+1;$i++) // loop $i from 0 to $n*width-1: echo // print ... $w-1-($x=$i%$w) // 1. not last column ?$x // 2. not first column ? ($y=$i/$w|0)%($n-1) // 3. not first or last line && 1-$x%($w-3) // and not second or (width-2)th column ?$p[$n&1 ?$n>>1!=$y?3:1+$x-$n :($n-$x?3:1+$y-$n/2) ] ? // 4. decoration character :" " // 4. else: blank :"@" // 3. else: "@" :"(" // 2. else: "(" :")\n" // 1. else: ")"+newline ;

Можно создавать украшения for($p=[M,MA,R,HM][rand()&2|1&$n=$argv[1]].F;$i<$n*$w=2*$n+1;$i++)echo($x=$i%$w)?$w-1-$x?($y=$i/$w|0)%($n-1)&&1-$x&&$w-2-$x?$p[$n&1?$n>>1!=$y?9:$x-$n+1:($n-$x?9:$y-$n/2+1)]?:" ":"@":") ":"("; and function p($s){global$n;return"(@".str_pad($s,2*$n-3,$s?" ":"@",2)."@) ";}$p=[M,MA,R,HM][rand()&2|1&$n=$argv[1]];echo p(""),$e=str_repeat(p(" "),($n+$n%2)/2-2),$n&1?p($p.F):p($p).p(F),$e,p(""); горизонтально, а украшения mooncake(3) mooncake(4) mooncake(5) mooncake(6) and def row(inner_width, fillchar='') padding = ( inner_width - fillchar.size) / 2 (center =(' ' * inner_width))[padding...fillchar.size+padding]=fillchar puts "(@"+center+"@)" end def mooncake(n) decoration = n.odd?? [%w{ MAF HMF JCJ TTT }.sample] : %w{ ZJ LF RF CF }.sample.chars start_row = n.odd?? (n/2) : (n - 2) / 2 inner_width = 2 * n - 1 row(inner_width,'@'*inner_width) (1...(n-1)).each do |row| if (start_row ... start_row + decoration.size).include? row row(inner_width,decoration[row - start_row]) else row(inner_width) end end row(inner_width,'@'*inner_width) end вертикально.

Попробуйте онлайн!

 

Riga Khakimova


Рег
23 Oct, 2020

Тем
78

Постов
191

Баллов
621
  • 26, Oct 2024
  • #5

Вим, 118 байт

Принимает входные данные в качестве буфера (например, файл с номером н как его содержимое).

def m(n) d,s=n.odd?? [[%w{MAF HMF}.sample],n/2]:[%w{RF LF}.sample.chars,(n-2)/2] r=->f{l=f.size;q=($i-l)/2;($c=' '*$i)[q...l+q]=f;puts "(@#$c@)"} $i=2*n-1;a='@'*$i r[a] (1..n-2).map{|x|(s...s+d.size)===x ?r[d[x-s]]:r['']} r[a] end

Вот он с непечатаемыми управляющими символами в формате xxd:

main(c,v)char**v; { f(atoi(v[1])); }

Попробуйте онлайн! (Оказывается, интерпретатор V отлично работает и с обычным кодом Vim.)

Объяснение

A="HMFMAFCF";i,j,k,t;f(n){t=time();char*S=n&1?t&1?A:A+3:t&1?A+1:A+6;for(;i<n;i++,puts(")"))for(j=0,k=2*n-1,putchar(40);j<k;putchar(0==i*j|i==n-1|j==k-1?64:n&1&i==n/2&j>n-3&j<n+1?*S++:n&1?32:(i==n/2-1|i==n/2)&j>n-2&j<n?*S++:32),j++);} ||answer||

PHP, 342 292 249 185 178 176 байт

@

Позвонить с n

история

Ред. 1: первоначальная версия; все размеры (в том числе миниатюрные тортики), все украшения, все возможные направления

Версия 2: удалены крошечные пирожные (-36 байт), реструктурированы варианты оформления, удален один элемент украшения (-21) и однобайтовый гольф (-1).

Ред. 3: Уменьшено до четырех наград; (-17), только горизонтально для нечетных размеров (-18) плюс незначительная игра в гольф (-8).

Версия 4: Спасибо Йоргу за то, что он разобрался с частью «пирога с краской»; он снялся потрясающе (-31).
Еще -6 за дополнительную игру в гольф и -27 за использование одной струны вместо набора струн.

Версия 5: -7 байт в основном благодаря Кристаллкексу

авария

Он становится стройнее с каждым часом. :)

%1 ||answer||

Java 7, 399 349 байт

Обновленная версия с помощью @Dodge и @Kevin Cruijssen:

s n-3

Попробуйте здесь!

Новая версия гораздо более оптимизирована и избавлена ​​от c array handling. Also as suggested, there are only 4 decorations now: 2 for even inputs ( d , h ) and 2 for odd inputs ( 0 , u ) which are combined into a single 0 .

Негольфед:

l ||answer||

Пакетный, 386 байт

if

При необходимости будет выводиться только HMF, MAF, MF или CF. Примечание: некоторые строки заканчиваются пробелом. Переменные:

  • n Input parameter (read from STDIN)
  • o Decoration prefixes (suffix F подразумевается)
  • f Oddness of n (использовалась только один раз, но @echo off set/pn= set f=HMAC set/ao=n%%2,u=n/2,l=h=u+1,d=%random%%%2*2+1 if %o%==1 set/al=u=0,d/=2 set c= for /l %%i in (4,1,%n%) do call set c= %%c%% call:l %n% for /l %%i in (2,1,%n%) do call:l %%i exit/b :l set s= if %1==%h% call set s=%%f:~%d%,2%%F if %1==%u% call set s= %%f:~%d%,1%% if %1==%l% set s= F set s=(@%c%%s%%c%@) if %1==%n% set s=%s: =@% echo %s% statements don't accept expressions)
  • void m(int n){ int i=2, r=n%2, x=2*n, u=r+2, // length of the decoration string y=r*4+(int)(Math.random()*2)*u, // random starting index of string (0, 2, 4, 7) z=y+u; // exclusive end index of string (2, 4, 7, 10) String t="MFZJMAFHMF".substring(y,z); char[][]c=new char[n][x+1]; while(i < x-1) { c[0][i]=c[n-1][i++]=64; // '@' } for(i=0; i<u;) { c[(n-1)/2+(1-r)*i][r*(i-1)+n]=t.charAt(i++); // Depending on even/odd, fills the center column/row respectively with the decoration } for(i=0; i<n;) { c[i][0]=40; // '(' c[i][1]=c[i][x-1]=64; // '@' c[i][x]=41; // ')' System.out.println(new String(c[i++]).replace('\0',' ')); // Print all } } Row of the upper vertical character, or String для горизонтального декора
  • HMF Row of the lower vertical character, or MAF для горизонтального декора
  • ZJ Row of the horizontal decoration (gets overwritten by a vertical decoration)
  • MF Index of decoration in decoration prefix (0/1 for horizontal or 1/3 for vertical)
  • String String of void m(int n){String[]s={"MF","MAF","ZJ","HMF","LF","JCJ","RF","TTT","CF","MAF"};char[]d=s[((int)(Math.random()*5))*2+(n%2)].toCharArray(),c[]=new char[n][2*n+1];int i=2;while(i<2*n-1)c[0][i]=c[n-1][i++]='@';i=0;while(i<d.length)c[(n-1)/2+(1-(n%2))*i][(n%2)*(-1+i)+n]=d[i++];i=0;while(i<n){c[i][0]='(';c[i][1]=c[i][2*n-1]='@';c[i][2*n]=')';System.out.println(new String(c[i++]).replace('\0',' '));}} пространства
  • void m(int n){int i=2,r=n%2,x=2*n,u=r+2,y=r*4+(int)(Math.random()*2)*u,z=y+u;String t="MFZJMAFHMF".substring(y,z);char[][]c=new char[n][x+1];while(i<x-1)c[0][i]=c[n-1][i++]=64;for(i=0;i<u;)c[(n-1)/2+(1-r)*i][r*(i-1)+n]=t.charAt(i++);for(i=0;i<n;){c[i][0]=40;c[i][1]=c[i][x-1]=64;c[i][x]=41;System.out.println(new String(c[i++]).replace('\0',' '));}} Output string for each row
  • // paint cake for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)<1])."@)\n"; // add deco $p=F.[M,AM,R,MH][rand()&2|$d=$n&1]; $f=$n*($n+$d)-2; for($i=2+$d;$i--;$f+=$d?:2*$n+2)$o[$f]=$p[$i]; // output echo$o; Row number, but set to php -r '<code>' <size> и для первой строки, так что и первая, и последняя строки используют for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)<1])."@) ";$p=F.[M,AM,R,MH][rand()&2|$d=$n&1];$f=$n*($n+$d)-2;for($i=2+$d;$i--;$f+=$d?:2*$n+2)$o[$f]=$p[$i];echo$o; s instead of spaces.
 

Mas1


Рег
12 Jul, 2008

Тем
72

Постов
184

Баллов
564
  • 26, Oct 2024
  • #6

С, 233 байта

Должно быть, можно поиграть в гольф немного отсюда...

"aD " Delete the number and store it in @a i()<Esc> " Insert empty parentheses @ai@<Esc>.x " Insert @a '@' characters between the parentheses twice; delete 1 Y@apdd " Copy the line and paste it @a times; delete 1 ll<C-v>G$k3hr<Space> " Replace the inner area with spaces @=@a/2-1<CR>j " Go down @a/2-1 lines @=@a-2-@a%2<CR>l " Go right @a-2-@a%2 columns :let r=reltime()[1]%2<CR> " Get a random 1 or 0 based on the time (this may be OS-dependent) @=@a%2? r?"RJCJ":"3rT" " For odd @a, replace the next 3 characters with "JCJ" or "TTT" :"rFkr"."ML"[r] " For even @a, replace this character with "F" and the above with "M" or "L" <CR><Esc>

Отличная задача, это было сложно и некрасиво кодировать.

Запустите эту основную функцию;

0000000: 2261 4469 2829 1b40 6169 401b 2e78 5940 "aDi().@[email protected]@ 0000010: 6170 6464 6c6c 1647 246b 3368 7220 403d apddll.G$k3hr @= 0000020: 4061 2f32 2d31 0a6a 403d 4061 2d32 2d40 @a/2-1.j@=@a-2-@ 0000030: 6125 320a 6c3a 6c65 7420 723d 6162 7328 a%2.l:let r=abs( 0000040: 7265 6c74 696d 6528 295b 315d 2925 320a reltime()[1])%2. 0000050: 403d 4061 2532 3f72 3f22 524a 434a 223a @=@a%2?r?"RJCJ": 0000060: 2233 7254 223a 2272 466b 7222 2e22 4d4c "3rT":"rFkr"."ML 0000070: 225b 725d 0a1b "[r].. ||answer||

Ruby 2.3.1, 449 265 245 233 230 символов

Кажется, должен быть рубиновый ответ, так что вот рубиновый ответ. Это действительно не так уж и умно. Надеюсь, кто-то другой окажется умнее ;)

Версия для гольфа:

"aDi()<Esc>@ai@<Esc>.xY@apddll<C-v>G$k3hr @=@a/2-1 j@=@a-2-@a%2 l:let r=abs(reltime()[1])%2 @=@a%2?r?"RJCJ":"3rT":"rFkr"."ML"[r] <Esc>

Хитрости при игре в гольф:

  • заменить объявление метода стабильной строковой интерполяцией
  • $globals не нужен #{global}, только #$global
  • === для диапазонов короче .covers?

Читабельная версия

CF

Тестирование

MF ||answer||

Мне было скучно... вот еще две версии:

PHP, 193 байта

HMF

порт Ответ Лмиса

PHP, 191 байт

MAF

печать торта посимвольно за один цикл

авария

jmj.[-yQ3@,k@,@,O"MC"\FgydQOc"MAFHMF"3Q>2ahydQ@" @"sIcdtQc2"(@@) ||answer||

Python 3, 318 301 297 285 272 байта

Скинул 17 байт с помощью DJMcMayhem

Сбил 4 байта благодаря mbomb007

Скинул еще 12 байт благодаря DJMcMayhem

Сбил еще 13 байт благодаря mbomb007

Мой первый гольф, так что все не так уж и здорово. Я использовал: псевдоним math.ceil как y и str.format как z, форматы вложенности, однострочный импорт, лямбда-выражения и побитовые операции, а также некоторые другие вещи, чтобы получить это так, как оно есть.

+Math.random()>.5

Версия без гольфа (отдельный импорт, без псевдонимов и побитовых операций):

new Date%2

Интересно, что использование небитовой версии по-прежнему дает правильный результат, однако результат отличается:

Непобитовое:

Date.now()%2

Побитовое:

r=new Date%2 // Sometimes 0, sometimes 1 // Function to create lines of the cake of the form `(@@@@@@@@@)` or `(@ ${s} @)` a=(s,x,b=' @'[+!s].repeat(n-3+!x))=>`(@${b+(s||'@')+b}@) ` // Cake parts a() // Top of the cake. l=a` `.repeat(n/2-2+n%2) // Undecorated inner part. a(r?'MAF':'HMF',1) // Decoration for uneven sized cakes. a('RC'[r])+a`F` // Decoration for even sized cakes. l // Undecorated inner part. a() // Bottom part. ||answer||

С# 448 байт

Гольф:

g=(n,r=new Date%2,a=(s,x,b=' @'[+!s].repeat(n-3+!x))=>`(@${b+(s||'@')+b}@) `,l=a` `.repeat(n/2-2+n%2))=>a()+l+(n%2?a(r?'MAF':'HMF',1):a('RC'[r])+a`F`)+l+a()

Проверьте это здесь

Негольфед:

jjRc"(@@)"2++J*KtytQ\@m.[Kd;.[ttQ@,,O"MC"\F]Oc"MAFHMF"3QkJ
 

Alex2273ship


Рег
26 Nov, 2019

Тем
82

Постов
188

Баллов
638
Тем
403,760
Комментарии
400,028
Опыт
2,418,908