Alternatif Desen


16

Şimdi silinmiş bir stackoverflow sorusunda, birisi aşağıdakileri gönderdi:

Belirli bir tamsayıya dayalı *ve buna #göre değişen desenler yazdırmak için bir program veya işlev yazın n. Bazı örnekler:

Giriş: n=1
Çıkış:

*

Giriş n=5
Çıkışı:

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

Giriş: n=8
Çıkış:

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

Oldukça havalı bir kod golf mücadelesi gibi göründüğünden, işte burada.

Bu kalıplar nasıl oluşturulur?

İlk satır bir tek ile başlar ve *bunu takip eden n-1miktar izler #.
İkinci satır daha sonra satır aralığı miktarıyla *birlikte iki satır içerir . Üçüncü satır üç ile başlar , onu takip eden miktar takip eder . vb.n-2#
*n-3#

Ortaya ( n/2) ulaştığımızda, *yukarıdaki örneklerde görülebilen miktar ile tekrar geri sayıyoruz .

Tek giriş sayıları için tersine çevrilmiş satır çiftinin (birinci ve son; ikinci ve sondan sonraki vb.) Tamamen aynı olduğunu unutmayın. Örnekte n=5ilk ve son satırlar *####; ikinci ve son satırlar ###**.
Eşit giriş numaraları için ise tersine çevrilmiş satır çifti ters çevrilir. Örnekte n=8ilk ve son satırlar *#######ve #######*; ikinci ve son satırların yanında ######**ve **######; vb.

Zorluk kuralları:

  • Herhangi iki farklı kullanabilirsiniz yazdırılabilir yerine karakterleri *ve #. Sen kullanabilirsiniz Ave B; 3ve 7; <ve >; Lütfen cevaplarınızı ne kullandığınızı belirtiniz.
  • nOlumlu bir tamsayı olacağını varsayabilirsiniz ( >= 1)
  • STDOUT'a yazdırmak yerine, her satır için bir karakter dizisi veya dizi dizisi veya 2B karakter matrisi çıkışına izin verilir.

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için olabildiğince kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, cevabınız için bir açıklama eklemeniz önemle tavsiye edilir.

Test senaryoları (ilk n=1aşamadan itibaren n=10)

*

*#
#*

*##
#**
*##

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

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

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

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

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

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

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

" * Ve # yerine iki farklı karakter kullanabilirsiniz. " - Yazdırılabilir olmaları gerekiyor mu? NUL ve SOH (0 ve 1 ASCII kodları) kullanabilir miyiz?
ngn

@ngn Üzgünüm, yalnızca yazdırılabilir karakterler. Meydan okuma açıklamasında açıklığa kavuşacaktır.
Kevin Cruijssen

Yanıtlar:


14

Jöle , 9 bayt

>þµoṚUÐeY

Çevrimiçi deneyin!

açıklama

>þ           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 bayt

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

Çevrimiçi deneyin!

Kullanım alanları xve alan.

Satırlar şu şekilde hesaplanır:

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

Ve %*sarasında seçim yapmak için belirleyiciyi kullanma .n-n



6

MATL, 34 31 18 bayt

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

MATL Online'da deneyin

* İçin 0 ve # için 1 kullanır. Lynn'in Jelly cevabına dayanarak .


Eski yanıt, 31 bayt:

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

MATL Online'da deneyin

* İçin 1, # için 0 kullanır.

         % 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 Klasik) , 18 bayt

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

Çevrimiçi deneyin!

AByerine çıktılar*#

değerlendirilmiş girdi n

⍳⎕ vektör 0 1 ... n-1

⊢⌊⌽kendi aralarında ( ) ve tersi ( ) arasında min ( ) - trenlere bakın

⊂>⊢⌊⌽nerede bir bütün (Vektör ) daha az onun her birinden daha ⊢⌊⌽boolean bir vektör dönüş (0/1) vektörleri -

⊢∘⌽\ diğer her vektör ters

bir matrise karıştır

⎕abüyük İngilizce alfabe, 'AB...Z'

⎕a[ ]yerine 0 1sahip'A' 'B'


Meraktan. Boşluk olmadan 0 ve 1'lerin matrisini çıkarmak için kaç bayt olur? ⎕a[...}Bunları boşluklara Ave Bboşluklar olmadan dönüştürmenin, bunları kullandığınızı düşünerek boşluklar olarak 0ve 1boşluk olmadan tutmaktan daha kısa olduğunu varsayıyorum , ancak onları 0ve olarak tutarsanız baytlarda çok fazla fark olup olmadığını merak ediyorum 1.
Kevin Cruijssen

1
@KevinCruijssen Golf yapabildiğim kadarıyla, aynı uzunlukta olurdu - ya ⎕d[... ]ya da ⊃¨⍕¨... İkinci ifadede ⍕¨"her birini biçimlendir" - her sayıyı iç içe bir char vektörüne dönüştürür , bu yüzden her birine "ihtiyacımız var" "( ⊃¨) yalnızca char skaleri elde etmek için (ve bu nedenle yazdırma sırasında boşluk olmaması).
ngn

5

Kömür , 21 bayt

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

Çevrimiçi deneyin! Kullanır 0ve 1. Bağlantı kodunun ayrıntılı sürümüne olup içerir §*#çıktı çevirir hangi *ve #söz konusu. Açıklama:

    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

Jöle ,  12  15 bayt

+3 sabit n=1kenar hatası :(

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

Kullanılarak OP tanımlanan çıktıyı baskı arasında bir tamsayıyı kabul tam bir program 0ve 1için *ve #sırasıyla.

Çevrimiçi deneyin!

Nasıl?

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

Bu tam olarak benim algoritmam gibi görünüyor, ama 1s yerine 0s çıktı ve tersi farklı bir uygulama.
Outgolfer Erik

Evet etkili bir şekilde aynı şey ... ve yaptığım düzeltmeyi göstermek için yazımı güncellememiştim.
Jonathan Allan


4

Java 10, 145 bayt

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üm üçlü onu biraz dağınık yapar, ancak iyi çalışır. Yuvalanmış döngüyü ve diğer çeşitli şeyleri düzleştirmeye çalıştım, ancak sadece bayt sayısını arttırdılar. Burada çevrimiçi deneyin .

Ungolfed:

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, 179127 bayt

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

Burada çevrimiçi olarak deneyin (TIO'nun henüz Java 11'i yok, bu nedenle aynı bayt sayısıyla sonuçlanan özel bir yöntem kullanıyor String#repeat()).

52 baytlık golf için Kevin Cruijssen'e teşekkürler !

Ungolfed:

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
Kullanarak 127 bayt Java 11'e değiştirirseniz yapabilirsiniz golf onu "*".repeat(...)ve "#".repeat(...)(hem de Dize dönen yerine doğrudan baskı ve golf n-j-1için 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

Teşekkürler, bu baytlarda büyük bir tasarruf. Yuvalanmış döngüler kullanarak Java 10 için 145 baytlık bir sürüm oluşturmayı başardım - Java 11'in yayınlanmasını bekleyemiyorum, bu repeat()yöntem golf için gerçekten güzel.
OOBalance

4

Lua ,  148133  Bayt

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

Çevrimiçi deneyin!

@KevinCruijssen ve @JoKing sayesinde -15 bayt.

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
Lua'yı çok iyi tanımıyorum, ancak beş bayt tasarruf edebileceğiniz görülüyor: (n+1)/2to -~n/2; or n-i+1için or-~n-i; i%2==0için i%2<1; ve reverse() oriçin reverse()or. Ayrıca, TIO sürümünüz ve bayt sayımınızın her ikisi de gerekli görünmeyen bir noktalı virgül içerir. Yine de güzel ilk cevap. Benden +1. Ve PPCG'ye hoş geldiniz! :)
Kevin Cruijssen

2
Aslında gerek yok herhangi yarı kolonların. Kevin'in önerileri de dahil olmak üzere 133 bayt .
Jo King

@KevinCruijssen Teşekkürler! -~nÖnerilerinizde bunun ne yaptığını sorabilir miyim ? Kesinlikle işe yarıyor, ama nedenini anlamıyorum.
Azure Heights

1
@AzureHeights Tabii. ~tek yönlü bitsel bir olumsuzlama operatörüdür. Bununla birlikte, codegolfing için önemli olan, ~ideğeriyle aynı olmasıdır -i-1. Bu nedenle, -~iyerine i+1ve ~-iyerine kullanabiliriz i-1. Parantez kurtulmak, çünkü: Bu benim hem cevap faydalanabilirler iki durumda, yararlıdır -ve ~bu yüzden, diğer matematiksel işlemleri üzerinde operatör önceliğe sahiptir (n+1)/2bu nedenle olabilir -~n/2. Ve diğer yararlı kısım, bazı durumlarda olduğu gibi, boşluklardan kurtulmaktır or-~n-i.
Kevin Cruijssen

1
: Bu konuda daha biraz okumak istiyorsanız İşte iki alakalı ipuçları Kullanım tekli ~için x+1vex-1 ve tekli Kullanım ~için a-b-1vea+b+1 . Tüm genel ipuçları ve dile özgü ipuçları ( bu durumda Lua'da golf için ipuçları ) okumak ilginç olabilir. :)
Kevin Cruijssen




3

C (gcc) , 118 bayt

Bu kazanmayacak, ama farklı bir yaklaşım (ya da en azından öyle düşünüyorum!) Dize manipülasyonları yapmak yerine, 10x-1 bitmiş [1 ..n]={9,99,999,...}daha sonra uygun şablonu elde etmek için çoğaltılabilir; printf()sonra sağa yaslama için sıfır dolgusu yapar.

Ne yazık ki, intsadece 9 basamağa (32 bit platformlarda) kadar yeterli aralık vardır, bu nedenle longdaha büyük desenler için gitmeniz gerekir ; yerel olarak MP aritmetiği yapan bir dil bunu bir şey için kullanabilir.

Öneri için ceilingcat'e teşekkürler.

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

Çevrimiçi deneyin!


Bunun MP aritmetiği ile çalıştığı kavramının kanıtı:

C # (Mono C # derleyici) , 187166 bayt

(Başlıktaki 143 bayt + 22 bayt using System.Numerics;)

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

Çevrimiçi deneyin!


1
Maksimum yerel tamsayı aralıkları dışındaki sayılarla kavram kanıtı (C # ve BigIntegers kullanarak): Çevrimiçi deneyin!
ErikF

3

Vim, 99 tuş vuruşu

Giriş argümanlarıyla vim yapmaya çalışmak her zaman ilginçtir. Bu çok doğal değil, bu yüzden şaşırtıcı derecede kısa olmayacak. Muhtemelen buna başka iyi yaklaşımlar da vardır.

Girdinin kendi başına bir tampon içinde olduğu varsayılır. Kayıtların boş olduğu varsayılır. Düzenleyicinin, sonucu kaydırma yapmadan içerecek kadar uzun olduğu varsayılır (bu, bazı tuş vuruşları pahasına teknik olarak önlenebilir).

"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

açıklama

 | 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:
 | *####                *#####
 | ###**                ####**
 | ***##                ***###
 | ###**                ###***
 | *####                **####
 |                      #####*

Ve base64'te, gerçek karakterlerle (girişi inputve tuş vuruşlarını girin keysve kullanarak çalıştırın vim -u NONE -s keys input)

Im5EQG5pDRtNbWFHZGRNFidhSSobcXdndmpva29JKhtAd3FAdxs6c2V0IHZlPWFsbA1AbmxoFkBua3IjOiVzLyAvIy9nDW8bMkdxcWR0IyRwMmowQHFxQHE=

2

R , 75 bayt

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

Çevrimiçi deneyin!

  • @Lynn yanıtından esinlenildi
  • işlev alma nparametre olarak ve bir matris geri 0/1burada 0tekabül etmek '*'ve 1karşılık geldiği'#'

2

K (ngn / k) , 22 bayt

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

Çevrimiçi deneyin!

{ } argüman ile işlev x

!xliste (0;1;...;x-1)

i: atamak i

i&|iminima ( &) ive tersi ( |)

i>/:büyüktür ( >) ile karşılaştırisağdaki listeden ( /:) listeden her öğeye bir boole matrisi döndürür (listelerin listesi))

i|:/'Her bir (için 'de) j i, ters ( |:- ihtiyacımız :zorlamak için |tekabül eden eleman j kez (tekli olmak üzere) n f/ xuygulanır f nzamanlarıx ). Etkili bir şekilde, diğer her satırı tersine çevirin.

"*#" dizede matris öğelerini dizin olarak kullanma "*#"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.