Pascal'ın Örgüsünü Üret


32

Bu Pascal'ın Örgüsü:

 1 4  15  56   209   780    2911    10864     40545      151316      564719
1 3 11  41  153   571   2131    7953     29681     110771      413403      1542841
 1 4  15  56   209   780    2911    10864     40545      151316      564719

Bunu tamamen uydurdum. Blaise Pascal'ın söyleyebildiğim kadarıyla örgüsü yoktu ve yaptıysa muhtemelen sayılar yerine saçlardan yapılmıştı.

Bu şekilde tanımlanır:

  1. İlk sütun 1ortasında bir tane var.
  2. İkinci sütunun 1üstünde ve altında bir vardır.
  3. Şimdi bir sayıyı ortasına koymak veya bir sayının üstündeki ve iki kopyasının arasında geçiş yapıyoruz.
  4. Sayı yukarı veya aşağı gidiyorsa, iki bitişik sayının toplamı olacaktır (örn. 56 = 15 + 41). Başınızı biraz eğerseniz, bu Pascal üçgeninde bir adım gibidir.
  5. Sayı ortada olacaksa, üç bitişik sayının da toplamı olacaktır (örn. 41 = 15 + 11 + 15).

Göreviniz bu örgüyü (bir kısmını) yazdırmak olacaktır.

Giriş

Çıktılan nson sütunun dizinini veren, tek bir tam sayı alan bir program veya işlev yazmalısınız .

İlk sütunun (sadece 1orta çizgide bir tane basmak ) n = 0veya mi karşılık geleceğini seçebilirsiniz n = 1. Bu, tüm olası girdiler arasında tutarlı bir seçim olmalıdır.

Çıktı

Pascal's Braid'i nth sütununa kadar çık . Beyaz alanın yukarıdaki örnek mizanpajla tam olarak eşleşmesi gerekir, ancak daha kısa satırları boşluklarla daha uzun satırların uzunluğuna yayabilir ve isteğe bağlı olarak tek bir son satır satır beslemesi verebilirsiniz.

Başka bir deyişle, her sütun tam olarak o sütundaki sayı (veya eşit sayı çifti) kadar geniş olmalı, ardışık sütunlardaki sayılar üst üste gelmemeli ve sütunlar arasında boşluk olmamalıdır.

Sonucu STDOUT'a (veya en yakın alternatife) yazdırabilir veya bir işlev yazarsanız, aynı içeriğe sahip bir dize veya üç dizenin bir listesini (her satır için bir tane) döndürebilirsiniz.

Daha fazla ayrıntı

Sen varsayabiliriz nilk sütunun endeksi (şimdiye az daha az olmayacak 0ya 1da endeksleme bağlı olarak). Ayrıca, örgüdeki son sayının 256'dan küçük olduğunu veya hangisinin daha büyük olduğunu , dilinizin yerel tamsayı türüyle temsil edilebilecek en büyük sayı olduğunu varsayabilirsiniz . Yani yerli tamsayı türü sadece bayt saklayabilirsiniz, sen büyük varsayabiliriz nolduğu 9veya 10(tabanlı 1 Eğer 0- veya kullanmanıza bağlı n) ve 32 bitlik tamsayılar imzalı saklayabilir eğer nen fazla olacak 33ya 34.

Standart kuralları geçerlidir. En kısa kod kazanır.

OEIS

İşte birkaç ilgili OEIS bağlantısı. Elbette bunlar örgüdeki sayıları üretmek için farklı yollar için spoiler içerir:

Test Kılıfları

Bu test durumları 1 temelli indeksleme kullanır. Her test durumu dört satırdır; birincisi giriş, kalan üçü ise çıktıdır.

1

1

---
2
 1
1
 1
---
3
 1
1 3
 1
---
5
 1 4
1 3 11
 1 4
---
10
 1 4  15  56   209
1 3 11  41  153
 1 4  15  56   209
---
15
 1 4  15  56   209   780    2911
1 3 11  41  153   571   2131    7953
 1 4  15  56   209   780    2911
---
24
 1 4  15  56   209   780    2911    10864     40545      151316      564719       2107560
1 3 11  41  153   571   2131    7953     29681     110771      413403      1542841
 1 4  15  56   209   780    2911    10864     40545      151316      564719       2107560

Format bana biraz bukalemun gibi görünüyor.
Leaky Nun

3
@ LeakyNun Bu zorluğu kum havuzundayken denedim, ve yazdırmanın yarısı olarak örgüyü hesaplamak için yarısı kadar bayt harcadım. Bu, bir sanat-sanat mücadelesi için bana mükemmel bir denge gibi görünüyor .
FryAmTheEggman

4
@LeakyNun Ben hem sekans oluşumunun hem de ASCII sanatının mücadelenin önemli bileşenleri olduğunu umuyordum, çünkü çoğu dil muhtemelen bu ikisinden birinde daha iyi olacak, bu yüzden onları karıştırmanın ilginç olacağını düşündüm. Ayrıca, ayrı ayrı üst / alt ve orta üretmenin veya her şeyi oluşturup daha sonra ikiye ayırmayı daha iyi yapıp yapmamayacağının açık olmadığı ek bir bileşen sunar.
Martin Ender


Pascal'da henüz kimse bir çözüm yazmadı. Bu beni üzüyor.
dinynamitereed

Yanıtlar:


5

Jöle , 31 30 29 bayt

Q;S⁹o_
3ḶḂç@⁸СIµa"Ṿ€o⁶z⁶Zµ€Z

Bu monadik bir bağdır; 0 tabanlı bir sütun dizini argüman olarak kabul eder ve dizelerin listesini döndürür.

Çevrimiçi deneyin!

Nasıl çalışır

Q;S⁹o_                  Helper link.
                        Arguments: [k, 0, k] and [0, m, 0] (any order)

Q                       Unique; deduplicate the left argument.
 ;                      Concatenate the result with the right argument.
  S                     Take the sum of the resulting array.
   ⁹o                   Logical OR with the right argument; replaces zeroes in the
                        right argument with the sum.
     _                  Subtract; take the difference with the right argument to
                        remove its values.
                        This maps [k, 0, k], [0, m, 0] to [0, k + m, 0] and
                        [0, m, 0], [k, 0, k] to [m + 2k, 0, m + 2k].


3ḶḂç@⁸СIµa"Ṿ€o⁶z⁶Zµ€Z  Monadic link. Argument: A (array of column indices)

3Ḷ                      Yield [0, 1, 2].
  Ḃ                     Bit; yield [0, 1, 0].
        I               Increments of n; yield [].
      С                Apply...
   ç@                       the helper link with swapped arguments...
     ⁸                      n times, updating the left argument with the return
                            value, and the right argument with the previous value
                            of the left one. Collect all intermediate values of
                            the left argument in an array.
         µ         µ€   Map the chain in between over the intermediate values.
            Ṿ€          Uneval each; turn all integers into strings.
          a"            Vectorized logical AND; replace non-zero integers with
                        their string representation.
              o⁶        Logical OR with space; replace zeroes with spaces.
                z⁶      Zip with fill value space; transpose the resulting 2D
                        array after inserting spaces to make it rectangular.
                  Z     Zip; transpose the result to restore the original shape.
                     Z  Zip; transpose the resulting 3D array.

12

Pyth , 44 bayt

Sayı üretimi 20 bayt aldı ve biçimlendirme 24 bayt aldı.

jsMC+Led.e.<bkC,J<s.u+B+hNyeNeNQ,1 1Qm*;l`dJ

Çevrimiçi deneyin!

jsMC+Led.e.<bkC,J<s.u+B+hNyeNeNQ,1 1Qm*;l`dJ   input as Q
                   .u          Q,1 1           repeat Q times, starting with [1,1],
                                               collecting all intermediate results,
                                               current value as N:
                                               (this will generate
                                                more than enough terms)
                       +hNyeN                  temp <- N[0] + 2*N[-1]
                     +B      eN                temp <- [temp+N[-1], temp]

now, we would have generated [[1, 1], [3, 4], [11, 15], [41, 56], ...]

jsMC+Led.e.<bkC,J<s                 Qm*;l`dJ
                  s                            flatten
                 <                  Q          first Q items
                J                              store in J
                                     m    dJ   for each item in J:
                                         `     convert to string
                                        l      length
                                      *;       repeat " " that many times

jsMC+Led.e.<bkC,
              C,     transpose, yielding:
[[1, ' '], [1, ' '], [3, ' '], [4, ' '], [11, '  '], ...]
(each element with as many spaces as its length.)
        .e            for each sub-array (index as k, sub-array as b):
          .<bk            rotate b as many times as k

[[1, ' '], [' ', 1], [3, ' '], [' ', 4], [11, '  '], ...]

jsMC+Led
    +Led              add to each sub-array on the left, the end of each sub-array
   C                  transpose
 sM                   sum of each sub-array (reduced concatenation)
j                     join by new-lines

7
Bu şimdiye kadar gördüğüm en büyük Pyth programı.
imallett

7

Python 2, 120 bayt

a=1,1,3,4
n=input()
y=0
exec"y+=1;t='';x=0;%sprint t;"%(n*"a+=a[-2]*4-a[-4],;v=`a[x]`;t+=[v,len(v)*' '][x+y&1];x+=1;")*3

Ideone'da dene.


7

MATL , 38 bayt

1ti:"yy@oQ*+]vG:)!"@Vt~oX@o?w]&v]&hZ}y

Çevrimiçi deneyin!

Bir diziyi (benzersiz) sayılarla hesaplamak ilk 17 baytı alır. Biçimlendirme kalan 21 baytı alır.

açıklama

Bölüm 1: sayıları üret

Bu artan sırada, birinci ve ikinci sıraları arasındaki sayılarla bir dizi oluşturur: [1; 1; 3; 4; 11; 15; ...]. O ile başlar 1, 1. Her yeni sayı, önceki ikisinden yinelemeli olarak elde edilir. Bunlardan ikincisi, yineleme indeksiyle 1veya buna 2bağlı olarak çarpılır ve ardından yeni sayıyı üretmek için ilk olarak toplanır.

Yineleme sayısı girişe eşittir n. Bu, n+2sayıların üretildiği anlamına gelir . Oluşturulduktan sonra, dizinin kırpılması gerekir, böylece yalnızca ilk ngirişler korunur.

1t      % Push 1 twice
i:      % Take input n. Generage array [1 2 ... n]
"       % For each
  yy    %   Duplicate the two most recent numbers
  @o    %   Parity of the iteration index (0 or 1)
  Q     %   Add 1: gives 1 for even iteration index, 2 for odd
  *+    %   Multiply this 1 or 2 by the most recent number in the sequence, and add
       %    to the second most recent. This produces a new number in the sequence
]       % End for each
v       % Concatenate all numbers in a vertical array
G:)     % Keep only the first n entries

Bölüm 2: çıktıyı biçimlendirmek

Elde edilen dizideki her sayı için, bu iki dize oluşturur: sayının dizgi gösterimi ve tekrarlanan 0 karakterinden oluşan aynı uzunlukta bir dize (karakter 0, MATL'de boşluk olarak görüntülenir). Yinelemeler için bile, bu iki dizi değiştirilir.

İki dize daha sonra dikey olarak birleştirilir. Böylece n2D karakter dizileri şu şekilde üretilir ( ·0 karakterini temsil etmek için kullanılır ):

·
1

1
·

· 
3

4
·

·· 
11

15
··

Bu diziler daha sonra üretmek için yatay olarak birleştirilir.

·1·4··15
1·3·11··

Son olarak, bu 2D karakter dizisi iki satıra bölünmüştür ve ilki yığının üstüne kopyalanır. Üç karakter dizisi, her biri farklı bir satırda istenen çıktıyı veren sırayla görüntülenir

!       % Transpose into a horizontal array [1 1 3 4 11 15 ...]
"       % For each
  @V    %   Push current number and convert to string
  t~o   %   Duplicate, negate, convert to double: string of the same length consisting 
        %   of character 0 repeated
  X@o   %   Parity of the iteration index (1 or 0)
  ?     %   If index is odd
    w   %     Swap
  ]     %   End if
  &v    %   Concatenate the two strings vertically. Gives a 2D char array representing
        %   a "numeric column" of the output (actually several columns of characters)
]       % End for
&h      % Concatenate all 2D char arrays horizontally. Gives a 2D char array with the
        % top two rows of the output
Z}      % Split this array into its two rows
y       % Push a copy of the first row. Implicitly display

6

Haskell, 101 bayt

a=1:1:t
t=3:4:zipWith((-).(4*))t a
g(i,x)=min(cycle" 9"!!i)<$>show x
f n=[zip[y..y+n]a>>=g|y<-[0..2]]

Bir fonksiyon tanımlar f :: Int → [String].

  • Michael Klein bana unlines7 byte tasarruf yaparak sonucu çağırmama gerek olmadığını hatırlattı . Teşekkürler!

  • Ben değiştirerek byte kurtardı " 9"!!mod i 2ile cycle" 9"!!i.

  • Kullanmak yerine iki anlamlı liste yazarak üç bayt daha drop .

  • Kız arkadaşım 0yerine cevaplarımı başlatarak iki bayt daha tasarruf edebileceğime dikkat çekti 1.


3

C, 183 177 176 bayt

#define F for(i=0;i<c;i++)
int i,c,a[35],t[9];p(r){F printf("%*s",sprintf(t,"%d",a[i]),r-i&1?t:" ");putchar(10);}b(n){c=n;F a[i]=i<2?1:a[i-2]+a[i-1]*(i&1?1:2);p(0);p(1);p(0);}

açıklama

C hiçbir zaman daha yüksek seviyeli bir dile karşı kısalık ödülü kazanamayacak, ancak alıştırma ilginç ve iyi bir uygulama.

Makro F, okunabilirlik pahasına altı byte tıraş eder. Çoklu bildirimlerden kaçınmak için değişkenler küresel olarak ilan edilir. Sprintf için bir karakter tamponuna ihtiyacım vardı, ancak K&R tip kontrolü ile gevşek olduğu için sprintf ve printf t [9] 'yu 36 baytlık bir tamponun göstergesi olarak yorumlayabilir. Bu ayrı bir bildirimde bulunur.

#define F for(i=0;i<c;i++)
int i,c,a[35],t[9];

Oldukça baskı işlevi, burada r satır numarasıdır. Sprintf, sayıyı biçimlendirir ve sütun genişliğini hesaplar. Yer kazanmak için sadece üç kere çağırıyoruz, her çıktı satırı için bir tane; ri & 1 ifadesi yazdırılanları filtreler.

p(r) {
    F
        printf("%*s", sprintf(t, "%d", a[i]), r-i&1 ? t
                                                    : " ");
    putchar(10);
}

Giriş noktası işlevi, argüman sütun sayısıdır. A [] sütun değerlerinin a dizilimini hesaplar, ardından her çıktı satırı için bir kez p yazdırma işlevini çağırır.

b(n) {
    c=n;
    F
        a[i] = i<2 ? 1
                   : a[i-2] + a[i-1]*(i&1 ? 1
                                          : 2);
    p(0);
    p(1);
    p(0);
}

Örnek çağırma (cevap ve bayt sayısına dahil edilmez):

main(c,v) char**v;
{
    b(atoi(v[1]));
}

Güncellenmiş

Satır içi sprintf önerisi tomsmeding dahil edildi. Bu sayı 183'den 177 karaktere düşürüldü. Bu aynı zamanda printf (sprintf ()) bloğunun etrafındaki parantezleri kaldırmaya olanak tanır çünkü şimdi sadece bir ifadedir, ancak sadece bir karakter kaydetmiştir, çünkü hala bir sınırlayıcı olarak boşluğa ihtiyaç duymaktadır. Yani 176'a.


wNerede kullanıldığı tanımını satır içi yapamaz mısın ? Sadece bir kere kullanıyor gibisin.
16'da

itoaSprintf yerine kullanamazsın ?
Giacomo Garabello

Itoa olarak kabul ettim, ancak sistemimde mevcut değil ve alan genişliğini ayarlamak için sprintf dönüş değerini kullanıyorum.
maharvey67

2

PowerShell v2 +, 133 bayt

param($n)$a=1,1;1..$n|%{$a+=$a[$_-1]+$a[$_]*($_%2+1)};$a[0..$n]|%{$z=" "*$l+$_;if($i++%2){$x+=$z}else{$y+=$z}$l="$_".Length};$x;$y;$x

Değerleri hesaplamak için 44 bayt, ASCII formüle etmek için 70 bayt

Girdiyi $nsıfır dizinli sütun olarak alır. Dizi dizimizin başlangıcını ayarlar $a=1,1. İçin Sonra döngü kadar $nolan 1..$n|%{...}bir dizi oluşturmak için. Her yineleme, (iki eleman önce) + (önceki eleman) * 'ın toplamı üzerinde birleşiriz (tuhaf ya da çift indeks iseniz). Bu üretecektir $a=1,1,3,4,11...kadar$n+2 .

Bu nedenle, $ayalnızca ilk 0..$nelemanları almak için dilimlememiz ve bunları başka bir döngüden geçirmemiz gerekir |%{...}. Her yinelemede, yardımcı $zbir dizi boşluğa artı geçerli öğeye bir dize olarak eşittir. Daha sonra, bunun $x(üst ve alt sıralar) veya $y(orta sıraya) basit bir tek if/ çift ​​ile birleştirilip birleştirilmeyeceğini ayırıyoruz else. Sonra, için boşluk sayısını hesapladık.$l geçerli sayıyı alarak, onu dizileyerek ve alarak.Length .

Son olarak, biz koymak $x, $yve $xyine boru hattı üzerinde ve çıkış örtülü olduğunu. .ToString()STDOUT'a yazdırırken bir dizi için varsayılan ayırıcı yeni bir satır olduğundan, bunu ücretsiz olarak alıyoruz.

Örnek

PS C:\Tools\Scripts\golfing> .\pascal-braid.ps1 27
 1 4  15  56   209   780    2911    10864     40545      151316      564719       2107560       7865521        29354524
1 3 11  41  153   571   2131    7953     29681     110771      413403      1542841       5757961       21489003
 1 4  15  56   209   780    2911    10864     40545      151316      564719       2107560       7865521        29354524

0

PHP 265 bayt

<?php $i=$argv[1];$i=$i?$i:1;$a=[[],[]];$s=['',''];$p='';for($j=0;$j<$i;$j++){$y=($j+1)%2;$x=floor($j/2);$v=$x?$y?2*$a[0][$x-1]+$a[1][$x-1]:$a[0][$x-1]+$a[1][$x]:1;$s[$y].=$p.$v;$a[$y][$x]=$v;$p=str_pad('',strlen($v),' ');}printf("%s\n%s\n%s\n",$s[0],$s[1],$s[0]);

Un-golfed:

$a = [[],[]];
$s = ['',''];

$p = '';

$i=$argv[1];
$i=$i?$i:1;
for($j=0; $j<$i; $j++) {
    $y = ($j+1) % 2;
    $x = floor($j/2);

    if( $x == 0 ) {
        $v = 1;
    } else {
        if( $y ) {
            $v = 2 * $a[0][$x-1] + $a[1][$x-1];
        } else {
            $v = $a[0][$x-1] + $a[1][$x];
        }
    }
    $s[$y] .= $p . $v;
    $a[$y][$x] = $v;
    $p = str_pad('', strlen($v), ' ');
}

printf("%s\n%s\n%s\n", $s[0], $s[1], $s[0]);

Python 278 bayt

import sys,math;a=[[],[]];s=['',''];p='';i=int(sys.argv[1]);i=1 if i<1 else i;j=0
while j<i:y=(j+1)%2;x=int(math.floor(j/2));v=(2*a[0][x-1]+a[1][x-1] if y else a[0][x-1]+a[1][x]) if x else 1;s[y]+=p+str(v);a[y].append(v);p=' '*len(str(v));j+=1
print ("%s\n"*3)%(s[0],s[1],s[0])


0

Matlab, 223 karakter, 226 bayt

function[]=p(n)
r=[1;1];e={(' 1 ')',('1 1')'}
for i=3:n;r(i)=sum((mod(i,2)+1)*r(i-1)+r(i-2));s=num2str(r(i));b=blanks(floor(log10(r(i)))+1);if mod(i,2);e{i}=[b;s;b];else e{i}=[s;b;s];end;end
reshape(sprintf('%s',e{:}),3,[])

Ungolfed ve yorumladı:

function[]=p(n) 
r=[1;1];                                    % start with first two 
e={(' 1 ')',('1 1')'}                       % initialize string output as columns of blank, 1, blank and 1, blank, 1.
for i=3:n;                                  % for n=3 and up! 
    r(i)=sum((mod(i,2)+1)*r(i-1)+r(i-2));   % get the next number by 1 if even, 2 if odd times previous plus two steps back
    s=num2str(r(i));                        % define that number as a string
    b=blanks(floor(log10(r(i)))+1);         % get a number of space characters for that number of digits
    if mod(i,2);                            % for odds
        e{i}=[b;s;b];                       % spaces, number, spaces
    else                                    % for evens
        e{i}=[s;b;s];                       % number, spaces, number
    end;
end
reshape(sprintf('%s',e{:}),3,[])            % print the cell array of strings and reshape it so it's 3 lines high

0

PHP, 135 124 123 120 bayt

<?while($i<$argv[1]){${s.$x=!$x}.=${v.$x}=$a=$i++<2?:$v1+$v+$x*$v;${s.!$x}.=str_repeat(' ',strlen($a));}echo"$s
$s1
$s";

Örtük typecast'lerden ve değişken değişkenlerden yararlanarak
kodun üçte biri (37 byte) boşluklara, 64 byte çıkış için tamamen kullanılır.

Yıkmak

$i=0; $x=false; $v=$v1=1; $s=$s1='';    // unnecessary variable initializations
for($i=0;$i<$argv[1];$i++)  // $i is column number -1
{
    $x=!$x; // $x = current row: true (1) for inner, false (empty string or 0) for outer
    // calculate value
    $a=
        $i<2?               // first or second column: value 1
        :$v1+(1+$x)*$v      // inner-val + (inner row: 1+1=2, outer row: 1+0=1)*outer-val
    ;
    ${s.$x}.=${v.$x}=$a;    // replace target value, append to current row
    ${s.!$x}.=str_repeat(' ',strlen($a));    // append spaces to other row
}
// output
echo "$s\n$s1\n$s";

0

Toplu iş, 250 bayt

@echo off
set s=
set d=
set/ai=n=0,j=m=1
:l
set/ai+=1,j^^=3,l=m+n*j,m=n,n=l
set t=%s%%l%
for /l %%j in (0,1,9)do call set l=%%l:%%j= %%
set s=%d%%l%
set d=%t%
if not %i%==%1 goto l
if %j%==1 echo %d%
echo %s%
echo %d%
if %j%==2 echo %s%

İlk ve üçüncü satırlar aynı olduğundan, sadece iki karakter dizisi oluşturmamız gerekir. Burada d, son girdiyle sbiten dizgeyi ve boşluklarla biten dizgeyi temsil eder; Son dört satır uygun sırayla yazdırılmasını sağlar. isadece döngü sayacı (sayımdan biraz daha ucuzdur %1). jBir sonraki sayıyı almak için geçerli sayıya eklemeden önce önceki sayıyı iki katına çıkarma arasındaki geçiştir. mve nbu sayıları içerir. lbir sonraki sayıyı hesaplamak için geçici olarak kullanılmasının yanı sıra, hanelerini doldurmak için boşluklarla değiştirdi s; sve dher seferinde ara değişken vasıtasıyla değiştirilir t.

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.