ทำให้ฉันเป็นอีก!


19

ทำให้ฉันเป็นอีก ! ฉันบอกความกว้างจำนวนเกรแฮมแครกเกอร์ปริมาณช็อคโกแลตและปริมาณมาร์ชเมลโล่ ตัวอย่าง:

การป้อนข้อมูล:

ความกว้าง: 10 เกรแฮม: 3 ช็อคโกแลต: Marshmallow:2 1

เอาท์พุท:

GGGGGGGGGG
GGGGGGGGGG
GGGGGGGGGG
CCCCCCCCCC
CCCCCCCCCC
MMMMMMMMMM
GGGGGGGGGG
GGGGGGGGGG
GGGGGGGGGG

มันง่ายใช่ไหม อืมใช่

โปรดทราบว่าการป้อนข้อมูลควรเป็นรายการของการขัดแย้งกับฟังก์ชั่นหรือโปรแกรมไม่ใช่สตริง คุณอาจเลือกความกว้างก่อนจากนั้นก็เกรแฮม แต่คำสั่งใดก็ได้

กรณีทดสอบแบบเต็มหากคุณสนใจ

ตัวอย่างสแต็ก (สำหรับการทดสอบ ฯลฯ )

นี่คือการทดสอบผลลัพธ์

var smore = function(width, graham, chocolate, marshmallow){
	return ("G".repeat(width) + "\n").repeat(graham) + 
	("C".repeat(width) + "\n").repeat(chocolate) + 
	("M".repeat(width) + "\n").repeat(marshmallow) + 
	("G".repeat(width) + "\n").repeat(graham);
};
Snippetify(smore);
<script src="https://programmer5000.com/snippetify.min.js"></script>
Width: <input type = "number">
Graham: <input type = "number">
Chocolate: <input type = "number">
Marshmallow: <input type = "number">
<button>Try it out!</button>
<pre data-output></pre>

หมายเหตุ:

  • คุณอาจรวมถึงการขึ้นบรรทัดใหม่ที่ท้ายบรรทัดสุดท้าย คุณยังสามารถใช้\แทนการขึ้นบรรทัดใหม่
  • นี่คือรหัสกอล์ฟ
  • มีอะไรจะถามอีกไหม? ความคิดเห็นด้านล่าง:

21
ฉันแก้ไขลิงก์ Let Me Google That For You ของคุณ มันไม่ตลกเลยจริงๆ
Level River St

1
@FelipeNardiBatista ใช่
programmer5000

1
คำตอบบางข้อสมมติว่ามีการจัดลำดับและรูปแบบการป้อนข้อมูลที่ยืดหยุ่น (ตามปกติใน PPCG) แต่ความท้าทายนั้นดูเหมือนจะต้องการลำดับที่เฉพาะเจาะจงและแยกแยะสตริง (ไม่แน่ใจว่ามันหมายถึงอะไร) คุณช่วยอธิบายได้ไหม
Luis Mendo เมื่อ

2
ขอบคุณสำหรับการชี้แจง แล้วคุณควร reword ประโยคการป้อนข้อมูลที่ควรจะเป็นรายการของการขัดแย้งกับฟังก์ชั่นหรือโปรแกรมที่ไม่สตริงที่มีความกว้างเป็นครั้งแรกแล้วเกรแฮม ฯลฯ โดยส่วนตัวฉันจะพูดบางอย่างเช่น "รูปแบบอินพุตมีความยืดหยุ่นตามปกติ"
Luis Mendo

4
@ programmer5000 แต่ทำไม? หากพวกเขาลงคะแนนอาจเป็น 90% ที่เป็นเพราะพวกเขาคิดว่ามันเป็นความท้าทายที่น่าเบื่อและไม่สำคัญ ยิ่งไปกว่านั้นมันค่อนข้างหยาบคายที่จะบอกให้ผู้คนอธิบายหรือเพิกถอน พวกเขามีสิทธิ์ที่จะลงคะแนนโดยไม่มีความคิดเห็น
Rɪᴋᴇʀ

คำตอบ:


2

เยลลี่ 11 ไบต์

ṁ4“GCMG”x×Y

ลองออนไลน์!

มันทำงานอย่างไร

ṁ4“GCMG”x×Y  Main link. Left argument: g, c, m. Right argument: w

ṁ4           Mold 4; repeat g, c, m until length 4 is reached. Yields [g, c, m, g].
  “GCMG”x    Repeat 'G' g times, then 'C' c times, then 'M' m times, and finally
             'G' g times. This yields a string.
         ×   Multiply each character w times. This is essentially a bug, but
             Jelly's × behaves like Python's * (and vectorizes), so it can be
             abused for character repetition.
          Y  Join, separating by linefeeds.


8

05AB1E , 21 19 19 ไบต์

"GCMG"S×|D«‚øvy`.D»

ลองออนไลน์!

-2 ขอบคุณการกำกับดูแลและ Emigna ของฉัน

"GCMG"S×            # Push GCMG, separate, duplicate n times.
        |D«         # Push rest of inputs, doubled.
           ‚ø       # Wrap GCMG array and input array, then zip them into pairs.
             vy`.D» # For each pair, print n of G/C/M/G.

(ดูคำตอบของ Emigna ดีกว่า: /codegolf//a/116787/59376 )


1
คุณดูเหมือนจะตั้งใจทิ้งไว้©ในนั้น
Emigna

1
คุณสามารถแทนที่¬¸ด้วยDเนื่องจากองค์ประกอบเพิ่มเติมจะหายไปเมื่อคุณซิป
Emigna

@Emigna ฉันชอบและเกลียดการทำงานนั้น
Magic Octopus Urn

ใช่มันมักจะน่ารำคาญมาก แต่ตอนนี้และจากนั้น (เช่นตอนนี้) มันจะมีประโยชน์ :)
Emigna

8

JavaScript (ES6), 71 ไบต์

(W,G,C,M)=>[...'GCMG'].map(X=>`${X.repeat(W)}
`.repeat(eval(X))).join``

Woohoo เอาชนะ 3 คำตอบของ JavaScript อื่น ๆ !


ดีมากดีมาก - ได้รับคะแนนของฉัน
Shaggy

7

MATL , 17 ไบต์

'GCMG'iK:)Y"!liX"

รูปแบบอินพุตคือการป้อนค่าแรกเข้าที่สอง[G, C, M]W

ลองออนไลน์!

คำอธิบายพร้อมตัวอย่าง

พิจารณาปัจจัยการผลิตและ[3 2 1] 10

'GCMG' % Push this string
       % STACK: 'GCMG'
i      % Take first input: array of three numbers
       % STACK: 'GCMG', [3 2 1]
K:     % Push [1 2 3 4]
       % STACK: 'GCMG', [3 2 1], [1 2 3 4]
)      % Index (modular, 1-based). This repeats the first entry of the input array
       % STACK: 'GCMG', [3 2 1 3]
Y"     % Run-length decoding
       % STACK: 'GGGCCMGGG'
!      % Transpose. Gives a column vector of chars
       % STACK: ['G'; 'G'; 'G'; 'C'; 'C'; 'M'; 'G'; 'G'; 'G']
l      % Push 1
       % STACK: ['G'; 'G'; 'G'; 'C'; 'C'; 'M'; 'G'; 'G'; 'G'], 1
i      % Take second input: number
       % STACK: ['G'; 'G'; 'G'; 'C'; 'C'; 'M'; 'G'; 'G'; 'G'], 1, 10
X"     % Repeat the specified numbers of times along first and second dimensions
       % STACK: ['GGGGGGGGGG';'GGGGGGGGGG';'GGGGGGGGGG';'CCCCCCCCCC';...;'GGGGGGGGGG']
       % Implicitly display

7

C # , 204 ไบต์


แข็งแรงเล่นกอล์ฟ

(w,g,c,m)=>{string G="\n".PadLeft(++w,'G'),C="\n".PadLeft(w,'C'),M="\n".PadLeft(w,'M'),o="".PadLeft(g,'G');o+="".PadLeft(m,'M')+"".PadLeft(c,'C')+o;return o.Replace("G",G).Replace("C",C).Replace("M",M);};

Ungolfed

( w, g, c, m ) => {
   string
      G = "\n".PadLeft( ++w, 'G' ),
      C = "\n".PadLeft( w, 'C' ),
      M = "\n".PadLeft( w, 'M' ),
      o = "".PadLeft( g, 'G' );

   o +=
      "".PadLeft( m, 'M' ) +
      "".PadLeft( c, 'C' ) +
      o;

   return o
      .Replace( "G", G )
      .Replace( "C", C )
      .Replace( "M", M );
};

อ่านได้ไม่ดี

// Function with 4 parameters
//   w : Width
//   g : Graham
//   c : Chocolate
//   m : Marshmallow
( w, g, c, m ) => {

   // Initialization of vars with the contents
   //    of each line, with a new line at the end
   string
      G = "\n".PadLeft( ++w, 'G' ),
      C = "\n".PadLeft( w, 'C' ),
      M = "\n".PadLeft( w, 'M' ),

      // Trick to reduce the byte count
      //   Initialize the output with n 'G's
      o = "".PadLeft( g, 'G' );

   // Add again n 'M's and n 'C's
   //   Append the 'G's at the end.
   o +=
      "".PadLeft( m, 'M' ) +
      "".PadLeft( c, 'C' ) +
      o;

   // Replce every instance of 'G'/'C'/'M'
   //    with the full line
   return o
      .Replace( "G", G )
      .Replace( "C", C )
      .Replace( "M", M );
};

รหัสเต็ม

using System;
using System.Collections.Generic;

namespace Namespace {
   class Program {
      static void Main( String[] args ) {
         Func<Int32, Int32, Int32, Int32, String> f = ( w, g, c, m ) => {
            string
               G = "\n".PadLeft( ++w, 'G' ),
               C = "\n".PadLeft( w, 'C' ),
               M = "\n".PadLeft( w, 'M' ),
               o = "".PadLeft( g, 'G' );

            o +=
               "".PadLeft( m, 'M' ) +
               "".PadLeft( c, 'C' ) +
               o;

            return o
               .Replace( "G", G )
               .Replace( "C", C )
               .Replace( "M", M );
         };

         List<Tuple<Int32, Int32, Int32, Int32>>
            testCases = new List<Tuple<Int32, Int32, Int32, Int32>>() {
               new Tuple<Int32, Int32, Int32, Int32>( 1, 1, 1, 1 ),
               new Tuple<Int32, Int32, Int32, Int32>( 1, 1, 1, 2 ),
               new Tuple<Int32, Int32, Int32, Int32>( 1, 1, 2, 1 ),
               //
               // ...
               //
               // The link above contains the code ready to run
               //    and with every test from the pastebin link
               //
               // Yes, it contains 342 tests ready to run.
               //
               // I can barely fit every test on a 1080p screen...
               //    ... and there's 6 tests per line... Jebus...
               //
            };

         foreach( var testCase in testCases ) {
            Console.WriteLine( $"Input:\nWidth: {testCase.Item1,3} Graham: {testCase.Item2,3} Chocolate: {testCase.Item3,3} Marshmellow: {testCase.Item4,3}\nOutput:\n{f( testCase.Item1, testCase.Item2, testCase.Item3, testCase.Item4 )}\n" );
         }

         Console.ReadLine();
      }
   }
}

ข่าว

  • v1.0 - 204 bytes- โซลูชั่นเริ่มต้น

หมายเหตุ


ชื่นชม! : D
auhmaan

7

05AB1E , 17 16 ไบต์

1 ไบต์บันทึกขอบคุณที่carusocomputing

"GCMG"S×vy²Nè.D»

ลองออนไลน์!

คำสั่งซื้อคือ W, [G,C,M]

คำอธิบาย

10, [3,2,1] ใช้เป็นตัวอย่าง

"GCMG"S           # push the list ['G','C','M','G']
       ×          # repeat each W times
                  # STACK: ['GGGGGGGGGG', 'CCCCCCCCCC', 'MMMMMMMMMM', 'GGGGGGGGGG']
        v         # for each [string, index] y,N in the list
          ²Nè     # get the amount of layers at index N from the [G,C,M] list
         y   .D   # duplicate the string y that many times
               »  # join strings by newlines

1
"GCMG"S×vy²Nè.D»พลังมหัศจรรย์คู่แฝดเปิดใช้งาน! รูปแบบของรหัส 05AB1E! นอกจากนี้ยังมีการแลกเปลี่ยนกัน แต่ก็ยังคงเป็น 16
Magic Octopus Urn

@Carococotputing: มันมีประโยชน์ที่จะไม่ทิ้งอึที่ไม่ได้พิมพ์ลงบนสแต็ก แต่ดูเหมือนว่าฉันจะลดไม่ลงในทำนองเดียวกัน
Emigna

1
มันยังน้อยกว่า 1 ไบต์และจะเอาชนะเน็คไทของคุณด้วย MATL;)
Magic Octopus Urn

@carusocomputing: Oooh เกิดขึ้นเมื่อไหร่? ฉันแน่ใจว่ามันอายุ 17 ปีเมื่อฉันเห็นมัน ดี! ;)
Emigna

ฉันมักจะโพสต์สิ่งที่โง่และทำการแก้ไข 1 นาทีหลังจากที่ฉันรู้ว่าฉันเป็นคนงี่เง่า
Magic Octopus Urn

6

Ruby, 47 ไบต์

->w,g,c,m{puts r=[?G*w]*g,[?C*w]*c,[?M*w]*m,r}

ขอบคุณ Ventero

Ruby, 51 ไบต์

->w,g,c,m{(?G*g+?C*c+?M*m+?G*g).chars{|i|puts i*w}}

โทรแบบนี้:

f=->w,g,c,m{(?G*g+?C*c+?M*m+?G*g).chars{|i|puts i*w}}

f[10,3,2,1]

->w,g,c,m{puts r=[?G*w]*g,[?C*w]*c,[?M*w]*m,r}สั้นลงเล็กน้อย
Ventero

5

PowerShellขนาด 49 ไบต์

$a,$b=$args;0..2+0|%{,("$('GCM'[$_])"*$a)*$b[$_]}

ลองออนไลน์!

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดรับคำสั่งสี่รายการจัดwidth graham chocolate marshmallowเก็บส่วนแรกเข้า$aและส่วนที่เหลือลงใน$b(โดยนัยเป็นอาร์เรย์) 0,1,2,0ลูปจากกว่าช่วง แต่ละวงเราจัดทำดัชนีเป็นสตริงGCMนำแสดงใหม่ว่าcharเป็นสตริงแล้วคูณด้วย$a(ความกว้าง) จากนั้นใช้เครื่องหมายจุลภาค (โอเปอเรเตอร์,) เปลี่ยนให้เป็นอาร์เรย์โดยการคูณดัชนีที่เหมาะสมของ$b(เช่นจำนวนเท่าใด ชั้น) อาเรย์สตริงผลลัพธ์เหล่านั้นจะถูกทิ้งไว้บนไพพ์ไลน์และเอาท์พุทจะเป็นนัยโดยมีการขึ้นบรรทัดใหม่ระหว่างองค์ประกอบ


5

C, 108 105 ไบต์

ขอบคุณ @Quentin สำหรับการบันทึก 3 ไบต์!

#define F(i,c)for(;i--;puts(""))for(j=w;j--;)putchar(c);
i,j;f(w,g,c,m){i=g;F(i,71)F(c,67)F(m,77)F(g,71)}

ลองออนไลน์!


1
#define F(i,c)for(;i--;puts(""))for(j=w;j--;)putchar(c);ช่วยประหยัดสามไบต์ :)
เควนติน

@Quentin ขอบคุณ! ผมสงสัยว่าทำไมผมไม่ได้ว่าในสถานที่แรก :)
Steadybox

4

แบตช์ 146 ไบต์

@set s=
@for /l %%i in (1,1,%1)do @call set s=G%%s%%
@for %%w in (%2.%s% %3.%s:G=C% %4.%s:G=M% %2.%s%)do @for /l %%i in (1,1,%%~nw)do @echo%%~xw

อาศัยพฤติกรรมที่คลุมเครือechoในการที่มันมักจะไม่สนใจสัญลักษณ์ระหว่างechoและข้อความที่จะสะท้อนให้เห็นถึงการล่มสลายสี่ลูปเป็นวงซ้อนกัน


4

V , 22 ไบต์

éGÄÀäjMoC
MÀÄkÀÄHdêÀP

ลองออนไลน์!

hexdump:

00000000: e947 c4c0 e46a 4d6f 430a 4d1b c0c4 6bc0  .G...jMoC.M...k.
00000010: c448 64ea c050                           .Hd..P

คำสั่งซื้อคือ

Graham, Marshmallow, Chocolate, Width

คำอธิบาย:

éG                  " Insert 'G'
  Ä                 " Duplicate this line
   Àäj              " *arg1* times, duplicate this line and the line below it
      M             " Move to the middle line
       o            " Open up a newline, and enter insert mode
        C<cr>M<esc> " Insert 'C\nM'
ÀÄ                  " Make *arg2* copies of this line (Marshmallow)
  k                 " Move up one line
   ÀÄ               " Make *arg3* copies of this line (Chocolate)
     H              " Move to the first line
      dê            " Delete this column
        ÀP          " And paste it horizontally *arg4* times

คุณสามารถเพิ่มคำอธิบายได้ไหม?
programmer5000

@ programmer5000 แน่นอน! ดูการแก้ไขของฉัน
DJMcMayhem

4

Excel, 104 ไบต์

โอ้เด็ก! สูตรที่ต้องใช้ตัวแบ่งบรรทัด

=REPT(REPT("G",A1)&"
",A2)&REPT(REPT("C",A1)&"
",A3)&REPT(REPT("M",A1)&"
",A4)&REPT(REPT("G",A1)&"
",A2)

A1มีความกว้าง
A2มีเกรแฮม
A3มีช็อคโกแลต
A4มีเมลโลว์


หากอนุญาตการฟอร์แมตล่วงหน้าคุณสามารถจัดรูปแบบเซลล์สำหรับข้อความแนวตั้งและทำให้สูตรสั้นลงเป็น 65 ไบต์:

=REPT(REPT("G",A2)&REPT("C",A3)&REPT("M",A4)&REPT("G",A2)&"
",A1)

4

เยลลี่ขนาด 13 ไบต์

“GCM”ẋ"ṁ4Fẋ€Y

โปรแกรม dyadic อินพุตคือ: [Graham's, Chocolates, Marshmallows], Width.

ลองออนไลน์!

อย่างไร?

“GCM”ẋ"ṁ4Fẋ€Y - Main link: [g,c,m], w    e.g. [1,2,1], 2
“GCM”         - literal ['G', 'C', 'M']
      "       - zip that and [g,c,m] with the dyadic operation:
     ẋ        -     repeat list               [['G'],['C','C'],['M']]
       ṁ4     - mould like [1,2,3,4]          [['G'],['C','C'],['M'],['G']]
         F    - flatten                       ['G','C','C','M','G']
          ẋ€  - repeat €ach w times           [['G','G'],['C','C'],['C','C'],['M','M'],['G','G']]
            Y - join with line feeds          ['G','G','\n','C','C','\n','C','C','\n','M','M','\n','G','G']
              - implicit print                GG
                                              CC
                                              CC
                                              MM
                                              GG

3

PHP, 85 ไบต์

for($m=$argv;$i++<4;)for($c=$m[_2342[$i]]*$m[1];$c;)echo$c--%$m[1]?"":"\n",_GCMG[$i];

หรือ

for($m=$argv;$i++<4;)for($c=$m[_2342[$i]];$c--;)echo"\n".str_pad("",$m[1],_GCMG[$i]);

รุ่นออนไลน์

PHP, 96 ไบต์

<?[$n,$w,$G,$C,$M]=$argv;for(;$i<4;$i++)for($t=${"$n[$i]"};$t--;)echo"\n".str_pad("",$w,$n[$i]);

เวอร์ชั่นออนไลน์

ขยาย

[$n,$w,$G,$C,$M]=$argv; # $argv[0] must contain a file beginning with "GCMG"
for(;$i<4;$i++) # Take the first 4 values of the filename
for($t=${"$n[$i]"};$t--;) # How many rows should be printed
echo"\n".str_pad("",$w,$n[$i]); # print $w times the actual letter

3

05AB1E , 14 ไบต์

รหัส:

…GCM‚øü׬)˜S×»

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!

คำอธิบาย:

…GCM              # Push the string "GCM"
    ‚             # Wrap with the input
     ø            # Transpose the array
      ü×          # Compute the string product of each element (['A', 3] --> 'AAA')
        ¬)˜       # Get the last element and append to the list
           S      # Split the list
            ×     # Vectorized string multiplication with the second input
             »    # Join by newlines and implicitly print

3

Python 2 ,6757 ไบต์

(แก้ไข: ตอนนี้อนุญาตให้ใช้เมทริกซ์แล้วไม่จำเป็นต้องขึ้นบรรทัดใหม่เข้าร่วม)

def s(w,g,c,m):g=['G'*w]*g;print g+['C'*w]*c+['M'*w]*m+g

3

C # (150 ไบต์)

void S(int w,int g,int c,int m){P(w,g,'G');P(w,c,'C');P(w,m,'M');P(w,g,'G');}void P(int w,int i,char c){while(i-->0)Console.Write("\n".PadLeft(w,c));}

Ungolfed:

void SMores(int w, int g, int c, int m)
{
    Print(w,g,'G');
    Print(w,c,'C');
    Print(w,m,'M');
    Print(w,g,'G');
}
void Print(int w, int i, char c)
{
    while(i-->0)
        Console.Write("\n".PadLeft(w,c));
}

3

Java, 138 ไบต์

String s(int w,int g,int c,int m){String b="";int i=-g-c,j;for(;i++<g+m;){for(j=0;j++<w;)b+=i<=-c|i>m?'G':i<=0?'C':'M';b+="\n";}return b;}

ลองออนไลน์!

คำอธิบาย:

String s(int w, int g, int c, int m) {
    String b = "";
    int i = -g - c, j;              // i is the layer
    for (; i++ < g + m;) {          // Repeat (G+C+M+G) times, starting from -g-c to m+g 
                                    //Layer 0 is the last chocolate layer

        for (j = 0; j++ < w;) {     // Repeat W times
            b += 
                i <= -c | i > m ? 'G': //If before the chocolate or after the marshmellow, output a G
                i <= 0 ? 'C' :      // Else if equal or before last chocolate layer output C
                'M';                //Otherwise output an M
        }
        b += "\n";
    }
    return b;
}


3

สวิฟต์, 138 137 134 130 ไบต์

บันทึกแล้ว 7 ไบต์ขอบคุณ@Kevin

let f=String.init(repeating:count:)
let r={w,g,c,m in f(f("G",w)+"\n",g)+f(f("C",w)+"\n",c)+f(f("M",w)+"\n",m)+f(f("G",w)+"\n",g)}

สองฟังก์ชั่นที่คืนค่าที่คาดหวัง: fเป็นฟังก์ชั่นตัวช่วยและrเป็นฟังก์ชันเหมือน lamdba ที่สร้างเอาต์พุต การใช้งาน: print(r(10,3,2,1))

ลองดูสิ!


คุณสามารถบันทึกได้หลายตัวอักษรโดยอ้างอิงตัวเริ่มต้นสตริงโดยตรง ( var f=String.init(repeating:count:);) และมันไม่ได้ช่วยให้คุณประหยัดตัวอักษรใด ๆ แต่มันไม่เสียค่าใช้จ่ายใด ๆ letดังนั้นพวกเขาควรจะเป็นทั้งสองจริงๆ
เควิน

และอีก 3 รายการโดยวางข้อโต้แย้งที่ชัดเจนในr( let r={f(f("G",$0)+"\n",$1)+f(f("C",$0)+"\n",$2)+f(f("M",$0)+"\n",$3)+f(f("G",$0)+"\n",$1)})
เควิน

@ เควินขอบคุณฉันไม่รู้ว่าคุณสามารถกำหนดค่าเริ่มต้นให้กับบางสิ่งเช่นนี้: f=String.init(repeating:count:)...
Mr. Xcoder

@ เควินเมื่อพูดถึงข้อเสนอแนะที่สองของคุณดูเหมือนว่าเกินจำนวนไบต์ใน UTF-8 ตรวจสอบจำนวนไบต์บน TIO ไม่รู้ว่าทำไม
Mr. Xcoder



2

JS (ES6), 87 ไบต์

x=(w,g,c,m)=>(f=>f`Gg`+f`Cc`+f`Mm`+f`Gg`)(([[x,y]])=>(x.repeat(w)+`
`).repeat(eval(y)))

xทำหน้าที่เป็นฟังก์ชั่นแลมบ์ดาแบบสแตนด์อโลน ผลลัพธ์มีการขึ้นบรรทัดใหม่

ลองในตัวอย่าง:


2

C, 90 ไบต์ (ขึ้นอยู่กับคำตอบของ Steadybox )

เปลี่ยนชื่อตัวแปรและใช้ประโยชน์จากตัวดำเนินการตัวประมวลผลก่อนการทำให้เป็นสตริงเพื่อลดพารามิเตอร์แมโคร ฉันหวังว่าโพสต์ความคิดนี้เป็นคำตอบของตัวเองดี :)

#define F(x)for(i=x;i--;puts(""))for(j=w;j--;)printf(#x);
i,j;f(w,G,C,M){F(G)F(C)F(M)F(G)}

ลิงก์ TIO


จะอัปโหลดแล้ว แต่ถึงขีด จำกัด การโหวต :(
programmer5000

2

F # ( 148 99 ไบต์)

let s w q="GCMG"|>Seq.iteri(fun i c->for j in 1..(q|>Seq.item(i%3))do printf"%A"("".PadLeft(w,c)))

การใช้งาน:

s 10 [2;3;4]

Ungolfed:

let smores width quantities =
    "GCMG"
    |>Seq.iteri(fun i char ->
        for j in 1..(quantities|>Seq.nth(i%3))
            do printf "%A" ("".PadLeft(width,char))) 

ฉันยังใหม่กับ F # ดังนั้นถ้าฉันทำอะไรแปลก ๆ หรือโง่โปรดแจ้งให้เราทราบ


ลิงก์ไปยัง F # น่าจะดี
programmer5000

2

JavaScript ES6, 69 68 66 ไบต์

ขอบคุณ @Arnauld สำหรับการเล่นกอล์ฟหนึ่งไบต์

a=>b=>"GCMG".replace(/./g,(c,i)=>`${c.repeat(a)}
`.repeat(b[i%3]))

ลองออนไลน์!

คำอธิบาย

รับอินพุตในรูปแบบ curried (Width)([Graham,Chocolate,Marshmallow])

การใช้.replace(/./g,...)แทนที่อักขระแต่ละตัวในสตริงGCMGด้วยค่าส่งคืนจากฟังก์ชัน(c,i)=>`${c.repeat(a)} `.repeat(b[i%3])

`${c.repeat(a)} `สร้างแต่ละบรรทัดของแครกเกอร์เกรแฮมด้วยการขึ้นบรรทัดใหม่ผนวก .repeat(b[i%3])บรรทัดนี้ซ้ำตามจำนวนครั้งที่ต้องการ


การใช้replace()จะช่วยประหยัดไบต์:a=>"GCMG".replace(/./g,(c,i)=>`${c.repeat(a[0])}\n`.repeat(a[1+i%3]))
Arnauld


1

Mathematica 102 Bytes (100 ตัวอักษร)

เคยได้ยินมาว่าในตัว s'mores ไม่ออกมาจนถึง V12

s=StringRepeat;StringReplace[s@@@({Characters@"GCMG",#/.#[[4]]->#[[1]]})<>"",x_:>x~s~#[[4]]<>"\n"]&

ค่อนข้างตรงไปตรงมาโดยใช้แนวคิดในการสร้างคอลัมน์ก่อน ชื่อฟังก์ชันยาวเสีย 35 ไบต์ สัญลักษณ์ที่มีลักษณะเป็นกล่องเดียวนั้นเป็นตัวละครที่ใช้ขนย้ายและจะวางลงใน Mathematica ได้ดี

การใช้งาน: %@{Graham, Chocolate, Marshmallows, Width} เช่น %@{3, 2, 1, 11}


1

Java 7, 226 ไบต์

String c(int w,int g,int c,int m){return x(w,'G',g)+x(w,'C',c)+x(w,'M',m)+x(w,'G',g);}String x(int w,char c,int x){String r="";for(;x-->0;r+=x(w,c));return r;}String x(int w,char c){String r="";for(;w-->0;r+=c);return r+"\n";}

หรือ (เช่น226 ไบต์ ):

String c(int w,int g,int c,int m){return x(w,71,g)+x(w,67,c)+x(w,77,m)+x(w,71,g);}String x(int...a){String r="";for(;a[2]-->0;r+=x(a[0],(char)a[1]));return r;}String x(int w,char c){String r="";for(;w-->0;r+=c);return r+"\n";}

คำอธิบาย:

String c(int w,int g,int c,int m){  // Main method with four integer parameters and String return-type
  return x(w,'G',g)                 //  Return all Graham-rows
        +x(w,'C',c)                 //   plus all Chocolate-rows
        +x(w,'M',m)                 //   Plus all Marshmallon-rows
        +x(w,'G',g);                //   Plus all Graham-rows again
}                                   // End of main method

String x(int w,char c,int x){       // Separate method (1) with two integers & character parameters and String return-type
  String r="";                      //  Result-String
  for(;x-->0;                       //  For the given amount of rows of a certain type
             r+=x(w,c)              //   Append the result-String with a row of the given character
  );                                //  End of for-loop (implicit / no body)
  return r;                         //  Return the result-String
}                                   // End of separate method (1)

String x(int w,char c){             // Separate method (2) with integer and character parameters and String return-type
  String r="";                      //  Result-String
  for(;w-->0;                       //  For the amount given as width
             r+=c                   //   Append the character to the row
  );                                //  End of for-loop (implicit / no body)
  return r+"\n";                    //  Return the result-String including a new-line
}                                   // End of separate method (2)

รหัสทดสอบ:

ลองที่นี่

class M{
  String c(int w,int g,int c,int m){return x(w,'G',g)+x(w,'C',c)+x(w,'M',m)+x(w,'G',g);}String x(int w,char c,int x){String r="";for(;x-->0;r+=x(w,c));return r;}String x(int w,char c){String r="";for(;w-->0;r+=c);return r+"\n";}

  public static void main(String[] a){
    System.out.print(new M().c(10,3,2,1));
  }
}

เอาท์พุท:

GGGGGGGGGG
GGGGGGGGGG
GGGGGGGGGG
CCCCCCCCCC
CCCCCCCCCC
MMMMMMMMMM
GGGGGGGGGG
GGGGGGGGGG
GGGGGGGGGG

1
ไม่เลว ... สำหรับ java!
programmer5000

1
@ programmer5000 Hehe ขอบคุณ! ฉันชอบเล่นกอล์ฟใน Java 7 (และบางครั้ง 8) แม้ว่าฉันจะไม่คิดว่ามันจะแข่งขันกับคำตอบอื่น ๆ อีกต่อไป .. เพียงครั้งเดียวที่ 'แข่งขันบ้าง' กับคำตอบ Java คือด้วยคำตอบ 8 ไบต์นี้และ19 คำตอบนี้จริง ๆ แล้วแย่กว่า Python เป็นครั้งแรก แม้ว่าภาษากอล์ฟเหล่านั้นที่มีการส่ง 1 หรือ 2 ไบต์จะยังคงปล่อยให้ Java ตกอยู่ในสถานการณ์ที่แน่นอน
Kevin Cruijssen

1

Haskell , 91 ไบต์

import Data.List
(#)=replicate
f w g c m=intercalate"\n"$map(w#)$g#'G'++c#'C'++m#'M'++g#'G'

ควรอธิบายด้วยตนเอง เนื่องจากมันถูกบันทึกไว้ในความคิดเห็นที่อนุญาตให้ฝึกอบรมตัวละครได้นี่เป็นรุ่น58 ไบต์ที่ส่งกลับรายการสตริง (หนึ่งรายการสำหรับแต่ละชั้น):

(#)=replicate
f w g c m=map(w#)$g#'G'++c#'C'++m#'M'++g#'G'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.