Cyfrowe trójkąty

26

Wyzwanie:

Dane wejściowe: dodatnia liczba całkowitan

Wydajność:

Utwórz listę z zakresu i połącz ją ze sobą w łańcuch (tzn. będzie łańcuchem ).[1,n]n=1312345678910111213

Teraz wyprowadzamy trójkąt, używając prefiksów lub sufiksów tego ciągu, w jednej z następujących czterech orientacji opartych na wejściowej liczbie całkowitej:

  • Jeśli n0(mod4) , wyślij go w kształcie trójkąta ◣
  • Jeśli n1(mod4) , wyślij go w kształcie trójkąta ◤
  • Jeśli n2(mod4) , wyślij go w kształcie trójkąta ◥
  • Jeśli n3(mod4) , wyślij go w kształcie trójkąta ◢

Przykład:

Dane wejściowe: n=13

Ponieważ 131(mod4) , kształt będzie ◤. Oto trzy możliwe prawidłowe dane wyjściowe:

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

Zasady konkursu:

  • Jak widać na trzech prawidłowych wyjściach powyżej, ważny jest tylko prawidłowy kształt i użycie wszystkich cyfr we właściwej kolejności . Oprócz tego możesz swobodnie używać prefiksów lub sufiksów; odwraca / odbija; druk ukośny; itd. itd. Dozwolone jest dowolne z sześciu możliwych wyników dla każdego kształtu (patrz przypadek testowy poniżej, aby zobaczyć wszystkie prawidłowe wyniki oparte na kształcie). Pozwala to na używanie języków z wbudowanymi rotacjami, ale te bez niego mogą również stosować alternatywne podejście polegające na stosowaniu prefiksów w odpowiednim rozmiarze od góry do dołu lub używania prefiksów dla dwóch kształtów, ale sufiksów dla dwóch pozostałych kształtów . Wybór najbardziej odpowiednich opcji wyjściowych dla twojego języka jest częścią procesu gry w golfa. :)
  • Dane wejściowe mają być dodatnią liczbą całkowitą. Dla po prostu wyprowadzamy .n=11
  • Dozwolona jest dowolna liczba wiodących / końcowych znaków nowej linii / spacji, pod warunkiem, że drukuje gdzieś na ekranie właściwy trójkąt (bez pionowych ani poziomych ograniczników!).

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

Dane wejściowe: Wszystkie możliwe prawidłowe dane wyjściowe: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

Wejście: Wszystkie możliwe wyjścia: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

Wejście: Wszystkie możliwe wyjścia: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

Wejście: Wszystkie możliwe wyjścia: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

Wejście: Tylko możliwe wyjście:n=1

1

Wejście: Wszystkie możliwe wyjścia:n=2

12    21    12    21    11    22
 1     2     2     1     2     1
Kevin Cruijssen
źródło
Czy możemy użyć innych wartości dla różnych trójkątów, takich jak 1 dla ◤ itp.?
Embodiment of Ignorance
@EmbodimentofIgnorance Niefortunny przykład, ponieważ tak mówi specyfikacja. Myślę, że chciałeś zapytać, czy możemy zmienić kolejność czterech układów, o ile zachowamy spójność (myślę, że byłoby to nie).
Erik the Outgolfer
1
Jeśli n==13, czy najwyższy rząd może być '33333333333333333'(lub równoważnie '31211101987654321')?
Chas Brown
@EmbodimentofIgnorance Przepraszamy, ale w tym przypadku powiedziałbym „nie”. Kształty i odpowiadające im mod 4są ścisłymi parami tego wyzwania. Dlatego nie możesz zmieniać czterech kształtów dla czterech mod 4przypadków. Niemniej jednak dobre pytanie.
Kevin Cruijssen
@ChasBrown Tak, oba są w porządku. Podałem tylko trzy możliwe przykłady dla , ale wszystkie sześć opcji (jak przypadek testowy ) są prawidłowymi danymi wyjściowymi. n = 5n=13n=5
Kevin Cruijssen

Odpowiedzi:

9

JavaScript (ES6),  93  89 bajtów

Zwraca macierz znaków.

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

Wypróbuj online!

Alternatywny wzór (ten sam rozmiar):

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

Wypróbuj online!

Skomentował

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

Podsumowanie kształtu

Poniżej znajduje się podsumowanie kształtu podstawowego (wygenerowanego przez zagnieżdżone mappętle) i kształtu końcowego (po sort) dla każdego :nmod4

 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    | ##... | ####. | .#### | ...##
          | ###.. | ###.. | ..### | ..###
          | ####. | ##... | ...## | .####
          | ##### | #.... | ....# | #####
Arnauld
źródło
1
dziękuję za wyjaśnienie szczegółów.
chau giang
9

Python 2 , 94 bajty

n=0;s=''
exec"n+=1;s+=`n`;"*input()
K=k=len(s)
while k:k-=1;print s[k^n/-2%-2:].rjust(n%4/2*K)

Wypróbuj online!

xnor
źródło
7

Japt , 8 bajtów

Zwraca tablicę wierszy.

õ ¬å+ zU

Spróbuj

Zaoszczędzono 2 bajty dzięki Kevinowi .

õ ¬å+ 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
Kudłaty
źródło
1
Czy to úkonieczne? Wygląda na to, że rotacja to domyślnie?
Kevin Cruijssen
@KevinCruijssen, hmm ... więc to robi. Zawsze o tym zapominam; rzadko używają z.
Kudłaty
1
Cóż, w ogóle nie znam Japt. Byłem po prostu ciekawy, jak wyglądało wyjście bez podkładki dla zabawy i zobaczyłem, że zadziałało dokładnie tak samo ..;)
Kevin Cruijssen
4

Perl 6 , 94 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera liczbę i zwraca listę wierszy.

Jo King
źródło
3

Węgiel drzewny , 17 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Nθ

Wejście n.

≔⭆θ⊕ιη

Utwórz ciąg, łącząc liczby 1z n.

GLLηη

Wypełnij trójkąt tej długości sznurkiem.

⟲⊗θ

Obróć trójkąt w kierunku przeciwnym do ruchu wskazówek zegara o n*90stopnie.

Odzwierciedlaj wszystko, co kończy się trójkątem, który jest obracany zgodnie z ruchem wskazówek zegara o n*90stopnie.

Neil
źródło
3

Rubin , 95 82 79 bajtów

->n{r=(0...z=/$/=~s=[*1..n]*'').map{|i|" "*n[1]*i+s[0,z-i]};-n&2>0?r:r.reverse}

Wypróbuj online!

3 bajty zapisane przez G B.

Kirill L.
źródło
3

R , 152 139 137 134 bajtów

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]),'
')

Kod rozwinięty:

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
  }

Wypróbuj online!

digEmAll
źródło
... najwyraźniej nie był to mój dzień na golfa.
Giuseppe
@Giuseppe: ahah tam był ... a potem zwykle mnie obezwładniłeś: P
digEmAll
2

PowerShell , 108 bajtów

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

Wypróbuj online!

Trochę szorstki na brzegach, ale działa. Łączy cyfry 1 nw ciąg, a następnie iteruje od 0 do długości tego ciągu-1. Za każdym razem używa indeksowania listy, aby zamienić na prawidłową metodę odstępów i zakres liczb użyty do wycięcia naszego nowego ciągu.

Veskah
źródło
2

05AB1E (starsza wersja) , 14 12 10 bajtów

Używanie starszej wersji jako przepisywania jest z tego powodu bardzo powolne.

Zaoszczędzono 2 bajty dzięki Kevinowi Cruijssenowi

LSηsFRζ}J»

Wypróbuj online!

Wyjaśnienie

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
Emigna
źródło
Możesz zapisać 2 bajty LJη€Sna LSη, ponieważ Sdomyślnie spłaszcza się.
Kevin Cruijssen
@KevinCruijssen: O tak, dzięki! Zapomniałem o tym. Próbowałem, €Sco nie wyszło zbyt dobrze;)
Emigna
2

PowerShell , 105 101 95 bajtów

-4 bajty dzięki Arnauldowi za sztuczkę z sortowaniem .

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

Wypróbuj online!

Mniej golfa:

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

R , 175 172 154 bajtów

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,,"")

Wypróbuj online!

Okropny bałagan w linii!

-3 bajty, zmieniając warunek obrotu

-17 bajtów dzięki sugestii digEmAll i kolejny bajt po dalszym golfie

Giuseppe
źródło
Podoba mi się to podejście do trójkąta górnego. Można je skrócić do 155 bajtów ... może nawet więcej, jestem pewien, że brakuje mi czegoś oczywistego ...
digEmAll
@digEmWszystkie ah, znacznie poprawione, ale wciąż długie :-(
Giuseppe
1

Python 2 , 116 bajtów

n=input()
s=''.join(map(str,range(1,n+1)));L=len(s)
p=-~n/2%2;i=~-L*p+1
exec'print s[:i].rjust(n/2%2*L);i+=1-2*p;'*L

Wypróbuj online!

Chas Brown
źródło
1

Czerwony , 155 bajtów

func[n][b: copy""repeat i n[append b i]repeat i l:
length? b[t:[l - i + 1]set[k m]pick[i t[l t][l i]]n % 4 + 1
print pad/left copy/part b do do m do do k]]

Wypróbuj online!

Galen Iwanow
źródło
1

perl 5, 117 bajtów

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

TIO

Nahuel Fouilleul
źródło
1

PHP ,116 111 109 bajtów

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

Wypróbuj online!

Uruchom z php -nFwejściem z STDIN.

$ echo 6|php -nF t.php

123456
 12345
  1234
   123
    12
     1
640 KB
źródło
1

Java (JDK) , 247 209 188 186 160 148 bajtów

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

Wypróbuj online!

-38 bytesdzięki @KevinCruijssen
-21 bytes, pozwalając printfsobie poradzić z wypełnieniem.
-2 byteswykonując podciąg przed zamianą, co pozwala nam zwiększać wartość lw jednym miejscu, a nie w dwóch.
-26 bytes- printfpodczas wypełniania łańcuch pełen spacji nie był już potrzebny, a ciągi cyfr można najwyraźniej wygenerować w krótszy sposób.
-12 bytesnie zajmując się pojedynczymi cyframi zamiast drukować podciągi doskonale nadającego się do obsługi ciągu cyfr, który już mamy.

Nie golfił

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.
                         );
    }
}
Sara J.
źródło
1
Niezła odpowiedź. Jest jednak kilka rzeczy do golfa: przestrzenie po polu for(można usunąć. new String(new char[w=s.length()]).replace('\0',' ')może " ".repeat(w=s.length())korzystać z Java 11+. Możesz usunąć nawias wokół kontroli trójskładnikowych. 1>(i-1)%4/2może być 1>~-i%4/2. w-1-l++może być w+~l++. I nie musisz liczyć końcowego średnika w liczbie bajtów. Które wszystkie razem stają się 209 bajtami .
Kevin Cruijssen