Mô hình xen kẽ


16

Trong một câu hỏi stackoverflow hiện đã bị xóa, ai đó đã đăng như sau:

Viết chương trình hoặc hàm để in các mẫu xen kẽ trong *#dựa trên một số nguyên cho trước n. Vài ví dụ:

Đầu vào: n=1
Đầu ra:

*

Đầu n=5
ra đầu vào :

*####
###**
***##
###**
*####

Đầu vào: n=8
Đầu ra:

*#######
######**
***#####
####****
****####
#####***
**######
#######*

Vì nó trông giống như một thử thách chơi gôn khá thú vị, đây rồi.

Làm thế nào là những mô hình xây dựng?

Dòng đầu tiên bắt đầu bằng một dấu vết *, theo sau là n-1số lượng dấu #.
Dòng thứ hai sau đó chứa hai *, với n-2số lượng hàng đầu #.
Dòng thứ ba bắt đầu bằng ba *, theo sau là n-3số lượng dấu #.
Vân vân.

Khi chúng tôi đạt đến mức trung bình ( n/2), chúng tôi sẽ đếm lại một lần nữa với số lượng *, có thể thấy trong các ví dụ trên.

GHI CHÚ rằng đối với các số đầu vào lẻ, cặp dòng nghịch đảo (đầu tiên và cuối cùng; thứ hai và tiếp theo cuối cùng, v.v.) hoàn toàn giống nhau. Trong n=5ví dụ, dòng đầu tiên và cuối cùng là *####; dòng thứ hai và tiếp theo là dòng cuối cùng ###**.
Tuy nhiên, đối với các số đầu vào chẵn, cặp đường nghịch đảo được đảo ngược. Trong n=8ví dụ, dòng đầu tiên và cuối cùng là *##############*; dòng thứ hai và bên cạnh dòng cuối cùng là ######****######; Vân vân.

Quy tắc thử thách:

  • Bạn có thể sử dụng bất kỳ hai ký tự có thể in riêng biệt thay vì *#. Bạn có thể sử dụng AB; 37; <>; vv Hãy nêu câu trả lời của bạn những gì bạn đã sử dụng.
  • Bạn có thể giả sử nsẽ là một số nguyên dương ( >= 1)
  • Bạn được phép xuất một danh sách / mảng chuỗi cho mỗi dòng hoặc ma trận ký tự 2D, thay vì in chúng thành STDOUT.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.

Các trường hợp thử nghiệm (từ đầu n=1đến cuối n=10)

*

*#
#*

*##
#**
*##

*###
##**
**##
###*

*####
###**
***##
###**
*####

*#####
####**
***###
###***
**####
#####*

*######
#####**
***####
###****
***####
#####**
*######

*#######
######**
***#####
####****
****####
#####***
**######
#######*

*########
#######**
***######
#####****
*****####
#####****
***######
#######**
*########

*#########
########**
***#######
######****
*****#####
#####*****
****######
#######***
**########
#########*

" Bạn có thể sử dụng bất kỳ hai ký tự riêng biệt nào thay vì * và #. " - Chúng có phải được in không? Chúng ta có thể sử dụng NUL và SOH (mã ASCII 0 và 1) không?
ngn

@ngn Xin lỗi, chỉ có thể in ký tự. Sẽ làm rõ trong mô tả thách thức.
Kevin Cruijssen

Câu trả lời:


14

Thạch , 9 byte

>þµoṚUÐeY

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

Giải trình

>þ           Create a table of (x>y) over [1…n]×[1…n]:
               [0 1 1 1 1]
               [0 0 1 1 1]
               [0 0 0 1 1]
               [0 0 0 0 1]
               [0 0 0 0 0]
  µ          Take this array, and...
   oṚ        OR it with its reverse:
               [0 1 1 1 1]
               [0 0 1 1 1]
               [0 0 0 1 1]
               [0 0 1 1 1]
               [0 1 1 1 1]
    UÐe      Apply U (reverse) to even-indexed rows.
       Y     Join by newlines.

17

Python 2 , 62 byte

lambda n:["%*s"%(i%2*2*n-n,"x"*min(i+1,n-i))for i in range(n)]

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

Công dụng xvà không gian.

Các hàng được tính như thế này:

"%-5s" % "x"      == "x    "
"%5s"  % "xx"     == "   xx"
"%-5s" % "xxx"    == "xxx  "
"%5s"  % "xx"     == "   xx"
"%-5s" % "x"      == "x    "

Sử dụng %*sspecifier để chọn giữa n-n.



6

MATL, 34 31 18 byte

:t!>tPY|!"@X@oQ&P!

Dùng thử trên MATL Online

Sử dụng 0 cho * và 1 cho #. Dựa trên câu trả lời của Lynn .


Câu trả lời cũ hơn, 31 byte:

2/tk:wXk:Ph"X@ot~XHh@Gy-hHQ&PY"

Dùng thử trên MATL Online

Sử dụng 1 cho * và 0 cho #.

         % implicit input, say 5
2/       % divide input number by 2 [2.5]
tk       % make a copy and floor that [2.5, 2]
:        % create range 1 to the floored value [2.5, [1, 2]]
wXk      % bring out the division result and this time ceil it
         %  [[1, 2], 3]
:        % create range 1 to that [[1, 2], [1, 2, 3]]
Ph       % flip the last array and concatenate horizontally 
         %  [[1, 2, 3, 2, 1]]
"        % loop through the array
  X@o    % Is the current loop index odd? 1 for odd, 0 for even
  t~     % duplicate and logical negate that
  XH     % copy that value to clipboard H
  h      % and concatenate the values ([1 0] on odd iterations, [0 1] on even) 
  @      % push current value from array (say 2, then stack is [[0 1], 2)
  G      % push input again
  y-     % subtract current array value from input [[0 1], 2, 3]
  h      % concatenate those two [[0 1], [2, 3]]
  H      % get the stored value from clipboard H (1 for even iterations, 0 for odd) 
  Q      % increment that
  &P     % flip the array in that dimension: in even iterations, this flips
         %   across columns and hence inverts the two values. [[0 1], [3, 2]]
         %   in odd iterations, it's a no-op
  Y"     % run-length decoding - repeat the element from first array the number of times
         %  specified in the second array
         % implicit loop end, implicit output

6

APL (Dyalog Classic) , 18 byte

a[↑⊢∘⌽\(⊂>⊢⌊⌽)⍳⎕]

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

đầu ra ABthay vì*#

đánh giá đầu vào n

⍳⎕ vectơ 0 1 ... n-1

⊢⌊⌽min ( ) giữa mình ( ) và đảo ngược ( ) - xem tàu

⊂>⊢⌊⌽trong đó vectơ là toàn bộ ( ) nhỏ hơn mỗi ⊢⌊⌽vectơ của nó - trả về một vectơ của vectơ boolean (0/1)

⊢∘⌽\ đảo ngược mọi vector khác

trộn vào một ma trận

⎕abảng chữ cái tiếng Anh viết hoa, 'AB...Z'

⎕a[ ]thay thế 0 1bằng'A' 'B'


Vì tò mò. Có bao nhiêu byte chỉ đơn giản là xuất ra ma trận 0 và 1 không có khoảng trắng? Tôi giả sử việc ⎕a[...}chuyển đổi chúng thành ABkhông có khoảng trắng ngắn hơn so với việc giữ chúng như 01không có khoảng trắng xem xét bạn đã sử dụng nó, nhưng chỉ tò mò liệu có nhiều sự khác biệt về byte nếu bạn giữ chúng như 01.
Kevin Cruijssen

1
@KevinCruijssen Theo như tôi có thể chơi gôn, nó sẽ có cùng độ dài - hoặc ⎕d[... ]hoặc ⊃¨⍕¨... Trong biểu thức sau ⍕¨là "định dạng mỗi" - nó biến mỗi số thành một vectơ lồng nhau , vì vậy trước tiên chúng ta cần " "( ⊃¨) Để chỉ lấy vô hướng char (và do đó không có khoảng trắng khi in).
ngn

5

Than , 21 byte

≔⮌…⁰NθEθ⭆θ›§⟦μλ⟧κ⌊⟦κι

Hãy thử trực tuyến! Sử dụng 01. Liên kết là phiên bản dài dòng của mã và bao gồm §*#bản dịch đầu ra cho *#trong câu hỏi. Giải trình:

    N                   Input number
  …⁰                    Range from 0
 ⮌                      Reversed
≔    θ                  Assign to `q`
      Eθ                Map over reversed range
        ⭆θ              Map over reversed range and join
           §⟦μλ⟧κ       Alternate between range and reversed range column
                 ⌊⟦κι   Minimum of range and reversed range row
          ›             Greater
                        Implicitly print each row on its own line

5

Thạch ,  12  15 byte

+3 sửa n=1lỗi trường hợp cạnh :(

R«Ṛ$‘r⁸ṬUÐe0YE?

Một chương trình đầy đủ chấp nhận một số nguyên trong đó in ra như đã định nghĩa trong OP sử dụng 01cho *#tương ứng.

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

Làm sao?

R«Ṛ$‘r⁸ṬUÐe0YE? - Main Link: integer, n
R               - range -> [1,2,3,4,...,n]
   $            - last two links as a monad:
  Ṛ             -   reverse -> [n,...,4,3,2,1]
 «              -   minimum (vectorises) -> [1,2,3,4,...,4,3,2,1]
    ‘           - increment (vectorises) -> [2,3,4,5,...,5,4,3,2]
      ⁸         - chain's left argument, n
     r          - inclusive range (vectorises) -> [[2,3,...,n],[3,4,...n],[4,5,...n],[5,...n],...,[5,...n],[4,5,...n],[3,4,...n],[2,3,...,n]]
       Ṭ        - untruth (vectorises) -> [[0,1,1,...,1],[0,0,1,1,...,1],[0,0,0,1,...,1],[0,0,0,0,1,...,1],...,[0,0,0,0,1,...,1],[0,0,0,1,...,1],[0,0,1,1,...,1],[0,1,1,...,1]]
         Ðe     - apply to entries with even indices:
        U       -   upend              -> [[0,1,1,...,1],[1,1,...,1],[0,0,0,1,...,1],[1,...,1,0,0,0,0],...]
              ? - if...
             E  - ...condition: all equal? (only true when n=1, where we have [1,1])
           0    - ...then: zero
            Y   - ...else: join with newline characters
                - implicit print

Có vẻ như đây chính xác là thuật toán của tôi, nhưng một cách thực hiện khác tạo ra 0 thay vì 1 và ngược lại.
Erik the Outgolfer 26/07/18

Có hiệu quả tương tự ... và tôi đã không cập nhật bài viết của mình để hiển thị bản sửa lỗi tôi đã thực hiện.
Jonathan Allan


4

Java 10, 145 byte

n->{var r=new char[n][n];for(int j=0,k;j<n;++j)for(k=0;k<n;)r[j][k]=k++<(j<n/2?j%2<1?j+1:n+~j:j%2>0?j:n-j)?j%2<1?'*':'#':j%2>0?'*':'#';return r;}

Tất cả các ternary làm cho nó một chút lộn xộn, nhưng nó hoạt động tốt. Tôi đã thử làm phẳng vòng lặp lồng nhau, và nhiều thứ khác, nhưng chúng chỉ làm tăng số byte. Hãy thử trực tuyến tại đây .

Ung dung:

n -> { // lambda taking an integer as output and returning a char[][]
    var r = new char[n][n]; // the output array; we make use of Java 10's var here (replace with char[][] for another 4 bytes to make this work in Java 8)
    for(int j = 0, k; j < n; ++j) // iterate over the lines
        for(k = 0; k < n; )       // iterate over the j'th line
            r[j][k] = // set the current character
                      k++ < // determine if we're in the first or second portion of the line:
                            (j < n/2 ? // for the first half of the output:
                                 j%2 < 1  // on even lines ...
                                 ? j + 1  // ... print the first symbol j+1 times ...
                                 : n + ~j // ... on odd lines, print it n-j-1 times.
                             : j%2 > 0 ?  // for the second half of the output, on odd lines ...
                                 j :      // ... print the first symbol j times ...
                                 n - j)   // ... on even lines, print it n-j times.
                      ? j%2 < 1 ? '*' : '#'  // for the first part of the line, use '*' on even lines, '#' otherwise
                      : j%2 > 0 ? '*' : '#'; // for the second part of the line, use '*' on odd lines, '#' otherwise
    return r; // return the completed array
}

Java 8 11, 179 127 byte

n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}

Dùng thử trực tuyến tại đây (TIO chưa có Java 11, do đó, phương thức này sử dụng một phương thức tùy chỉnh dẫn đến cùng số byte như String#repeat()).

Cảm ơn Kevin Cruijssen vì đã chơi golf với số lượng lớn 52 byte!

Ung dung:

n -> { // lambda taking an int argument and returning a String
    String r = "", // the output String
           a,      // temporary String containing the '*'s
           b;      // temporary String containing the '#'s
    for(int j = 0; j < n; // loop over the lines
        b = "#".repeat( // repeat the '#' character ...
            j < n/2 ? n + ~j // ... n-j-1 times in the first half of the output ...
            : j), // ... j times in the second half
        r += (j++ % 2 < 1 ? a + b : b + a) + "\n") // assemble the j'th line and append it to the output: on even lines, the '*'s go first; on odd lines, the '#'s go first
        a = "*".repeat( // repeat the '*' character ...
              j < n/2 ? j + 1 // ... j+1 times in the first half of the output ...
              : n - j); // n-j times in the second half
    return r; // return the completed output
}

3
Nếu bạn thay đổi để Java 11 bạn có thể chơi golf nó đến 127 byte bằng cách sử dụng "*".repeat(...)"#".repeat(...)(cũng như trở về một String thay vì in trực tiếp và chơi gôn n-j-1đến n+~j):n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}
Kevin Cruijssen

Cảm ơn, đó là một tiết kiệm tuyệt vời trong byte. Tôi đã quản lý để tạo một phiên bản 145 byte cho Java 10 bằng cách sử dụng các vòng lặp lồng nhau - không thể chờ phát hành Java 11, repeat()phương pháp đó thực sự tốt cho việc chơi golf.
OOBalance

4

Lua ,  148  133 byte

function(n)t,a,b={},".","#"for i=1,n do r=i<n/2+1 and i or-~n-i s=a:rep(r)..b:rep(n-r)t[i]=i%2<1 and s:reverse()or s end return t end

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

-15 byte nhờ @KevinCruijssen và @JoKing.

function(n)
   t = {}; a = "."; b = "#"          -- initialize variables, output is in table
                                     -- strings are needed in variables for
                                     --   the str:rep and str:reverse syntax

   for i = 1, n do                          -- build the rows of the table
      r = i<=(n+1)/2 and i or n-i+1         -- logic used to count up then down
      str = a:rep(r)..b:rep(n-r)            -- append correct number of '.'s, fill
                                            --   in the rest with '#'s
      t[i]=i%2==0 and str:reverse() or str  -- logic used to control reversing
   end
   return t                                 -- return table
end

2
Tôi không biết Lua quá rõ, nhưng có vẻ như bạn có thể tiết kiệm năm byte: (n+1)/2to -~n/2; or n-i+1để or-~n-i; i%2==0để i%2<1; và reverse() orđể reverse()or. Ngoài ra, cả phiên bản TIO và số đếm byte của bạn đều chứa dấu chấm phẩy mà dường như không cần thiết. Câu trả lời đầu tiên tốt đẹp, mặc dù. +1 từ tôi. Và chào mừng bạn đến với PPCG! :)
Kevin Cruijssen

2
Bạn thực sự không cần bất kỳ dấu chấm phẩy nào. 133 byte bao gồm các đề xuất của Kevin.
Jo King

@KevinCruijssen Cảm ơn! Tôi có thể hỏi những gì -~nđang làm trong đề xuất của bạn? Nó chắc chắn hoạt động, nhưng tôi không hiểu tại sao.
Azure Heights

1
@AzureHeights Chắc chắn. ~là một toán tử phủ định bitwise unary. Tuy nhiên, điều quan trọng đối với codegolfing là ~igiữ giá trị tương tự như -i-1. Do đó chúng ta có thể sử dụng -~ithay vì i+1~-ithay vì i-1. Điều này hữu ích trong hai trường hợp, mà tôi có thể vừa sử dụng trong câu trả lời của bạn: loại bỏ dấu ngoặc đơn, bởi vì -~có quyền ưu tiên của toán tử so với các phép toán khác, do đó (n+1)/2có thể được -~n/2. Và phần hữu ích khác là loại bỏ khoảng trống trong một số trường hợp, như tôi đã làm với or-~n-i.
Kevin Cruijssen

1
Dưới đây là hai lời khuyên có liên quan nếu bạn muốn đọc thêm một chút về nó: Sử dụng unary ~chox+1x-1 Sử dụng unary ~cho a-b-1a+b+1 . Tất cả các mẹo chung, cũng như các mẹo cụ thể về ngôn ngữ ( Mẹo chơi gôn ở Lua trong trường hợp này), có thể rất thú vị để đọc qua. :)
Kevin Cruijssen 27/07/18




3

C (gcc) , 118 108 byte

10x-1[1 ..n]= ={9,99,999,...} , sau đó có thể được nhân lên để có được mẫu phù hợp;printf()sau đó thực hiện đệm không cho biện minh đúng.

Thật đáng buồn, int chỉ có phạm vi đủ để thực hiện tối đa 9 chữ số (trên nền tảng 32 bit), vì vậy bạn cần phải đi đếnlong các mẫu lớn hơn; một ngôn ngữ mà số học MP thực sự có thể có thể sử dụng ngôn ngữ này cho một cái gì đó.

Cảm ơn trần nhà cho lời đề nghị.

h,j,k;p(h){h=h?10*p(--h):1;}f(i){for(j=0,h=i++;k=++j>i/2?i-j:j,j<i;printf("%0*d\n",h,~-p(k)*p(j%2*(h-k))));}

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


Bằng chứng về khái niệm này hoạt động với số học MP:

C # (trình biên dịch Mono C #) , 187 165 byte

(143 byte + 22 byte cho using System.Numerics;tiêu đề)

q=>{var r="";for(int j=0,h=q+1,k;j<q;r+=((BigInteger.Pow(10,k)-1)*BigInteger.Pow(10,j%2*(q-k))).ToString("D"+q)+"\n")k=++j>h/2?h-j:j;return r;}

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


1
Bằng chứng về khái niệm với các số nằm ngoài phạm vi số nguyên gốc tối đa (sử dụng C # và BigIntegers): Hãy thử trực tuyến!
ErikF

3

Vim, 99 tổ hợp phím

Luôn luôn thú vị để thử làm vim với các đối số đầu vào. Điều đó rất không tự nhiên, vì vậy nó sẽ không quá ngắn. Có lẽ có những cách tiếp cận tốt khác cho việc này.

Đầu vào được giả định là chính nó trong một bộ đệm. Các thanh ghi được coi là trống. Trình chỉnh sửa được coi là đủ cao để chứa kết quả mà không cần cuộn (về mặt kỹ thuật có thể tránh được bằng chi phí của một số tổ hợp phím).

"nD@ni<cr><esc>MmaGddM
<c-v>'aI*<esc>qwgvjokoI*<esc>@wq@w<esc>
:set ve=all<cr>@nlh<c-v>@nkr#
:%s/ /#/g<cr>o<esc>
2Gqqdt#$p2j0@qq@q

Giải trình

 | Buffer state (odd and even case):
 | 5                    6

"nD              read input into register n
@ni<cr><esc>     add n newlines
MmaGddM<c-v>'a   visual block select center row(s)
I*<esc>          prepend a column of *
qw               record macro w
  gvjoko         expand selection up and down
  I*<esc>
  @w             recurse
q
@w<esc>          run macro w and exit visual block select

 | Buffer state:
 | *                    *
 | **                   **
 | ***                  ***
 | **                   ***
 | *                    **
 |                      *

:set ve=all<cr>  move anywhere!
@nlh<c-v>@nkr#   add last column of #s

 | Buffer state:
 | *   #                *    #
 | **  #                **   #
 | *** #                ***  #
 | **  #                ***  #
 | *   #                **   #
 |                      *    #

:%s/ /#/g<cr>      replace spaces with #

 | Buffer state:
 | *####                *#####
 | **###                **####
 | ***##                ***###
 | **###                ***###
 | *####                **####
 |                      *#####

o<esc>2G           prep and jump to line 2
qqdt#$p2j0@qq@q    (effectively) flip every other onward

 | Buffer state:
 | *####                *#####
 | ###**                ####**
 | ***##                ***###
 | ###**                ###***
 | *####                **####
 |                      #####*

Và trong Base64, với các ký tự thực tế (đưa đầu vào inputvà gõ phím vào keysvà chạy bằng cách sử dụng vim -u NONE -s keys input)

Im5EQG5pDRtNbWFHZGRNFidhSSobcXdndmpva29JKhtAd3FAdxs6c2V0IHZlPWFsbA1AbmxoFkBua3IjOiVzLyAvIy9nDW8bMkdxcWR0IyRwMmowQHFxQHE=

2

R , 75 byte

function(n)outer(1:n,1:n,function(x,y,a=x<y|x>n-y+1)+ifelse(x%%2,a,rev(a)))

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

  • Lấy cảm hứng từ câu trả lời @Lynn
  • hàm nhận nlàm tham số và trả về một ma trận 0/1nơi 0tương ứng '*'1tương ứng với'#'

2

K (ngn / k) , 22 byte

{"*#"i|:/'i>/:i&|i:!x}

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

{ } chức năng với đối số x

!xdanh sách (0;1;...;x-1)

i: giao cho i

i&|icực tiểu ( &) của ivà ngược lại ( |)

i>/:so sánh với lớn hơn ( >) iso với từng phần tử từ danh sách bên phải ( /:) - trả về ma trận boolean (danh sách danh sách)

i|:/'với mỗi ( ') j in i, đảo ngược ( |:- chúng ta cần :buộc |phải là unary) phần tử tương ứng j lần ( n f/ xáp dụng f nlần trênx ). Hiệu quả, đảo ngược mọi hàng khác.

"*#" sử dụng các phần tử ma trận như các chỉ mục trong chuỗi "*#"

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.