Máy phát điện tăng dần


8

Đối với những người không quen thuộc với Mô hình hạt đậu , đó là một mô hình toán học đơn giản.

Có nhiều biến thể của mẫu này, nhưng chúng tôi sẽ tập trung vào một:

Mô hình hạt đậu tăng dần

Nó trông như thế này:

1
11
21
1112
3112
211213
...

Có vẻ rất khó để có được dòng sau, nhưng nó thực sự dễ dàng. Cách để có được dòng tiếp theo là bằng cách đếm số lần một chữ số đã lặp lại trên dòng trước đó (bắt đầu đếm với mức thấp nhất, đến lớn nhất):

one
one one
two ones
one one, one two
three ones, one two
two ones, one two, one three
...

Yêu cầu / Quy tắc:

  • Chúng tôi sẽ bắt đầu tại 1
  • Nó sẽ là một đoạn
  • Phải có cách chỉ định số lượng dòng được tạo (ví dụ: 5 sẽ cho 5 dòng đầu tiên)
  • Mã phải càng ngắn càng tốt
  • Nó phải bắt đầu đếm từ thấp nhất đến lớn nhất (biến thể tăng dần)

Tôi mới ở đây, xin vui lòng cho tôi biết làm thế nào tôi có thể cải thiện. Ví dụ, tôi có nên chỉ định giới hạn ngày không?
ajax333221

1
Bạn có thể chỉ định xem bạn muốn một chương trình đầy đủ với I / O hay một đoạn trích là đủ (hoặc nếu bạn không quan tâm.) Nhưng nó có vẻ được chỉ định rõ ngay từ cái nhìn đầu tiên.
JB

@JB Cảm ơn những lời khai sáng của bạn. Tôi đã cập nhật bài viết của mình
ajax333221


Lặp lại thứ 13, và tất cả các lần lặp tiếp theo, là 21322314. Điều này có đúng không?
Joey Adams

Câu trả lời:


4

APL, 32 ký tự

⍪⌽({⍵,⍨,/{⌽⍵,+/⍵⍷d}¨⍳⌈/d←⊃⍵}⍣⎕)1

Điều này tạo ra các dòng bắt đầu từ 0 (nghĩa là 0tạo 1, 1tạo 1theo sau 1 1, v.v.), như được chỉ định bởi đầu vào của người dùng. Tôi đã sử dụng Dyalog APL cho việc này và ⎕IOnên được đặt thành mặc định là 1.

Thí dụ:

      ⍪⌽({⍵,⍨,/{⌽⍵,+/⍵⍷d}¨⍳⌈/d←⊃⍵}⍣⎕)1
⎕:
      0
1

      ⍪⌽({⍵,⍨,/{⌽⍵,+/⍵⍷d}¨⍳⌈/d←⊃⍵}⍣⎕)1
⎕:
      13
               1 
             1 1 
             2 1 
         1 1 1 2 
         3 1 1 2 
     2 1 1 2 1 3 
     3 1 2 2 1 3 
     2 1 2 2 2 3 
     1 1 4 2 1 3 
 3 1 1 2 1 3 1 4 
 4 1 1 2 2 3 1 4 
 3 1 2 2 1 3 2 4 
 2 1 3 2 2 3 1 4 
 2 1 3 2 2 3 1 4

Khi tôi có thêm thời gian, tôi sẽ viết một lời giải thích. ⍨


3

Python (2.x), 81 80 ký tự

l='1'
exec"print l;l=''.join(`l.count(k)`+k for k in sorted(set(l)))\n"*input()

Tất cả các mẹo hoặc ý kiến ​​chào mừng!

cách sử dụng: python peapotype.py
15 # nhập số lần lặp
1
11
21
1112
3112
211213
312213
212223
114213
31121314
41122314
31221324
21322314
21322314
21322314

2

Perl, 83

Tôi khá chắc chắn rằng một số guru Perl có thể làm được điều này, nhưng đây là:

$_++;$n=<>;for(;$n--;){print$_.$/;$r='';$r.=length($&).$1 while(s/(.)\1*//);$_=$r;}

Mở rộng:

$_++;$n=<>;

for(;$n--;)
{
    print $_.$/;

    $r='';$r .= length($&).$1 while (s/(.)\1*//);  # The magic
    $_=$r;
}

Số lượng hàng được truyền qua STDIN.


Không hẳn là một bậc thầy, tôi chắc chắn có những cách thậm chí ngắn hơn để được tìm thấy, nhưng 46 sử dụng khá nhiều phương pháp tương tự: Hãy thử trực tuyến!
Dom Hastings

2

J, 60 46 39 26 ký tự

1([:,(#,{.)/.~@/:~)@[&0~i.

Chỉnh sửa 3 : Đến với một cách tốt hơn để thể hiện điều này.

1([:;[:|."1[:/:~~.,.[:+/"1[:~.=)@[&0~i.

Chỉnh sửa 2 : Cuối cùng tìm thấy một cách để di chuyển đối số đến cuối chuỗi và loại bỏ các công cụ gán không cần thiết.

Trước đây:

p=.3 :'([:,[:|."1[:/:~~.,.[:+/"1[:~.=)^:(i.y)1

Chỉnh sửa 1 : Sửa lỗi đầu ra phải là yhàng thay vì hàng ythứ. Cũng rút ngắn mọi thứ một chút. Xấu hổ về 0s, dường như không thể thoát khỏi những thứ chết tiệt.

Sử dụng:

   1([:,(#,{.)/.~@/:~)@[&0~i. 1
1

   1([:,(#,{.)/.~@/:~)@[&0~i. 6
1 0 0 0 0 0
1 1 0 0 0 0
2 1 0 0 0 0
1 1 1 2 0 0
3 1 1 2 0 0
2 1 1 2 1 3

   1([:,(#,{.)/.~@/:~)@[&0~i. 10
1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
2 1 0 0 0 0 0 0
1 1 1 2 0 0 0 0
3 1 1 2 0 0 0 0
2 1 1 2 1 3 0 0
3 1 2 2 1 3 0 0
2 1 2 2 2 3 0 0
1 1 4 2 1 3 0 0
3 1 1 2 1 3 1 4

Phải thừa nhận rằng việc sử dụng bây giờ xấu hơn, nhưng prettiness không phải là tên của trò chơi ở đây ...


Điều này sẽ khó đánh bại với bất kỳ 'ngôn ngữ truyền thống' nào. Có lẽ golfscript hoặc tương tự là lên đến nhiệm vụ ;-)
ChristopheD

1

Haskell, 116

import Data.List
main=interact(unlines.map(show=<<).($iterate((>>=
 \x->[length x,head x]).group.sort)[1]).take.read)

Sử dụng:

$ runhaskell pea.hs <<< 15
1
11
21
1112
3112
211213
312213
212223
114213
31121314
41122314
31221324
21322314
21322314
21322314

1

Lisp thông thường, 140 ký tự

(defun m(x)
  (labels((p(l n)
    (if(= 0 n)
       nil
       (cons l
             (p(loop for d in(sort(remove-duplicates l)#'<)
                  append(list(count d l)d))
               (1- n))))))
    (p'(1) x)))

Đây là Lisp, vì vậy hàm trả về một danh sách các danh sách. (mx) tạo danh sách con X.


1

Toán học, 70

NestList[FromDigits@TakeWhile[DigitCount@#~Riffle~Range@9,#>0&]&,1,#]&

1

Jelly , 13 11 byte (Phản hồi đánh giá cao)

1ṢŒrUFƲСṖY

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

1ṢŒrUFƲСṖY
1     Ʋ         starting with 1, run these 4 links...
 ṢŒr            Ṣort the list and get the Œrun-length encoding of it,
    U           reverse each member of the RLE list (so it goes [repetitions, digit] instead of [digit, repetitions]),
     F          and Flatten the RLE list-of-lists to just a list of digits, which is the next number.
       С       do that (input) number of times,
         ṖY     Ṗop the last line off the output (an extra line is always calculated) and then print the numbers, separated by newlines.

1
U€chỉ có thể là U, nó véc tơ xuống mức hàng. Sau đó, bạn có thể lưu một byte nội tuyến khác ṢŒrUF, sử dụng Ʋ(4 liên kết cuối cùng dưới dạng đơn nguyên):1ṢŒrUFƲСṖY
Lynn

Cảm ơn một lần nữa rất nhiều cho những cải tiến @Lynn! Luôn luôn tốt đẹp để đi từ một chuỗi gồm hơn 5 liên kết đến 4 để bạn có thể sử dụng nhanh chóng.
Harry

1
Không có gì! (Tiny lưu ý: ṢŒrU€FƲsẽ chỉ làm việc tốt - nó cuộn [ , Œr, U€, F.] Vào một đơn nguyên Có thể sử dụng của tôi "sau đó" là một chút sai lệch ^^; Tương tự, trong một cái gì đó như abc$de$fƲsẽ hoạt động trên 4 liên kết [ a, bc$, de$, f] và cuộn chúng thành một đơn nguyên. Đây là ý nghĩa mà bạn có thể nghĩ về sự nhanh chóng là "toán tử ngăn xếp thời gian phân tích": kết quả của chúng bị đẩy lùi vào một ngăn xếp và hoạt động như thể đó là một liên kết cho sự nhanh chóng trong tương lai. )
Lynn

1
@Lynn Tôi hiểu rồi, cảm ơn bạn lần nữa! Bây giờ trở nên tốt hơn rất nhiều trong việc "đếm" các liên kết, đã có thể hoàn toàn nội tuyến câu trả lời này và tiết kiệm một byte nhờ bình luận của bạn!
Harry
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.