Rakam Üçgenleri


26

Meydan okuma:

Giriş: n pozitif bir tamsayın

Çıktı:

[1,n] aralığında bir liste oluşturun ve onu bir dizeye birleştirin (yani, n=13 dize olur 12345678910111213).

Şimdi bu dizgenin öneklerini veya soneklerini kullanarak, giriş tamsayısına göre aşağıdaki dört yönden birinde bir üçgen çıkarıyoruz:

  • Eğer n0(şık4) , bunu shape üçgen şeklinde çıkar.
  • Eğer n1(şık4) , shape üçgen şeklinde çıkar
  • Eğer n2(şık4) , üçgen şeklinde çıkış olarak ◥
  • Eğer n3(şık4) , shape üçgen şeklinde çıkar

Örnek:

Giriş: n=13

Çünkü 131(şık4) , şekil ◤ olacaktır. İşte üç olası geçerli çıktı:

12345678910111213    11111111111111111    12345678910111213
1234567891011121     2222222222222222     2345678910111213
123456789101112      333333333333333      345678910111213
12345678910111       44444444444444       45678910111213
1234567891011        5555555555555        5678910111213
123456789101         666666666666         678910111213
12345678910          77777777777          78910111213
1234567891           8888888888           8910111213
123456789            999999999            910111213
12345678             11111111             10111213
1234567              0000000              0111213
123456               111111               111213
12345                11111                11213
1234                 1111                 1213
123                  222                  213
12                   11                   13
1                    3                    3

Meydan okuma kuralları:

  • Yukarıdaki üç geçerli çıktıda görebileceğiniz gibi, yalnızca doğru şekil ve tüm basamakları doğru sırayla kullanmak önemlidir. Bunun dışında önek veya sonek kullanmakta özgürsünüz; geri / yansıtır; çapraz baskı; vb. Her bir şekil için olası altı çıktıdan herhangi birine izin verilir ( şekle dayalı tüm geçerli çıktıları görmek için aşağıdaki test durumuna bakın ). Bu, döndürme yapılarına sahip dillerin onu kullanmasına izin verir, ancak dili olmayanlar, ön ekleri doğru boyutta yukarıdan aşağıya doğru kullanma ya da iki şekil için ön ekleri kullanma, ancak diğer iki şekil için son ekleri kullanma seçeneğine de sahip olabilir. . Diliniz için en uygun çıktı seçeneklerini seçmek golf sürecinin bir parçasıdır. :)
  • Giriş pozitif bir tamsayıdır. İçin biz sadece çıkış .n=11
  • Ekranda bir yere doğru üçgeni (dikey veya yatay sınırlayıcılar olmadan!) Yazdırdığı sürece, her türlü satır başı / son satırları / boşlukları kullanılabilir.

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Standart G / Ç kurallarına cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT işlevlerini, uygun parametreleri içeren fonksiyonlar / yöntemleri ve dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuzu test eden bir bağlantı ekleyin (ör. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemek şiddetle tavsiye edilir.

Test durumları:

Giriş: Mümkün olan tüm geçerli çıkışlar:n=5

12345    54321    12345    54321    11111    55555
1234     5432     2345     4321     2222     4444
123      543      345      321      333      333
12       54       45       21       44       22
1        5        5        1        5        1

Giriş: Tüm olası çıkışlar:n=6

123456    654321    123456    654321    111111    666666
 12345     65432     23456     54321     22222     55555
  1234      6543      3456      4321      3333      4444
   123       654       456       321       444       333
    12        65        56        21        55        22
     1         6         6         1         6         1

Giriş: Tüm olası çıkışlar:n=7

      1          1          7          7          7          1
     12         21         67         76         66         22
    123        321        567        765        555        333
   1234       4321       4567       7654       4444       4444
  12345      54321      34567      76543      33333      55555
 123456     654321     234567     765432     222222     666666
1234567    7654321    1234567    7654321    1111111    7777777

Giriş: Tüm olası çıkışlar:n=8

1           1           8           8           8           1
12          21          78          87          77          22
123         321         678         876         666         333
1234        4321        5678        8765        5555        4444
12345       54321       45678       87654       44444       55555
123456      654321      345678      876543      333333      666666
1234567     7654321     2345678     8765432     2222222     7777777
12345678    87654321    12345678    87654321    11111111    88888888

Giriş: Sadece mümkün çıkış:n=1

1

Giriş: Tüm olası çıkışlar:n=2

12    21    12    21    11    22
 1     2     2     1     2     1

Farklı üçgenler için diğer değerleri kullanabilir miyiz, for için 1 gibi, vb.
Cehalet Daveti

@EmbodimentofIgnorance Talihsiz bir örnek, çünkü şartname ne diyor. Tutarlı kaldığımız sürece dört düzenlemenin sırasını değiştirip değiştiremeyeceğimizi sormak istediğinizi düşünüyorum (bunun bir hayır olacağını düşünüyorum).
Outgolfer Erik,

1
Eğer n==13, en üstteki satır olabilir '33333333333333333'(buna eşdeğer olarak ya '31211101987654321')?
Chas Brown

@EmodimentofInogrance Üzgünüm, ama bu durumda hayır derdim. Şekiller ve bunlara karşılık mod 4gelenler, bu zorluk için katı çiftlerdir. Yani dört mod 4durum için dört şekli değiştiremezsiniz . Ama yine de iyi bir soru.
Kevin Cruijssen

@ChasBrown Evet, ikisi de iyi. için sadece üç olası örnek verdim , ancak altı seçeneğin tümü ( test durumu gibi) geçerli çıktılar. n = 5n=13n=5
Kevin Cruijssen

Yanıtlar:


9

JavaScript (ES6),  93  89 bayt

Bir karakter matrisi döndürür.

n=>[...(g=n=>n?g(n-1)+n:'')(n)].map((d,y,a)=>a.map(_=>y-(n&2)*y--<0?' ':d)).sort(_=>-n%2)

Çevrimiçi deneyin!

Alternatif desen (aynı boyutta):

n=>[...(g=n=>n?g(n-1)+n:'')(n)].map((_,y,a)=>a.map(d=>y-(n&2)*y--<0?' ':d)).sort(_=>-n%2)

Çevrimiçi deneyin!

Yorumlananlar

n =>                 // n = input
  [...               // split the result of ...
    ( g = n =>       //   ... a call to the recursive function g, taking n
      n ?            //     if n is not equal to 0:
        g(n - 1)     //       append the result of a recursive call with n - 1
        + n          //       append n
      :              //     else:
        ''           //       stop recursion and return an empty string
    )(n)             //   initial call to g
  ].map((d, y, a) => // for each digit d at position y in this array a[]:
    a.map(_ =>       //   for each character in a[]:
      y -            //     we test either y < 0 if (n AND 2) is not set
      (n & 2)        //     or -y < 0 (i.e. y > 0) if (n AND 2) is set
      * y-- < 0      //     and we decrement y afterwards
      ?              //     if the above condition is met:
        ' '          //       append a space
      :              //     else:
        d            //       append d
    )                //   end of inner map()
  )                  // end of outer map()
  .sort(_ => -n % 2) // reverse the rows if n is odd

Şekil özeti

mapsortnşık4

 n mod 4  | 0     | 1     | 2     | 3
----------+-------+-------+-------+-------
 n & 2    | 0     | 0     | 2     | 2
----------+-------+-------+-------+-------
 test     | y < 0 | y < 0 | y > 0 | y > 0
----------+-------+-------+-------+-------
 base     | #.... | #.... | ##### | #####
 shape    | ##... | ##... | .#### | .####
          | ###.. | ###.. | ..### | ..###
          | ####. | ####. | ...## | ...##
          | ##### | ##### | ....# | ....#
----------+-------+-------+-------+-------
 n % 2    | 0     | 1     | 0     | 1
----------+-------+-------+-------+-------
 reverse? | no    | yes   | no    | yes
----------+-------+-------+-------+-------
 final    | #.... | ##### | ##### | ....#
 shape    | ##... | ####. | .#### | ...##
          | ###.. | ###.. | ..### | ..###
          | ####. | ##... | ...## | .####
          | ##### | #.... | ....# | #####

1
açıkladığınız detay için teşekkür ederim.
chau giang


7

Japt , 8 bayt

Satır dizisini döndürür.

õ ¬å+ zU

Dene

Kevin sayesinde 2 bayt kurtardı .

õ ¬å+ zU     :Implicit input of integer U
õ            :Range [1,U]
  ¬          :Join to a string
   å+        :Cumulatively reduce by concatenation
      zU     :Rotate clockwise by 90 degrees U times

1
úgerekli? Döndürme bunu dolaylı olarak yapıyor gibi görünüyor?
Kevin Cruijssen

@KevinCruijssen, hmm ... öyleyse öyle. Bunu hep unutuyorum; nadiren kullanmak z.
Shaggy

1
Japt'i hiç tanımıyorum. Çıktının eğlence için dolgu
malzemesi


4

Perl 6 , 94 bayt

{[o](|(&reverse xx$_/2+.5),|(*>>.flip xx$_/2+1))([\~](my@a=[~](1..$_).comb)>>.fmt("%{+@a}s"))}

Çevrimiçi deneyin!

Sayı alan ve satır listesini döndüren adsız kod bloğu.


3

Kömür , 17 bayt

Nθ≔⭆θ⊕ιηGLLηη⟲⊗θ‖

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

Nθ

Giriş n.

≔⭆θ⊕ιη

Sayıları birleştirerek bir dize oluşturun 1için n.

GLLηη

Bu uzunluktaki bir üçgeni dize ile doldurun.

⟲⊗θ

Üçgeni saat yönünün tersine n*90derece derece döndürün.

Her şeyi yansıtın, böylece saat yönünde döndürülen bir üçgenle n*90bitirin.




3

R , 152 139 137 134 bayt

function(n,N=nchar(s<-Reduce(paste0,1:n,'')),A=!n%%4%%3)for(i in 1:N)cat(rep('',(M=c(N-i+1,i))[1+!A]*(n%%4>1)),substr(s,1,M[1+A]),'
')

Kontrolsüz kod:

function(n){
  s = Reduce(paste0,1:n,'')      # concat the digits from 1 to n into a string s

  N = nchar(s)                   # store the length of s

  A = !n%%4%%3                   # A = TRUE if n MOD 4 == 1 or 2 

  for(i in 1:N){                 # for 1 to N (length of s)

    M = c(N-i+1,i)               # store N-i+1 and i into a vector

    nSpaces = M[1+!A]*(n%%4>1)   # if n MOD 4 == 1 or 2 then nSpaces = i else nSpaces = N-i+1, 
                                 # but if n MOD 4 == 0 or 1, then force nSpaces = 0

    nDigits = M[1+A]             # if n MOD 4 == 1 or 2 then nDigits = N-i+1 else nDigits = i

    prfx = rep('',)              # create a character vector repeating '' nSpaces times

    sufx = substr(s,1,M[1+A])    # substring s by taking the first nDigits characters

    cat(pr,su,'\n')              # print prfx and sufx using space as separator for the values 
                                 # contatenation (cat function default) and append a newline
  }

Çevrimiçi deneyin!


Açıkçası golf oynamak için benim günüm değildi.
Giuseppe

@Giuseppe: ahah oradaydı ... ve sonra sen genellikle beni aştın: P
digEmAll


2

PowerShell , 108 bayt

param($n)0..($y=($x=-join(1..$n)).length-1)|%{' '*(0,0,$_,($z=$y-$_))[$n%4]+-join$x[0..($_,$z,$z,$_)[$n%4]]}

Çevrimiçi deneyin!

Kenarlarda biraz pürüzlü ama işe yarıyor. Rakam 1'i nbir dizgiye ekler, ardından 0'dan bu dizge-1'in uzunluğuna çıkar. Her seferinde, yeni dizgimizi dilimlemek için kullanılan doğru aralık yöntemine ve sayı aralığına geçmek için liste indekslemeyi kullanır.



2

05AB1E (eski) , 14 12 10 bayt

Eski veryonun tekrar yazma olarak kullanılması, bazı sebeplerden dolayı bu konuda oldukça yavaştır.

Kevin Cruijssen sayesinde 2 bayt kaydedildi

LSηsFRζ}J»

Çevrimiçi deneyin!

açıklama

L           # push range [1 ... input]
 S          # split to list of individual digits
  η         # calculate prefixes
   sF  }    # input times do:
     R      # reverse list
      ζ     # and transpose it
        J   # join to list of strings
         »  # and join on newlines

Sen değişen 2 bayt kaydedebilirsiniz LJη€Siçin LSηçünkü Sdolaylı düzleşir.
Kevin Cruijssen

@KevinCruijssen: Evet, teşekkürler! Bunu unutmuştum. €SHangisinin iyi çalışmadığını denedim ;)
Emigna


2

PowerShell , 105 101 95 bayt

-4 bayt Sort ile numara için Arnauld teşekkürler .

param($n)($x=1..$n-join'')|% t*y|%{($s+="$_")}|sort -d:($n%4-in1,2)|% *ft($x.Length*($n%4-ge2))

Çevrimiçi deneyin!

Daha az golf oynadı:

param($n)
$x=1..$n-join''
$x|% toCharArray |% {
    ($s+="$_")
} | sort -Descending:($n%4-in1,2) |% PadLeft ($x.Length*($n%4-ge2))

2

R , 175 172 154 bayt

function(n)write(c(" ",0:9)[1+(x=utf8ToInt(Reduce(paste0,1:n,""))-47)*!upper.tri(diag(y<-sum(x|1)))["if"(n%%4>1,1:y,y:1),"if"(!n%%4%%3,y:1,1:y)]],1,y,,"")

Çevrimiçi deneyin!

Korkunç bir çizgi karışıklığı!

Dönme koşulunu değiştirerek -3 bayt

DigEmAll'in önerisi sayesinde -17 bayt ve daha sonra golf oynadıktan sonra başka bir bayt


Bu üst üçgen yaklaşımdan hoşlanıyorum ve 155 bayta kadar kısaltılabilirim ... belki daha da fazlası, bariz bir şeyi kaçırdığımdan eminim ...
digEmAll

@digEmAll ah, çok gelişmiş, ama yine de uzun:
Giuseppe




1

perl 5, 117 bayt

$p=$_++&2?'/ ':'$/';$s='(.*\d.\n)';$r=$_--&2?$s.'\K$':"^(?=$s)";$_=(join"",1..$_).$/;1while s,$r,'$1=~s/\d'."$p/r",ee

TIO


1

PHP ,116 111 109 bayt

for($m=$l=strlen($s=join(range(1,$n=$argn)));$l--;)printf('%'.($n&2?$m:-$l).'.'.($n-1&2?$m-$l:$l+1)."s
",$s);

Çevrimiçi deneyin!

php -nFGirişi ile çalıştırın STDIN.

$ echo 6|php -nF t.php

123456
 12345
  1234
   123
    12
     1

1

Java (JDK) , 247 209 188 186 160 148 bayt

i->{String s="";int l=0,w;for(;l<i;s+=++l);for(w=s.length(),l=0;l<w;)System.out.printf("%"+(1>i%4/2?1:w)+"s\n",s.substring(0,1>~-i%4/2?w-l++:++l));}

Çevrimiçi deneyin!

-38 bytes @KevinCruijssen için teşekkürler
-21 bytes vererek printfdolgu işlemek.
-2 bytesdeğiştirmeden önce alt dizeyi yaparak, liki yerine tek bir konumda artmamıza izin verin .
-26 bytes- printfDolgu yapılırken, boşluklarla dolu olan dize artık gerekli değildi ve rakam dizeleri görünüşte daha kısa bir şekilde oluşturulabilirdi.
-12 bytesZaten sahip olduğumuz mükemmel hizmete sahip rakam dizisinin alt dizelerini yazdırmak yerine tek bir rakam ile uğraşmayarak.

Ungolfed

input->{
    // Lambda expression with target type of IntConsumer
    String allDigits = "";
    int lineLength, line = 0;

    // Collect a list of all digits in order.
    for (;line < input; allDigits += ++line) {}

    // Save the max length of a line, and create a string of that many spaces.
    for (lineLength=allDigits.length(), line=0; line < lineLength;) {
        System.out.printf(   "%" // construct a format string to handle the padding
                           + (   1 > input%4/2
                               ? 1 // No padding
                               : w // Yes padding
                             )
                           + "s\n"
                         , allDigits.substring( 0
                                              ,   1 > (i-1)%4/2
                                                ? w - l++
                                                : ++l
                                              ) // A string containing only the digit we want.
                         );
    }
}

1
Güzel cevap Ancak daha çok golf oynamak için bir sürü şey var: Kutunun arkasındaki alanlar for(kaldırılabilir. Java 11+ kullanıyor new String(new char[w=s.length()]).replace('\0',' ')olabilir " ".repeat(w=s.length()). Üçlü çeklerin etrafındaki parantezi kaldırabilirsiniz. 1>(i-1)%4/2olabilir 1>~-i%4/2. w-1-l++olabilir w+~l++. Ve bayt sayımındaki sondaki noktalı virgül saymak zorunda değilsiniz. Tüm birleştirilen 209 bayt olur .
Kevin Cruijssen
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.