Zaprojektujmy cyfrową mozaikę

25

Wyzwanie

Biorąc dodatnia powtórzyć każdy jego cyfry kilka razy odpowiadającej jej pozycji w . Innymi słowy, każdą cyfrę należy powtórzyć razy (dla każdego , 1-indeksowany), tworząc w ten sposób nowy numer:Nd1,d2,d3,,renN.rekk1kn

re1re2)re2)re3)re3)re3)renrenrenrenn czasy¯

Następnie zapisz go zarówno w poziomie, jak i w pionie i wypełnij puste miejsca kopiami cyfry, która odpowiada większemu indeksowi między indeksem kolumny a indeksem wiersza pustej przestrzeni. Ostateczne wyjście powinno wyglądać następująco:

[re1re2)re2)re3)re3)re3)re2)re2)re2)re3)re3)re3)re2)re2)re2)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)re3)]

Okular

Możesz wziąć jako liczbę całkowitą, ciąg, listę cyfr lub listę znaków reprezentujących cyfry. Dane wyjściowe mogą być ciągiem oddzielonym znakiem nowej linii, listą ciągów / liczb całkowitych lub listą znaków / cyfr, ale jeśli to możliwe, proszę dołączyć również wersję całkiem ładną. Jeśli wynik jest ciągiem oddzielonym znakiem nowej linii, dopuszczalne jest również:N.

  • mają początkowe / końcowe białe znaki, o ile wygląd wyjściowy nie zmienia się
  • rozdziel kolumny za pomocą spójnej ilości spacji lub wierszy o stałej (niezerowej) ilości nowych linii

Możesz przyjmować dane wejściowe i dostarczać dane wyjściowe za pomocą dowolnej standardowej metody , zwracając uwagę, że te luki są domyślnie zabronione. To jest , więc spróbuj wykonać zadanie w jak najmniejszej liczbie bajtów, którymi możesz zarządzać w wybranym języku .

Przypadki testowe

65:

655
555
555

---------------

203:

200333
000333
000333
333333
333333
333333

--------------

233:

233333
333333
333333
333333
333333
333333

---------------

5202:

5220002222
2220002222
2220002222
0000002222
0000002222
0000002222
2222222222
2222222222
2222222222
2222222222

---------------

12345:

122333444455555
222333444455555
222333444455555
333333444455555
333333444455555
333333444455555
444444444455555
444444444455555
444444444455555
444444444455555
555555555555555
555555555555555
555555555555555
555555555555555
555555555555555
Pan Xcoder
źródło
Czy mamy dwa uchwyty tej samej cyfry obok siebie?
Dom Hastings,
@DomHastings Tak, musisz sobie z nimi poradzić. Dodano ilustrujący to przypadek testowy.
Pan Xcoder,
Powiązane
Magic Octopus Urn

Odpowiedzi:

9

JavaScript (ES7), 70 bajtów

Pobiera dane wejściowe jako ciąg. Zwraca ciąg z końcowym podawaniem linii.

s=>(g=x=>(c=s[(x>y?x:y)**.5-1>>1])?c+g(x+8):x>y?`
`+g(1,y+=8):'')(y=1)

Wypróbuj online!

W jaki sposób?

metoda

Budujemy wyjściowy znak po znaku, przechodząc przez macierz kwadratową i przekształcając każdą komórkę w indeks w ciąg wejściowy.jax,y

Współrzędne do indeksu ciągów

Górna granica obszaru (indeksowane 0) wzdłuż każdej osi jest podana przez A000096 : n t hunnth

u0=0,u1=2,u2=5,u3=9,u4=14,u5=20,

un=n(n+3))2)
u0=0,u1=2),u2)=5,u3)=9,u4=14,u5=20,

Biorąc pod uwagę liczbę całkowitą , możemy dowiedzieć się, w którym obszarze znajduje się, rozwiązując:n = x+ 1kn=x+1

x²+3)x-2)k=0

Prowadzący do:

n=

x=1+8k-3)2)
n=1+8k-3)2)+1=1+8k-12)

Dla każdej komórki definiujemy:(x,y)

przeciwkox,y=max(1+8x,1+8y)

Te wartości są konwertowane na indeksy na ciąg wejściowy, wykonując:przeciwkox,yjax,y

jax,y=przeciwkox,y-12)
 v(x,y) |  0  1  2  3  4  5  6  7  8  9        i(x,y) |  0  1  2  3  4  5  6  7  8  9
--------+-------------------------------      --------+-------------------------------
    0   |  1  9 17 25 33 41 49 57 65 73           0   |  0  1  1  2  2  2  3  3  3  3
    1   |  9  9 17 25 33 41 49 57 65 73           1   |  1  1  1  2  2  2  3  3  3  3
    2   | 17 17 17 25 33 41 49 57 65 73           2   |  1  1  1  2  2  2  3  3  3  3
    3   | 25 25 25 25 33 41 49 57 65 73           3   |  2  2  2  2  2  2  3  3  3  3
    4   | 33 33 33 33 33 41 49 57 65 73   -->     4   |  2  2  2  2  2  2  3  3  3  3
    5   | 41 41 41 41 41 41 49 57 65 73           5   |  2  2  2  2  2  2  3  3  3  3
    6   | 49 49 49 49 49 49 49 57 65 73           6   |  3  3  3  3  3  3  3  3  3  3
    7   | 57 57 57 57 57 57 57 57 65 73           7   |  3  3  3  3  3  3  3  3  3  3
    8   | 65 65 65 65 65 65 65 65 65 73           8   |  3  3  3  3  3  3  3  3  3  3
    9   | 73 73 73 73 73 73 73 73 73 73           9   |  3  3  3  3  3  3  3  3  3  3

Warunki zatrzymania

Wiemy, że osiągnęliśmy:

  • prawa granica macierzy, gdy znak w nie istnieje i mamyjax,yx>y

  • dolna granica macierzy, gdy znak nie istnieje i mamyxy

Arnauld
źródło
7

J , 16 15 bajtów

-1 bajt dzięki FrownyFrog!

{~#\<:@>./~@##\

Wypróbuj online!

Przyjmuje Njako sznur.

Objaśnienie pierwszego rozwiązania:

              #\   finds the length of the successive prefixes of the input (1 2 3...)
            #~     copies each digit as many times (1 2 2 3 3 3...)  
       >./~@       and creates a table of the max of the row/col numbers
  [:<:@            then subtract 1 from each element (for indexing)
{~                 select the corresponding digit from the input

Sesja testowa z wejściem 203:

   #\ '203'
1 2 3

   #~#\ '203'
1 2 2 3 3 3

   >./~@#~#\ '203'
1 2 2 3 3 3
2 2 2 3 3 3
2 2 2 3 3 3
3 3 3 3 3 3
3 3 3 3 3 3
3 3 3 3 3 3

   <:@>./~@#~#\ '203'
0 1 1 2 2 2
1 1 1 2 2 2
1 1 1 2 2 2
2 2 2 2 2 2
2 2 2 2 2 2
2 2 2 2 2 2

   ({~[:<:@>./~@#~#\) '203'
200333
000333
000333
333333
333333
333333
Galen Iwanow
źródło
1
Hah, oprócz umieszczenia ), twoja odpowiedź APL jest taka sama, jak moja, która byłaby moja.
Erik the Outgolfer
Naprawdę wcale nie znam J, ale [:<:@wydaje się dość kosztowny. Czy możesz zamiast tego wstawić coś do listy, którą indeksujesz, aby uwzględnić indeksowanie 1 (np. Wstaw wartość 0, aby przesunąć każdy niezbędny element o 1 pozycję w prawo)?
Pan Xcoder
@ Mr.Xcoder Myślałem o tym. Spróbuję sprawdzić, czy pozwoli to zaoszczędzić trochę bajtów.
Galen Iwanow
@EriktheOutgolfer {⍵[∘.⌈⍨(/⍨)⍳⍴⍵]} ?
Galen Iwanow
@GalenIvanov Tak, to.
Erik the Outgolfer
6

Python 2 , 71 bajtów

i=j=0;r=''
for x in input():i+=1;r+=x*i
for c in r:print j*c+r[j:];j+=1

Wypróbuj online!

Najpierw generuje pierwszy wiersz r, a następnie iteruje, raby wydrukować każdą linię.

xnor
źródło
6

R , 59 bajtów

function(a){m=outer(x<-rep(g<-seq(a),g),x,pmax);m[]=a[m];m}

Wypróbuj online!

  • Zauważyłem, że pobranie wektora cyfr jest dopuszczalne, co pozwoliło mi zaoszczędzić 21 bajtów :)
  • -2 bajty dzięki sugestii @Giuseppe, aby zaakceptować tylko wektor znaków
  • -2 bajty przypisywane w definicji argumentów
digEmAll
źródło
1
Możesz wziąć ajako wektor znaków, co pozwala ustawić g=seq(a)bezpośrednio.
Giuseppe
@Giuseppe: zgadza się!
digEmAll
5

05AB1E , 14 11 10 bajtów

Zaoszczędzono 1 bajt dzięki Magic Octopus Urn / Adnan

ƶJDv¬N×?=¦

Wypróbuj online!

Wyjaśnienie

ƶ            # repeat each element its index (1-based) times 
 J           # join to string
  Dv         # for N in [0 ... len(string)-1] do
    ¬N×      # push the head repeated N times
       ?     # print without newline
        =    # print the rest of the string without popping
         ¦   # remove the head
Emigna
źródło
1
Wypróbuj online! = 10
Magic Octopus Urn
1
Nie mam jednak uznania, kredyt to Adnans: codegolf.stackexchange.com/a/87074/59376
Magic Octopus Urn
@MagicOctopusUrn: Ach, to wspaniale! Dzięki wam obojgu;)
Emigna
4

APL (Dyalog Classic) , 16 bajtów

{⍵[∘.⌈⍨(/⍨⍳⍴⍵)]}

Oddzielam to rozwiązanie od postu moją odpowiedzią J, zgodnie z sugestią Jo Kinga

Wypróbuj online!

Galen Iwanow
źródło
3

Excel VBA, 95 bajtów

Anonimowa funkcja natychmiastowego okna VBE, która pobiera dane wejściowe [A1]i wyjściowe z konsoli

n=[len(A1)]:For y=1To n:For l=1To y:?:For x=1To n:?String(x,Mid([A1],IIf(x>y,x,y)));:Next x,l,y

Nie golfił i skomentował

n=[len(A1)]                         ''  Get Length
For y=1To n                         ''  Iterate down input
For l=1To y                         ''  Iterate down repeat lines
?                                   ''  Print Newline
For x=1To n                         ''  Iterate accross input
?String(x,Mid([A1],IIf(x>y,x,y)));  ''  Print x of the `max(x,y)`th digit in input
Next x,r,y                          ''  Loop, Loop, Loop
Taylor Scott
źródło
2

MATL , 15 12 bajtów

tftY"t!2$X>)

Wypróbuj online!

Podejrzewam, że można to skrócić, ale nie jest tak źle ...

          % implicit input, '230'
t         % duplicate input. Stack: ['230','230']
f         % indices of nonzero values. Stack: ['230',[1,2,3]]
t         % duplicate. Stack: ['230',[1,2,3],[1,2,3]]
Y"        % run-length decoding. Stack: ['230',[1,2,2,3,3,3]]
t         % duplicate. Stack: ['230',[1,2,2,3,3,3],[1,2,2,3,3,3]]
!         % transpose. Stack: ['230',[1,2,2,3,3,3],[1;2;2;3;3;3]]
2$X>      % elementwise maximum of 2 inputs, with broadcast.
          % Stack:
          % ['230',
          % [1, 2, 2, 3, 3, 3;
          %  2, 2, 2, 3, 3, 3;
          %  2, 2, 2, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3]]
 )        % index into G
          % implicit end, display stack contents
Giuseppe
źródło
2

Dodaj ++ , 35 bajtów

L,bLRdBcB]£X¦Ω+d‽b>1€Ω_A€Ω:AbLR¦+$T

Wypróbuj online!

Jak to działa

Pobieramy dane wejściowe jako listę cyfr, jednocześnie zapobiegając: a) konieczności rzutowania na cyfry za pomocą BD, a także konieczności zapisywania cyfr, co zajęłoby dwa bajty.

bLRnndBcB][[1,1],[2),2)]...[n,n]]£X¦Ω+

Następnie możemy powielać tę tablicę i stół go maksimum d‽b>. Oznacza to, że każdy element w tablicy jest sparowany ze sobą z drugim elementem z drugiej tablicy, a dynamiczne polecenie maksymalne jest uruchamiane na parze. Na przykładowe wejście [6 5] tworzy tablicę [1 2 2 2 2 2 2 2 2] , która jest spłaszczoną wersją mozaiki, jako indeksy tablicy. Niestety Dodaj ++ używa 0 indeksowane tablice, więc musimy zmniejszyć każdy element: 1€Ω_.

A€Ω:x

x(x-1)2)

xth AbLR¦+Tn$T


źródło
1

Węgiel drzewny , 17 bajtów

F⮌…LθUO⊕⊘×ι⁺³ι§θι

Wypróbuj online! Wyjaśnienie:

F⮌…Lθ

Pętla nad indeksami znaków w odwrotnej kolejności.

⊕⊘×ι⁺³ι

Oblicz rozmiar kwadratu.

UO...§θι

Narysuj kwadrat, używając bieżącej postaci.

Neil
źródło
1

Węgiel drzewny , 14 bajtów

E⭆θ×⊕κι×⊕κι‖O↗

Wypróbuj online!

W jaki sposób?

E⭆θ×⊕κι×⊕κι‖O↗ - implicitly print the result of...
E                - map:
  ⭆              -   over: string map:       
    θ             -     over: first input
     ×            -     using: repeat
        ι         -       what: ι (loop value)
      ⊕κ          -       by: incremented κ (loop counter)
         ×        -   using: repeat
            ι     -     what: ι (loop value)
          ⊕κ      -     by: incremented κ (loop counter)
             ‖O  - Reflect with overlap:
                ↗ -   direction: up-right

... czy tą metodą można grać w golfa?

Jonathan Allan
źródło
„... czy można tę grę w golfa?” Nawet rozwiązanie Neila jest dłuższe, więc nie widzę tu żadnej nadziei. : P
Erik the Outgolfer
×⊕κιdwa razy.
Jonathan Allan
Chodzi o to, że nie jest łatwo przypisać to do zmiennej, ponieważ wartości ιi κzmieniają się przy każdej iteracji każdej pętli.
Erik the Outgolfer
To musi być funkcja, ale nie wiem, czy to w ogóle możliwe.
Jonathan Allan
Pytanie, które należy zadać, brzmi, czy jest to możliwe w 3 (lub 5, w zależności od tego, jak funkcja jest zdefiniowana) lub mniej. ;) (Oczywista odpowiedź brzmi oczywiście nie.)
Erik the Outgolfer
1

Stax , 12 bajtów

ü°√¿«│⌠º₧@\τ

Uruchom i debuguj

Korzystanie z tego algorytmu .

Wyjaśnienie:

c%R:BXm]i*xit+ Full program, implicit input
c%             Length of input
  R            1-based range
   :B          Repeat each element according to the range ("123" -> "122333")
     X         Save to X register
      m        Map:
       ]         Character -> string
        i*       Repeat by iteration index
          xit    Trim first <iteration index> elements from X
             +   Concatenate
                 Implicit output with newline

Stax , 20 19 18 16 bajtów

ù↔‼i,ÑΓæ☺=╘‼æ↕4╝

Uruchom i debuguj

Wyjaśnienie:

c%R:BX%mYx%{y|Mvx@m Full program, implicit input
c%                  Length of input
  R                 1-based range
   :B               Repeat each element according to the range ("123" -> "122333")
     X              Save to X register
      %             Length
       m            Map over 1-based range:
        Y             Save index to Y register
         x%           Push length of X register
           {      m   Map over 1-based range:
            y|M         Maximum of both indices
               v        1-based -> 0-based (decrement)
                x@      Index into X register
                      Implicit output with newline
pustkowie
źródło
1

Attache , 34 bajty

{_[Table[Max,Flat!{_&_}=>1:#_]-1]}

Wypróbuj online!

Wyjaśnienie

Działa podobnie do odpowiedzi J Galena Iwanowa .

{_[Table[Max,Flat!{_&_}=>1:#_]-1]}
{                                }   anonymous function: _ is input, array of digits
                                     example: _ := [2, 0, 3]
                         1:#_        the range 1 to Size[_]
                                     > e.g.: [1, 2, 3]
                  {   }=>            over each number N:
                   _&_                   map to N repeated N times
                                     > e.g.: [[1], [2, 2], [3, 3, 3]]
             Flat!                   flatten it
                                     > e.g.: [1, 2, 2, 3, 3, 3]
   Table[Max,                ]       create a "max" table with it
                                     > e.g.:
                                       1 2 2 3 3 3
                                       2 2 2 3 3 3
                                       2 2 2 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                              -1     subtract 1 from each
                                     > e.g.:
                                       0 1 1 2 2 2
                                       1 1 1 2 2 2
                                       1 1 1 2 2 2
                                       2 2 2 2 2 2
                                       2 2 2 2 2 2
                                       2 2 2 2 2 2
 _[                             ]    index the original array with this matrix
                                     > e.g.:
                                       2 0 0 3 3 3
                                       0 0 0 3 3 3
                                       0 0 0 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
Conor O'Brien
źródło
1

C (gcc) , 130 bajtów

Kto potrzebuje wymyślnej matematyki, kiedy można brutalnie wykorzystać?

n,l;R(n,c){for(;n--;)putchar(c);}f(s){for(char*p=s,*q;*p++;)for(n=l=p-s;l--;R(1,10))for(R(n*n+n>>1,p[-1]),q=p;*q;q++)R(q-s+1,*q);}

Wypróbuj online!

gastropner
źródło
1

QBasic 1.1 , 127 bajtów

INPUT S$
FOR X=1TO LEN(S$)
K=K+X
R$=R$+STRING$(X,MID$(S$,X,1))
NEXT
FOR C=1TO K
?STRING$(C-1,MID$(R$,C,1))RIGHT$(R$,K-C+1)
NEXT

-4 dzięki DLosc .

Używa zmodyfikowanej wersji algorytmu xnor Python 2 .

Dane wejściowe to ciąg niecytowany. Dane wyjściowe są \noddzielane bez dodatkowych spacji lub znaków \ns.

Erik the Outgolfer
źródło
1

QBasic , 111 bajtów

Anonimowa funkcja monitująca o dane wejściowe i wyjściowe do konsoli.

INPUT s$
n=LEN(s$)
FOR y=1TO n
FOR l=1TO y
?
FOR x=1TO n
z=x
IF y>x THEN z=y
?STRING$(x,MID$(s$,z));
NEXT x,l,y
Taylor Scott
źródło
Wygląda dobrze - ale czy nie masz na myśli „pełnego programu”? Nie sądzę, że QBasic ma „anonimowe funkcje”.
DLosc
0

Php 7.1 , 163 bajty

Za pośrednictwem interfejsu CLI, podając numer jako argument:

<?foreach(str_split($argv[1])as$k=>$d)$a[]=array_fill(0,$s+=$k+1,array_fill(0,$s,$d));foreach(array_replace_recursive(...array_reverse($a))as$v)echo join($v)."\n";

Nie tak golfowy:

$n = 123;

foreach(str_split($n) as $k => $d) {
    $s += $k + 1;
    $a[] = array_fill(0, $s, array_fill(0, $s, $d));
}

foreach(array_replace_recursive(...array_reverse($a)) as $v)
    echo implode('', $v) . "\n";

Wydajność:

122333
222333
222333
333333
333333
333333

Metoda:

Zasadniczo zbuduj wielowymiarowe kwadraty tablic składające się z cyfry, a następnie nałóż je wszystkie (array_replace_recursive).

(Tak, wiem, że to krępująco długie).

Progrock
źródło
Jeśli dane wejściowe to predefiniowana tablica cyfr, a implode / łączenie echa jest usuwane / zastępowane przypisaniem do listy cyfr, można to zmniejszyć do około 119 bajtów, tak długo.
Progrock
0

Japt, 12 bajtów

Pobiera dane wejściowe jako ciąg, generuje tablicę ciągów.

Ë+pE
¬£h°YçX

Spróbuj


Wyjaśnienie

            :Implicit input of string U
Ë           :Map each character D at 0-based index E
  pE        :  Repeat D E times
 +          :  Append to D
\n          :Reassign to U
¬           :Split to character array
 £          :Map each element X at 0-based index Y
   °Y       :  Increment Y
     çX     :  Repeat X Y times
  h         :  Replace the first Y characters in U with that
Kudłaty
źródło
0

uBASIC , 120 bajtów

Anonimowa funkcja, która pobiera dane wejściowe foprm STDIN i dane wyjściowe do STDOUT

0Input"",S$:N=Len(S$):ForY=1ToN:ForL=1ToY:ForX=1ToN:ForC=1ToX:Z=X:IfY>XThenZ=Y
1?Mid$(s$,z,1);:NextC:NextX:?:NextL:NextY

Wypróbuj online!

Taylor Scott
źródło
0

Visual Basic .NET (VBC) , 198 bajtów

ZA SubRutynowe, które trwa od wejścia stdin i wyjść na standardowe wyjście.

Wygląda na to, że StrDup nie działa: /

Module M
Sub Main
Dim c,s,n,l,x,y
s=Console.readLine()
n=Len(s)
For y=1To n
For l=1To y
For x=1To n
For c=1To x
Console.Write(Mid(s,IIf(x>y,x,y),1)&IIf(c=n,vbLf,""))
Next c,x,l,y 
End Sub
End Module

Wypróbuj online!

Taylor Scott
źródło
0

Lua, 149 140 bajtów

Funkcja, która przyjmuje listę ciągów cyfr i wypisuje wynik na standardowe wyjście. To moja pierwsza próba gry w golfa kodowego (a wybór języka też nie pomaga), więc proszę o wyrozumiałość :)

Wypróbuj online!

function(a)F,s=0,""for b=1,#a do s=s..a[b]:rep(b)end;for b=1,#a do io.write((s.."\n"):rep(b))F,z=F+b,a[b+1]or""s=z:rep(F)..s:sub(F+1)end end

Nie golfowany:

G = function(p)
    F,s = 0,""
    for i=1,#p do
        s=s..p[i]:rep(i)
    end
    for i=1, #p do
        io.write((s.."\n"):rep(i))
        F,z = F+i, p[i+1]or""
        s = z:rep(F)..s:sub(F+1)
    end
end
-- allows to pass the argument list from stdin
-- example: {"1", "2", "3", "4", "5"}
G(load("return " .. io.read())())
PhilipRoman
źródło
0

Yabasic , 108 bajtów

Anonimowa funkcja, która pobiera dane wejściowe ze STDIN i dane wyjściowe do STDOUT

Input""s$
n=len(s$)
For y=1To n
For r=1To y
For x=1To n
For c=1To x?Mid$(s$,max(x,y),1);Next
Next
?Next
Next

Wypróbuj online!

Taylor Scott
źródło