ทำก้อนหินก้อนใหญ่ให้กลายเป็นก้อนหินขนาดเล็ก


22

ยินดีต้อนรับสู่เครื่องบด

งานของคุณคือการทำให้หินก้อนใหญ่เป็นก้อนหินขนาดเล็กโดยการบดพวกเขา

ใส่หินขนาดใหญ่n > 3 และบดมัน

2ดำเนินการต่อไปบดหินโดยทิ้งพวกเขาเข้าไปในเครื่องบดจนขนาดของก้อนหินที่มี

หินจะถูกบดเป็นครึ่งเท่า ๆ กันเสมอ หากผลลัพธ์ของการเจียรนั้นเป็นผลลัพธ์ที่แปลก - 1

พิมพ์ผลลัพธ์ของการเจียรแต่ละอันในขณะที่คุณดำเนินการ

ตัวอย่าง

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

เอาท์พุท: 22

ผลที่ได้คือหินสองก้อนขนาด 2

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

เอาท์พุท:

2424 //two rocks of size 24
12121212 //four rocks of size 12
66666666 //8 rocks of size 6
2222222222222222

ผลที่ได้คือ 16 หินขนาด 2

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

เอาท์พุท:

1414
6666
22222222

ผลที่ได้คือ 8 หินขนาด 2

นี่คือเพื่อให้ได้รหัสที่สั้นที่สุดชนะ! ขอให้สนุกและโชคดี!


คุณสามารถคาดหวังว่ามันจะสูงกว่า 3
jacksonecac

เราจำเป็นต้องใช้รูปแบบของคุณ (เรียงต่อกันตัวเลขทั้งหมด) หรือเราสามารถใช้สิ่งต่าง ๆ เช่นรายการ? คำตอบบางอย่างดูเหมือนจะทำเช่นนั้นแทน
ทำให้เสียชีวิต

ตราบใดที่เอาต์พุตแสดงการวนซ้ำแต่ละครั้งรูปแบบไม่จำเป็นต้องเหมือนด้านบน
jacksonecac

1
ฉันจะบอกว่าอาร์เรย์ 2d ทำและ 1d ไม่ได้ แต่มันก็ขึ้นอยู่กับคุณแล้วตกลง
Jonathan Allan

1
@ user902383 ทั้งปรับนอกจากที่ระบุไว้ในการท้าทายตามฉันทามติ meta สำหรับอินพุตและเอาต์พุตทั้งคู่ก็ใช้ได้ - ดูโพสต์นี้
Jonathan Allan

คำตอบ:



8

COW, 297 291 ไบต์

MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOmoOMoOmoOmoOoommOoMoOMOOmoOMMMmoOMMMmoOOOOMoOmOoMOOMOomoOmoO
MOOMOomOoMOomoOmoomOoMMMOOOMoOmoOMMMmOomOomoomoOmoOMOOMOomOomOomOoMOomoOmoOmoOmoomOomOomOo
mOomOoMMMmoOMMMMOOMOomoOOOMmOomOoMoOmoOmoomOomOoMoomoOmoOmoOMOOMOoMOomoOMoOmOomoomoOMMMOOO
mOoMMMMMMmOoMMMMOomoo

ลองออนไลน์!

รหัสจะพิมพ์แต่ละหมายเลขในบรรทัดของตนเองและแยกการทำซ้ำด้วยการขึ้นบรรทัดใหม่ นอกจากนี้ยังพิมพ์ซ้ำซ้ำครั้งแรกด้วยตัวเองตามด้วยขึ้นบรรทัดใหม่ ดังนั้นอินพุต 5 จะให้เอาต์พุตที่ดูเหมือน5 2 2ยกเว้นบรรทัดใหม่แทนช่องว่าง ผลลัพธ์ตัวอย่างสำหรับ50ได้รับด้านล่าง

ต้นไม้คำอธิบาย:

MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOmoOMoOmoOmoOoom ;Store 10 in [0], 1 in [1], and integer input in [3]
mOoMoO                                        ;Store 1 in [2]
MOO                                           ;Loop while [2] is non-zero
   moOMMMmoOMMMmoOOOOMoOmOo                   ;   Copy [3] to [4], clear contents of [5], and store 1 in [5]
   MOO                                        ;   Loop while [4] is non-zero
      MOomoOmoO                               ;      Decrement 4 and move to 6
      MOO                                     ;      Loop while [6] is non-zero
         MOomOoMOomoO                         ;         Decrement [5] and [6]
      moo                                     ;      End loop once [6] is empty
      mOoMMMOOOMoOmoOMMMmOomOo                ;      Copy [5] to [6], and reset [5] to 1, then move back to [4]
   moo                                        ;   End loop now that [4] is empty.  [6] now contains the parity of [3]
   moOmoO                                     ;   Navigate to [6]
   MOO                                        ;   Loop while [6] is non-empty
      MOomOomOomOoMOomoOmoOmoO                ;      Decrememnt [3] and [6]
   moo                                        ;   End loop now that [6] is empty.  [3] now contains the largest even number less than the previous iteration.
   mOomOomOomOomOoMMMmoOMMM                   ;   Copy [1] to [2]
   MOO                                        ;   Loop while [2] is non-empty
      MOomoOOOMmOomOoMoOmoO                   ;      Decrement [2], increment [1], and print the number in [3].
   moo                                        ;   End loop now that [2] is empty
   mOomOoMoo                                  ;   Print a new line
   moOmoOmoO                                  ;   Navigate to [3]
   MOO                                        ;   Loop while [3] is non-empty
      MOoMOomoOMoOmOo                         ;      Decrement [3] twice and increment [4] once
   moo                                        ;   [4] now contains half of [3]
   moOMMMOOOmOoMMM                            ;   Copy [4] to [3] and clear [4]
   MMMmOoMMMMOo                               ;   Copy [3] to [2] and decrement once
moo                                           ;End loop now that [2] is empty

เอาต์พุตตัวอย่างสำหรับอินพุต 50:

50

24
24

12
12
12
12

6
6
6
6
6
6
6
6

2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2

2
ฉันไม่มีคำพูด
jacksonecac

ฉันยังไม่มีคำพูด
jacksonecac

ฉันไม่มีคำพูดใด ๆ
Edeki Okoh

ฉันรักสองปีครึ่งที่ผ่านมาผู้คนยังคงหวาดกลัว
Gabriel Benamy

7

05AB1E , 12 11 ไบต์

¸[4÷·€D=¬<#

ลองออนไลน์!

คำอธิบาย

¸             # wrap input in a list
 [            # start infinite loop
  4÷          # elementwise integer divison by 4
    ·         # elementwise multiplication by 2
     €D       # duplicate each element in the list
       =      # print it
        ¬     # get the first element of the list
         <    # decrease it by 1
          #   # if true: exit loop

6

Python 2, 55 53 ไบต์

n=input()
while n[0]>2:n=len(n)*2*[n[0]/4<<1];print n

หารด้วย 4 และเลื่อนไปทางซ้าย 1 เพื่อรับส่วนพิเศษ


4

Haskell, 75 71 60 50 47 ไบต์

f 0=[]
f n|x<-f$2*div n 4=show n:zipWith(++)x x

ลองออนไลน์! แก้ไข: ขณะนี้เอาต์พุตได้รับอนุญาตให้เป็นรายการซึ่งรวมถึงอินพุตจึงสามารถบันทึก10 13 ไบต์

การใช้งาน:

Prelude> f 50
["50","2424","12121212","66666666","2222222222222222"]

เวอร์ชัน 60 ไบต์ดั้งเดิม:

2%x=""
n%x|z<-2*div n 4=([1..x]>>show z)++"\n"++z%(x*2)
(%2)

ลองออนไลน์! ขอบคุณ Christian Sievers ที่ชี้ให้เห็นสูตรที่สั้นกว่านี้

การใช้งาน:

Prelude> (%2)50
"2424\n12121212\n66666666\n2222222222222222\n"

z<-2*div n 4คุณก็สามารถทำ
Christian Sievers

3

JavaScript (ES6) 64 59 57 ไบต์

f=s=>{for(n=1;s>2;)console.log(`${s=s/4<<1}`.repeat(n*=2))}

console.log(f.toString().length); 
f(5);
f(50);
f(30);                                  


ถ้าฉันใส่รหัสของคุณในmothereff.in/byte-counterฉันจะได้รับ 59 ไบต์?
Tschallacka

@ Tschallacka ฉันคิดว่าf=แต่เป็นเพียงการสาธิต
LarsW

อ่าโอเค. ที่ทำให้มันชัดเจน :-) ยังคงต้องได้รับ 2 ไบต์ปิด Myne แล้ว
Tschallacka


3

Java, 85 ไบต์

n->{String s="";for(int q=2,i;n>2;q*=2,s+="\n")for(i=q,n=n/4*2;i-->0;)s+=n;return s;}

การทดสอบและ ungolfed

import java.util.function.*;

class Ideone {
  public static void main(String[] args) throws java.lang.Exception {
    Function<Integer, String> f = number -> {
      String result = "";
      for (int quantity = 2, i; number > 2; quantity *= 2) {
        number = number / 4 * 2; // Make sure that the next is half or half - 1 if odd
        for (i = quantity; i > 0; i--) { // copy "quantity" times.
          result += number;
        }
        result += "\n"; // append new line
      }
      return result;
    };
    System.out.println(f.apply(50));
  }
}

หมายเหตุ: ฉันไม่รู้ว่าทำไม Ideone ให้ข้อผิดพลาดภายในดังนั้นการทดสอบมันจึงเป็นปัญหา เพื่อทดสอบเพียงคัดลอก / วางและเรียกใช้ใน Java IDE มาตรฐานของคุณ (มันใช้งานได้ที่นั่นฉันแน่ใจแล้ว))


ideoneทำงานได้ดีกับรหัสของคุณ มีบางครั้งที่ให้ข้อผิดพลาดภายในเมื่อพวกเขาทำการบำรุงรักษา (ฉันคิดว่า) ฉันเคยมีมาก่อนเมื่อฉันดูคำตอบเก่า ๆ ของฉัน +1 btw ฉันไม่เห็นอะไรที่จะสามารถตีได้มากกว่านี้ โอ้และฉันชอบn=n/4*2เคล็ดลับของคุณ :)
Kevin Cruijssen

3

C #, 88 86 83 ไบต์

บันทึก 3 ไบต์ด้วยSkorm

ที่บันทึกไว้ไบต์อื่นโดยการเปลี่ยนwhileไปเป็นforห่วงซึ่งรวมถึงการประกาศตัวแปร

บันทึก 1 ไบต์ขอบคุณYodle

n=>{var r="";for(int i,c=2;n>2;c*=2,r+="\n")for(i=0,n=n/4*2;i++<c;)r+=n;return r;};

ฟังก์ชั่นไม่ระบุชื่อซึ่งส่งคืนสตริงที่ประกอบด้วยผลลัพธ์ของการเจียรแต่ละอัน

โปรแกรมเต็มรูปแบบด้วยวิธีการที่ไม่ดีและกรณีทดสอบ [ก่อนแก้ไขล่าสุด!]:

using System;

public class Program
{
    public static void Main()
    {
        Func<int, string> f =
        n =>
        {
            var r = "";
            for (int i, c = 1; n > 2; )  // iterator and counter variable
            {
                    n = n/4 * 2;    // make sure the result if even
                    c *= 2;         // keep track of the number of rocks
                    for (i = 0; i++ < c; )  // store the current line made of [c] rocks of size [n]
                        r += n;
                    r += "\n";      // add a trailing newline to the string resulted from this step
            }
            return r;       // return the entire history
        };

        //test cases:
        Console.WriteLine(f(5));
        Console.WriteLine(f(50));
        Console.WriteLine(f(30));
    }
}

2
คิดว่าคุณสามารถบันทึก 1 byte ใน for for loop ได้โดยทำfor(i=0;i++<c;)
Yodle

คุณยังสามารถบันทึก 1 ไบต์ตามที่ yoddle พูดถึงโดยเปลี่ยนวินาทีของคุณเป็นfor (i = 0; i++ < c;)
MX D

ลืมที่จะอัพเดทโพสต์ อัปเดตตอนนี้ :)
adrianmp

1
คุณสามารถอัปเดตตัวนับของคุณเพื่อเริ่มต้นที่ 2 และ * = 2 แต่ละการวนซ้ำเพื่อบันทึก 1 ไบต์และย้ายผนวกบรรทัดใหม่ จากนั้นคุณสามารถย้าย n = n / 4 * 2 ลงในลูปที่สองและลบวงเล็บปีกกาเพื่อประหยัดอีก 2 n=>{var r="";for(int i,c=2;n>2;c*=2,r+="\n")for(i=0,n=n/4*2;i++<c;)r+=n;return r;}
Skorm

2

CJam , 21 ไบต์

l~]{{2/-2&_}%_n_2-}g;

ลองออนไลน์! (เป็นชุดทดสอบ)

คำอธิบาย

l~]      e# Read input, evaluate and wrap it in a singleton list.
{        e# Do while...
  {      e#   Map this block over the list of rocks.
    2/   e#   Halve the rock.
    -2&  e#   Bitwise AND with -2, clearing the least-significant bit and
         e#   rounding down to an even integer.
    _    e#   Duplicate.
  }%
  _n     e# Print a copy of the current list of rocks.
  _2-    e# Continue if the current list of rocks contains values that aren't 2.
}g
;        e# Discard the final result to prevent printing it again.

2

Pyth, 18 16 13 ไบต์

WhQ=Q*2my/d4\n

* \nเป็นบรรทัดใหม่
คำอธิบาย:

W              # While
 hQ            # first element of Q - 0 is falsy
   =Q          # assign to Q
     *2        # the double of the (list) that is returned
       m       # form this \/ map
         /d4   # divide every element by 4
        y      # and double
            \n # print Q

ลองที่นี่


2

MATL , 13 ไบต์

`K/kEthttH>]x

ลองออนไลน์!

`       % Do...while
  K/k   %   Divide by 4 and round down. Takes input implicitly in the first iteration
  E     %   Multiply by 2
  th    %   Attach a copy of itself (creates a longer array)
  t     %   Duplicate. This copy will be used for further grinding, keeping the original
  tH>   %   Duplicate. True if the values exceed 2. Used as loop condition
]       % End. The loop exits if the latest array contains 2
x       % Delete last copy. Implicitly display the entire stack

2

PHP, 72 67 64 ไบต์

for($n=$argv[$k=1];$n>2;)echo str_repeat($n=$n/2&~1,$k*=2),"\n";

รับอาร์กิวเมนต์จากบรรทัดคำสั่ง -rทำงานด้วย


2

เยลลี่ , 13 12 11 ไบต์

:4Ḥx2µȦпṖY

TryItOnline!

หมายเหตุ: OP ระบุว่าอินพุตอาจอยู่ในเอาต์พุตด้วย

อย่างไร?

:4Ḥx2µȦпṖY - Main link: rockSize
     µ      - monadic separation
       п   - loop collect intermediate results while
      Ȧ     - any
:4          -     integer division (vectorises) by 4
  Ḥ         -     double (vectorises)
   x2       -     repeat the elements 2 times
         Ṗ  - pop (remove the trailing list of zeros)
          Y - join with line feeds

รุ่นที่ไม่มีอินพุตแสดงเป็น 12 ไบต์: :4Ḥḟ0x2µÐĿḊG


2

Perl, 40 35 30 + 1 = 31 ไบต์

วิ่งด้วย-nธง

-4 ไบต์ขอบคุณ @Dada

say$_ x($.*=2)while$_=$_>>1&~1

ลองออนไลน์!

Perl อัตโนมัติอ่านอินพุตลงในตัวแปร$_เมื่อ-nมีการตั้งค่า $.เป็นตัวแปรพิเศษที่ตั้งไว้1ที่จุดเริ่มต้นของโปรแกรมโดยล่ามดังนั้นฉันจึงสามารถใช้เป็นฐานสำหรับการเพิ่มเป็นสองเท่า การวนซ้ำของwhileลูปทุกครั้งจะเลื่อน$_ลงเล็กน้อยและดำเนินการตรรกะและกับลบของตัวเองลบหนึ่งเพื่อยกเลิกบิตนั้น


คุณสามารถเล่นกอล์ฟได้ถึง 31 ไบท์: perl -nE 'say$_ x($.*=2)while$_=$_>>1&~1'(บางทีนี่อาจจะสามารถเล่นกอล์ฟได้ดียิ่งขึ้นฉันไม่ได้ใช้เวลามากมายกับมัน)
Dada

2

PowerShell 3+, 58 54 ไบต์

for($s=$input;$s;$s=($s-shr2)*2){"$s"*(2-shl($i++)-1)}

ขอบคุณTimmyD ที่ช่วยฉัน 4 ไบต์!

Ungolfed เล็กน้อย (การจัดรูปแบบ)

for ( $s = $input ; $s ; $s = ( $s -shr 2 ) * 2 ) {
    "$s" * (2 -shl ($i++)-1)
}

คำอธิบาย

ฉันใช้การหารเดียวกันด้วย 4 คูณด้วย 2 กลอุบายเป็นคำตอบอื่น ๆ มากมาย แต่ฉันพบปัญหา PowerShell แปลงตัวเลขเป็นจุดลอยตัวหากจำเป็นระหว่างการแบ่งและสำหรับการเล่นกอล์ฟที่น่ารำคาญเพราะ$v/4*2กลายเป็นสิ่งที่ไม่น่า[int]($v/4)*2สนใจ ผมได้รับรอบว่าการใช้ bitshifting -shrสำหรับการแบ่งด้วย

สำหรับการคำนวณจำนวนครั้งในการพิมพ์การวนซ้ำฉันเพิ่งใช้(2^$i)-1ซึ่งทำงานได้เป็นอย่างดีและมีผลเพิ่มเติมจากการทิ้งค่าอินพุต การพยายามคูณด้วย 2 นั้นเป็นปัญหาเพราะการเริ่มจาก 0 ทำให้เป็นการยากที่จะเพิ่มค่าด้วยการ$i*=2เริ่มต้นจาก 1 และต้องมีการแก้ไขมากเกินไปเพื่อให้ได้ตัวเลขที่ถูกต้อง

เนื่องจาก PowerShell ไม่มีโอเปอเรเตอร์สำหรับมันและฉันต้องการหลีกเลี่ยง[Math]::Pow()ฉันจึงต้องพึ่งพาการเปลี่ยนบิตอีกครั้งสำหรับกำลัง 2


@ TimmyD ขออภัยลืมพูดถึงรุ่นและเคล็ดลับดี; ขอบคุณ!
ต้มตุ๋น

1

Python 2, 47 ไบต์

เนื่องจาก OP กล่าวว่าอาร์เรย์ 1D ซึ่งรวมอินพุตนั้นดีฉันจึงได้ฟังก์ชั่นเรียกซ้ำนี้ซึ่งโชคไม่ดีที่ผูกกับผู้ชนะ Python ปัจจุบันเท่านั้น

f=lambda s,n=1:[s]*n+(f(s/4*2,n*2)if s>3else[])

f=lambda r,n=1:[r]*n+(r>3and f(r/4*2,n*2)or[]) for 46
Jonathan Allan

1

Perl, 47 ไบต์

$a=<>>>1;say 2*(($a>>=1)||die)x(1<<$_)for 1..$a

ไม่มีตัวเลือกบรรทัดคำสั่งในเวลานี้ (ผิดปกติสำหรับ Perl) แนวคิดพื้นฐานก็คือเมื่อหินทุกก้อนในขั้นตอนใดก็ตามมีขนาดเท่ากันเราเพียงบันทึกขนาด (เป็น$a) และจำนวน (เป็น$_) แทนที่จะบันทึกรายการทั้งหมด ฉันไม่สามารถหาวิธีกำจัดพื้นที่ (หรือ+) หลังจากsay; คุณสามารถย้าย2*แต่มันจะไม่แจงอย่างถูกต้องหากมันตามด้วยวงเล็บเปิด

ฉันอดไม่ได้ที่จะเขย่าความรู้สึกว่ามันเป็นไปไม่ได้ แต่ฉันก็มองไม่เห็น


ถ้าฉันพยายามตีกอล์ฟให้มากฉันจะได้คำตอบของ Gabriel Benamy ทุกครั้ง เพียงเพื่อแสดงไม่กี่ขั้นตอน: ความdieรู้สึกที่ชัดเจนย่อยที่ดีที่สุด แต่เรายังคงต้องมีวิธีการตรวจสอบว่าเราจำเป็นที่จะหยุดหรือไม่ -> วิธีการแก้ปัญหาคือการใช้ในขณะที่แทน:for while$a>1แต่เราต้องไปหาแทน$_: ตัวแปร unitialized ใด ๆ ที่สามารถทำมันได้เปลี่ยนจาก1<<$_ 1<<++$xดังนั้นตอนนี้$_มีอิสระที่จะนำมาใช้แล้วเราสามารถใช้-nและแทนที่ทุก$aด้วยและกลายเป็นคำสั่งแรก$_ $_>>=1เนื่องจากเราได้-n, $.มีการตั้งค่าเพื่อให้เราสามารถแทนที่ด้วย1<<++$l $.*=2
Dada

การแก้ไขทั้งหมดจะสร้างperl -nE '$_>>=1;say 2*($_>>=1)x($.*=2)while$_>1'(39 ไบต์) จากนั้นสังเกตว่า$_>>=1ทำสองครั้งเพื่อให้เราสามารถกำจัดได้ (อันแรก) พยายามกำจัดมันฉันได้say$_ x($.*=2)while($_>>=1)/2>1(วางทั้งสองอย่างไว้ในwhileเงื่อนไข) แต่ผลที่เป็นธรรม ( $_สามารถคี่) while$_=$_>>1&~1และพยายามที่จะทำให้แน่ใจว่ามันจะยิ่งผมจบลงด้วย say$_ x($.*=2)while($_=$_>>1&~1)ดังนั้นรหัสอยู่ในขณะนี้
Dada

ฉันพลาดว่ามีคำตอบ Perl แล้ว ฉันเดาว่าถ้าการเล่นกอล์ฟลงจะกลายเป็นสิ่งที่ซ้ำกันมันมีจุดไม่มากในการแก้ไข ในทางกลับกันมันไม่ผิดจริง ๆ ดังนั้นจึงไม่มีประเด็นในการลบมันเช่นกัน เราน่าจะดีที่สุดเพียงแค่ปล่อยให้มันเป็นเครื่องพิสูจน์ถึงพลังการเล่นกอล์ฟ Perl ที่ด้อยกว่าของฉัน

ฉันเห็นด้วยมันแตกต่างจากโซลูชัน Perl อื่น ๆ และจากความคิดเห็นก่อนหน้าของฉันฉันพยายามแสดงให้เห็นว่าวิธีเดียวที่ฉันสามารถตีกอล์ฟได้ก็จะเปลี่ยนเป็นโซลูชันอื่น ดังนั้นปล่อยให้มันรู้สึกเหมือนเป็นทางออกที่ถูกต้อง
Dada

1

Vim 61 54 ไบต์

qqYpPJ0yw:s;\d*;="/2
;g
:let @t=(">7)+1
@tkjjG@qq@q

TryItOnline!

Unprintables:

qqYpPJ0yw:s;\d*;^R=^R"/2
;g
:let @t=(^R">7)+1
@tkjjG@qq@q

โชคดีที่เป็นกลุ่มโดยอัตโนมัติตัดทอนที่ x / 2


1

JavaScript, 71 63 59 58 ไบต์

ฉันมากับวิธีแก้ปัญหาจาวาสคริปต์นี้ ใหม่ทั้งหมดในการเล่นกอล์ฟ แต่ฉันสนุกกับการนี้สนุก

บันทึกแล้ว 4 ไบต์ด้วยคำแนะนำ Titus ที่ใช้สำหรับลูป

พื้นฐานที่ไม่ดี

for(o = i = 30; i > 1; i= i/4<<1) {
   console.log(`${i}`.repeat(o / i));
}

รุ่น golfed

for(o=i=30;i>1;i=i/4<<1){console.log(`${i}`.repeat(o/i));}

ฉันเปิดกว้างสำหรับคำแนะนำวิธีการปรับปรุง / เรียนรู้การเล่นกอล์ฟ

เครื่องทดสอบอินพุต


1
คุณสามารถบันทึกไบต์ที่สองกับวง:for for(o=i=30;i>2;console.log(...)){...}และเมื่อรวมชุดการเจียรสองตัวเข้ากับชิ้นเดียวคุณสามารถลบวงเล็บปีกกา: i=i/4<<1;(-5) ไม่แน่ใจว่าi=i/4*2;จะทำเช่นเดียวกัน
ติตัส

1
ฉันพนันได้เลยว่าคุณยังไม่ได้ทดสอบ
ติตัส

ยังไม่ต้องวิ่งจากพีซีเพื่อจับลูก ๆ ของฉัน
Tschallacka


1

Swift, 84 Bytes

func g(n:Int){var n=n,i=2;while n>2{n=n/4*2;print(Array(repeating:n,count:i));i*=2}}

Ungolfed

func grind(rockSize: Int) {
    var rockSize = rockSize
    var rockCount = 1

    while rockSize > 2 {
        rockSize = rockSize / 4 * 2
        rockCount *= 2

        let output = Array(repeating: rockSize, count: rockCount)
        print(output)
    }
}

1

Befunge ขนาด 45 ไบต์

&1vg0_\:.\v
:\<  ^!:-1<p00:*2\.:*2/4,+55_@#`2

ลองออนไลน์!

คำอธิบาย

&           read the rock size
1           initialise the count
<           start of main loop going right to left

  \         swap the size to the top of the stack
  :2`#@_    if size is not > 2 then exit
  55+,      output a line break
  4/2*      size = size/4*2, i.e. split into even halves
  :.        output the size
  \         swap the count to the top of the stack
  2*        count = count*2
  :00p      save count for later

  <         start of inner loop
    1-      decrement the count
    :!^_    break out of the loop if the count is zero
    \       swap the size to the top of the stack
    :.      output the size
    \       swap the count to the top of the stack
    v       back to the start of the inner loop    

  0g        restore the saved count
  v         back to the start of the main loop

1

Javascript, 106 ไบต์

กอล์ฟรหัสแรกคิดว่าฉันต้องไปแล้ว (มันไม่ค่อยดีเท่าไหร่)

for(;i[i.length-1]>3;){for(var x=0;x<i.length;x++)i[x]/=2,i[x]%2===1&&i[x]--;i=i.concat(i),console.log(i)}

Unminified:

while (input[input.length - 1] > 3) {
    for (var x = 0; x < input.length; x++) {
        input[x] /= 2;
        if (input[x] % 2 === 1) input[x]--;
    }
    input = input.concat(input);
    console.log(input);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.