Biến đá lớn thành đá nhỏ


22

Chào mừng bạn đến với máy xay.

Nhiệm vụ của bạn là biến những tảng đá lớn thành những tảng đá nhỏ bằng cách nghiền chúng.

Lấy một đầu vào của một tảng đá lớn có kích thước n > 3 và nghiền nó.

Tiếp tục nghiền đá bằng cách đổ chúng vào máy xay cho đến khi kích thước của tất cả các tảng đá được 2.

đá luôn được nghiền thành hai nửa bằng nhau. Nếu kết quả của một lần mài là kết quả lẻ - 1.

In đầu ra của mỗi lần mài khi bạn tiến hành.

Ví dụ

đầu vào: 5

đầu ra: 22

Kết quả là hai tảng đá cỡ 2

đầu vào: 50

đầu ra:

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

kết quả là 16 tảng đá cỡ 2

đầu vào: 30

đầu ra:

1414
6666
22222222

kết quả là 8 tảng đá cỡ 2

Đây là vì vậy đoạn mã ngắn nhất sẽ thắng! Chuc vui vẻ va nhiêu may măn nhe!


Bạn có thể mong đợi nó ở trên 3.
jacksonecac

Chúng tôi có phải sử dụng định dạng của bạn (tất cả các số được nối) hay chúng tôi có thể sử dụng những thứ như danh sách không? Một số câu trả lời dường như làm điều đó thay vào đó.
Gây tử vong

Miễn là đầu ra hiển thị mỗi lần lặp, định dạng không cần phải giống như trên.
jacksonecac

1
Tôi có thể nói rằng một mảng 2d thì có và 1d thì không, nhưng điều đó tùy thuộc vào bạn.
Jonathan Allan

1
@ user902383 hoặc là tốt trừ khi được chỉ định trong thử thách theo sự đồng thuận meta . Đối với đầu vào và đầu ra, một lần nữa cả hai đều ổn - xem bài đăng này .
Jonathan Allan

Câu trả lời:



8

COW, 297 291 byte

MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOmoOMoOmoOmoOoommOoMoOMOOmoOMMMmoOMMMmoOOOOMoOmOoMOOMOomoOmoO
MOOMOomOoMOomoOmoomOoMMMOOOMoOmoOMMMmOomOomoomoOmoOMOOMOomOomOomOoMOomoOmoOmoOmoomOomOomOo
mOomOoMMMmoOMMMMOOMOomoOOOMmOomOoMoOmoOmoomOomOoMoomoOmoOmoOMOOMOoMOomoOMoOmOomoomoOMMMOOO
mOoMMMMMMmOoMMMMOomoo

Hãy thử trực tuyến!

Mã này in mỗi số trên dòng riêng của nó và phân tách các lần lặp với một dòng mới bổ sung. Nó cũng tự in lần lặp đầu tiên, theo sau là một dòng mới. Vì vậy, đầu vào là 5 sẽ cho đầu ra trông giống như 5 2 2ngoại trừ dòng mới thay vì khoảng trắng. Đầu ra mẫu cho 50được đưa ra dưới đây.

Cây giải thích:

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

Đầu ra mẫu cho đầu vào 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
Tôi không có từ nào
jacksonecac

Tôi vẫn không có lời
jacksonecac

Tôi không có từ nào
Edeki Okoh

Tôi yêu cách hai năm rưỡi sau, điều này vẫn khiến mọi người kinh hoàng.
Gabriel Benamy

7

05AB1E , 12 11 byte

¸[4÷·€D=¬<#

Hãy thử trực tuyến!

Giải trình

¸             # 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 byte

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

Chia cho 4 và dịch chuyển trái cho 1 để có được phân chia đặc biệt


4

Haskell, 75 71 60 50 47 byte

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

Hãy thử trực tuyến! Chỉnh sửa: Vì đầu ra hiện được phép là một danh sách bao gồm đầu vào, 10 13 byte có thể được lưu.

Sử dụng:

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

Phiên bản 60 byte gốc:

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

Hãy thử trực tuyến! Cảm ơn Christian Sievers đã chỉ ra công thức ngắn hơn.

Sử dụng:

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

Bạn chỉ có thể làm z<-2*div n 4.
Christian Sievers

3

JavaScript (ES6) 64 59 57 byte

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


nếu tôi đặt mã của bạn vào Mothereff.in/byte-count tôi nhận được 59 byte?
Tschallacka

@Tschallacka Tôi nghĩ rằng f=nhưng chỉ dành cho bản demo
LarsW

À được rồi. Điều đó làm cho nó rõ ràng :-) vẫn phải nhận được 2 byte sau
myne

3

Python 2, 48 47 byte

s=input()
n=1
while s>3:s=s/4*2;n*=2;print`s`*n

s=s/4*2sẽ làm việc để tiết kiệm 1 byte.
Jonathan Allan

3

Java, 85 byte

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

Kiểm tra và không có người

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

Lưu ý: Tôi không biết tại sao, Ideone liên tục đưa ra lỗi nội bộ, vì vậy việc kiểm tra nó là một vấn đề. Để kiểm tra, chỉ cần sao chép / dán và chạy trong Java IDE tiêu chuẩn của bạn. (Nó hoạt động ở đó, tôi chắc chắn về nó;))


ideone hoạt động tốt với mã của bạn. Đôi khi, đó là một lỗi nội bộ khi họ đang bảo trì (tôi nghĩ vậy). Tôi đã có nó trước đây khi tôi nhìn lại những câu trả lời cũ của tôi. +1 btw, tôi không thấy bất cứ điều gì có thể được chơi gôn nhiều hơn. Oh, và tôi thích n=n/4*2thủ thuật của bạn . :)
Kevin Cruijssen

3

C #, 88 86 83 byte

Đã lưu 3 byte nhờ Skorm

Lưu byte khác bằng cách thay đổi whilevào một forvòng lặp trong đó bao gồm khai báo biến

Đã lưu 1 byte nhờ 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;};

Hàm ẩn danh trả về một chuỗi bao gồm kết quả của mỗi lần mài.

Chương trình đầy đủ với phương pháp vô căn cứ và các trường hợp thử nghiệm [trước lần chỉnh sửa cuối cùng!]:

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
Hãy nghĩ rằng bạn có thể lưu 1 byte trong vòng lặp for bằng cách thực hiệnfor(i=0;i++<c;)
Yodle

Bạn vẫn có thể lưu 1 byte, như yoddle đã đề cập bằng cách thay đổi lần thứ hai của bạn thànhfor (i = 0; i++ < c;)
MX D

Quên cập nhật bài viết. Cập nhật ngay bây giờ :)
adrianmp

1
Bạn có thể cập nhật bộ đếm của mình để bắt đầu ở mức 2 và * = 2 mỗi lần lặp để lưu 1 byte và di chuyển thêm dòng mới. Sau đó, bạn có thể di chuyển n = n / 4 * 2 vào vòng lặp thứ hai và tháo niềng răng để tiết kiệm thêm 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 byte

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

Hãy thử trực tuyến! (Là một bộ thử nghiệm.)

Giải trình

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

Bình thường, 18 16 13 byte

WhQ=Q*2my/d4\n

* \nlà một dòng mới
Giải thích:

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

Thử ở đây


2

MATL , 13 byte

`K/kEthttH>]x

Hãy thử trực tuyến!

`       % 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 byte

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

Đưa đối số từ dòng lệnh. Chạy với -r.


2

Thạch , 13 12 11 byte

:4Ḥx2µȦпṖY

Dùng thử trực tuyến!

Lưu ý: OP tuyên bố rằng đầu vào cũng có thể nằm trong đầu ra.

Làm sao?

: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

Phiên bản không có đầu vào được hiển thị cho 12 byte: :4Ḥḟ0x2µÐĿḊG


2

Perl, 40 35 30 + 1 = 31 byte

Chạy với -ncờ

-4 byte nhờ @Dada

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

Hãy thử trực tuyến!

Perl tự động đọc đầu vào vào biến $_khi -nđược đặt. $.là một biến đặc biệt được đặt 1vào đầu chương trình bởi trình thông dịch, vì vậy tôi có thể sử dụng nó làm cơ sở để nhân đôi. Mỗi lần lặp của whilevòng lặp, nó sẽ dịch chuyển $_xuống và thực hiện logic VÀ chống lại sự tiêu cực của chính nó trừ đi một để loại bỏ các bit đó.


Bạn có thể đánh gôn xuống tới 31 byte: perl -nE 'say$_ x($.*=2)while$_=$_>>1&~1'(có thể điều này có thể được đánh gôn hơn nữa, tôi đã không dành nhiều thời gian cho nó).
Dada

2

PowerShell 3+, 58 54 byte

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

Cảm ơn TimmyD đã tiết kiệm cho tôi 4 byte!

Hơi khó hiểu (định dạng)

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

Giải trình

Tôi đang sử dụng cùng một cách chia cho 4 nhân với 2 mẹo như nhiều câu trả lời khác, nhưng tôi gặp phải một vấn đề. PowerShell chuyển đổi số thành điểm nổi nếu cần trong quá trình phân chia và để chơi golf gây khó chịu vì $v/4*2trở thành một thứ gì đó không đẹp mắt [int]($v/4)*2. Tôi đã khắc phục điều đó bằng cách sử dụng bithifting cho phép chia -shr.

Để tính toán bao nhiêu lần để in một lần lặp, tôi chỉ cần thực hiện (2^$i)-1công việc độc đáo và có tác dụng bổ sung để loại bỏ giá trị đầu vào. Cố gắng chỉ nhân với 2 là có vấn đề vì bắt đầu từ 0 khiến việc tăng giá trị chỉ bằng $i*=2và bắt đầu từ 1 đòi hỏi quá nhiều sự điều chỉnh để có được số đúng.

Vì PowerShell không có toán tử cho nó và tôi muốn tránh [Math]::Pow(), tôi đã dựa vào bithifting một lần nữa cho khả năng 2 của mình.


@TimmyD whoops quên đề cập đến phiên bản, và mẹo hay; cảm ơn!
briantist

1

Python 2, 47 byte

Vì OP nói rằng mảng 1D bao gồm đầu vào vẫn ổn, tôi đã tìm ra hàm đệ quy này, điều không may chỉ liên quan đến người chiến thắng Python hiện tại.

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[]) cho 46
Jonathan Allan

1

Perl, 47 byte

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

Không có tùy chọn dòng lệnh, lần này (bất thường cho Perl). Ý tưởng cơ bản là vì tất cả các tảng đá ở bất kỳ bước nào đều có cùng kích thước, chúng tôi chỉ ghi lại kích thước (in $a) và số (in $_), thay vì ghi lại toàn bộ danh sách. Tôi không thể tìm cách thoát khỏi không gian (hoặc +) sau đó say; bạn có thể di chuyển 2*nhưng nó sẽ không phân tích chính xác nếu nó đi theo dấu ngoặc đơn mở.

Tôi không thể không lay chuyển cảm giác rằng điều này là ngẫu hứng, nhưng tôi không thể thấy thế nào.


Nếu tôi cố gắng đánh golf nó nhiều, tôi sẽ kết thúc với câu trả lời của Gabriel Benamy mỗi lần. Chỉ cần hiển thị một vài bước: dierõ ràng cảm thấy tối ưu phụ. Nhưng chúng ta vẫn cần một cách để kiểm tra xem chúng ta có cần dừng lại hay không -> một giải pháp là sử dụng một lúc thay vì for: while$a>1. Nhưng chúng ta cần tìm một sự thay thế cho $_: bất kỳ biến đơn vị nào cũng có thể làm điều đó: thay thế 1<<$_bằng 1<<++$x. Vì vậy, bây giờ $_là miễn phí để được sử dụng, sau đó chúng ta có thể sử dụng -nvà thay thế mọi thứ $abằng một $_, và hướng dẫn đầu tiên trở thành $_>>=1. Vì chúng ta có -n, $.được thiết lập, vì vậy chúng ta có thể thay thế 1<<++$lbằng $.*=2.
Dada

Làm tất cả những sửa đổi đó sẽ tạo ra perl -nE '$_>>=1;say 2*($_>>=1)x($.*=2)while$_>1'(39 byte). Sau đó, lưu ý rằng nó $_>>=1được thực hiện hai lần, vì vậy chúng ta có thể cố gắng loại bỏ một (cái đầu tiên). Cố gắng để thoát khỏi nó, tôi đã nhận được say$_ x($.*=2)while($_>>=1)/2>1(đặt cả hai trong whiletình trạng này). Nhưng kết quả là sai ( $_có thể là kỳ lạ), và cố gắng đảm bảo rằng nó thậm chí, tôi kết thúc với while$_=$_>>1&~1. Vì vậy, mã là bây giờ say$_ x($.*=2)while($_=$_>>1&~1).
Dada

Tôi đã bỏ lỡ rằng đã có một câu trả lời Perl. Tôi đoán rằng nếu việc đánh gôn này biến nó thành một bản sao, thì sẽ không có nhiều điểm trong việc chỉnh sửa nó. Mặt khác, nó không thực sự sai, vì vậy cũng không có nhiều điểm trong việc xóa nó. Có lẽ chúng ta tốt nhất nên để nó như một minh chứng cho năng lực chơi gôn Perl kém hơn của tôi.

Tôi đồng ý, nó đủ khác biệt so với giải pháp Perl khác và với những bình luận trước đây của tôi, tôi đã cố gắng chỉ ra rằng cách duy nhất tôi có thể chơi golf sẽ biến nó thành giải pháp khác. Vì vậy, để lại nó như nó cảm thấy như là giải pháp đúng.
Dada

1

Vim 61 54 byte

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

Dùng thử trực tuyến!

Không thể in

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

May mắn thay vim tự động cắt ngắn trên x / 2.


1

JavaScript, 71 63 59 58 byte

Vâng, tôi đã đưa ra giải pháp javascript này. Hoàn toàn mới trong việc chơi golf, nhưng tôi cho rằng đây là một thử thách thú vị

Đã lưu 4 byte nhờ đề xuất Titus bằng vòng lặp for.

cơ sở không có căn cứ:

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

Phiên bản chơi gôn

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

Tôi đang mở để được gợi ý cách cải thiện nó / học chơi gôn

kiểm tra đầu vào


1
Bạn có thể lưu hai byte bằng một forvòng lặp : for(o=i=30;i>2;console.log(...)){...}. Và với việc kết hợp hai phép mài thành một, bạn có thể loại bỏ các dấu ngoặc: i=i/4<<1;(-5). Không chắc chắn nếu i=i/4*2;sẽ làm như vậy.
Tít

1
Tôi cá là bạn đã thử nghiệm điều đó.
Tít

chưa, phải chạy từ máy tính để bắt con tôi
Tschallacka

1

BASH, 81 byte

n=$1
h=1
while [ ${n//2} ];do
printf -v s %$[h=h*2]s
echo ${s// /$[n=n/4*2]}
done

1

Swift, 84 byte

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

Bị đánh cắp

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 byte

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

Hãy thử trực tuyến!

Giải trình

&           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 byte

Golf mã đầu tiên, nghĩ rằng tôi có một đi. (Không được tốt lắm).

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

Chưa hoàn thành:

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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.