Bir basamaklı mozaik tasarlayalım


25

Meydan okuma

Tam sayı pozitif bir göz önüne alındığında N , onun her basamak tekrar d1,d2,d3,,dn kendi konumuna karşılık gelen bir kaç kez N . Diğer bir deyişle, her bir basamak dk tekrarlanmalıdır k kez (her biri 1kn , 1-endeksli) bu şekilde yeni bir numara oluşturur:

d1d2d2d3d3d3dndndndnn times¯

Ardından, yatay ve dikey olarak aşağıya yazın ve boşlukları sütun dizini ile boşluğun satır dizini arasındaki daha büyük dizine karşılık gelen basamağın kopyaları ile doldurun. Son çıktı şöyle görünmelidir:

[d1d2d2d3d3d3d2d2d2d3d3d3d2d2d2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3]

gözlük

Sen sürebilir N bir tamsayı, bir dize, basamak bir liste veya basamak temsil eden karakterlerin bir listesi olarak. Çıktı, yeni satırlarla ayrılmış bir dize, dizelerin / tam sayıların bir listesi veya karakter / basamakların bir listesi olabilir, ancak lütfen mümkünse çok hoş bir sürüm de ekleyin. Çıktı newline ayrılmış bir dize ise, ayrıca kabul edilebilir:

  • Çıktının görsel görünümü değişmediği sürece öndeki / sondaki boşluk
  • tutarlı miktarda boşluk kullanarak sütunları ayırın veya tutarlı (sıfır olmayan) sayıda yeni satır içeren satırları

Herhangi bir standart yöntemle girdi alabilir ve çıktı alabilirsiniz ; bu boşluklar varsayılan olarak yasaklanmıştır. Bu , bu nedenle görevi seçtiğiniz dilde yönetebileceğiniz en az baytta tamamlamaya çalışın .

Test durumları

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

Tutamak iki yanyana aynı rakamı var mı?
Dom Hastings,

@DomHastings Evet, onlarla başa çıkmalısın. Bunu gösteren bir test vakası eklendi.
Bay Xcoder

Yanıtlar:


9

JavaScript (ES7), 70 bayt

Bir dize olarak girdi alır. İzleyen satır besleme ile bir dize döndürür.

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

Çevrimiçi deneyin!

Nasıl?

Yöntem

Bu çıkış, bir kare matris üzerinden yürüyen göre karakter karakter ve bir indeks her bir hücreyi dönüştürmek oluşturmak giriş dizeye.ix,y

Dize dizinine koordinatlar

Üst sınırı ve n, t h her bir eksen ile verilir boyunca (0-endeksli) basamak alanı A000096 :unnth

u0=0,u1=2,u2=5,

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

Bir tamsayı Verilen , biz hangi alanda öğrenebilirsiniz n = x+ 1 o çözerek bulunur:kn=x+1

x²+3x2k=0

Giden:

n=

x=1+8k32
n=1+8k32+1=1+8k12

Her hücre için tanımlarız:(x,y)

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

Bu değerler endeksleri dönüştürülür i x , y yaparak giriş dizesine:vx,yix,y

ix,y=vx,y12
 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

Halting koşulları

Ulaştığımızı biliyoruz:

  • karakter bulunmadığında ve x > y olduğunda matrisin doğru sınırıix,yx>y

  • matrisin alt sınır ne zaman karakter yok ve elimizdeki xy


7

J , 16 15 bayt

FrownyFrog sayesinde -1 bayt!

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

Çevrimiçi deneyin!

Alır Nbir dize olarak.

İlk çözümün açıklaması:

              #\   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

Giriş ile test oturumu 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

1
Hah, yerleştirilmesinden ayrı olarak, )APL cevabınız benimkiyle aynı.
Outgolfer Erik,

Gerçekten J'yi tanımıyorum ama [:<:@çok pahalı görünüyor. Bunun yerine, 1 indekslemeyi hesaba katarak indekslemekte olduğunuz listeye bir şey hazırlayabilir misiniz (örneğin, gerekli her elemanı 1 pozisyonunu sağa taşımak için 0 hazırlayın)?
Bay Xcoder

@ Mr.Xcoder Bunu düşünüyordum. Bazı baytları kurtarıp kurtarmayacağını görmek için deneyeceğim.
Galen Ivanov

@EriktheOutgolfer {⍵[∘.⌈⍨(/⍨)⍳⍴⍵]} ?
Galen Ivanov

@GalenIvanov Evet, o.
Outgolfer Erik,


6

Python 2 , 71 bayt

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

Çevrimiçi deneyin!

Önce ilk satırı oluşturur r, sonra rher satırı yazdırmak için tekrar eder.


6

R , 59 bayt

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

Çevrimiçi deneyin!

  • Bir basamak vektör almanın kabul edilebilir olduğunu fark ettim ve bu 21 byte tasarruf etmeme izin verdi :)
  • Sadece karakter vektörünü kabul eden @Giuseppe önerisi sayesinde -2 bayt
  • Bağımsız değişken tanımında atama -2 bayt

1
Doğrudan aayarlamak için izin, bir karakter vektörü olarak alabilir g=seq(a).
Giuseppe

@Giuseppe: doğru!
digEmAll


5

05AB1E , 14 11 10 bayt

Magic Octopus Urn / Adnan sayesinde 1 bayt kaydedildi

ƶJDv¬N×?=¦

Çevrimiçi deneyin!

açıklama

ƶ            # 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


1
Yine de benim için kredi yok, kredi Adnans: codegolf.stackexchange.com/a/87074/59376
Magic Octopus Urn

@ MagicOctopusUrn: Ah, bu harika!
İkinize



3

Excel VBA, 95 bayt

[A1]Konsola giriş yapan ve konsola çıkan anonim bir VBE acil durum penceresi işlevi

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

Ungolfed ve yorum yaptı

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

2

Matl , 15 12 bayt

tftY"t!2$X>)

Çevrimiçi deneyin!

Bunun kısaltılabileceğinden şüpheleniyorum, ama o kadar da kötü değil ...

          % 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

2

++ , 35 bayt ekle

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

Çevrimiçi deneyin!

Nasıl çalışır

Girdileri basamak listesi olarak alırız, a) rakamlardan kurtulmak için a) dizilimini engelleriz. BD ve ayrıca iki bayt alabilecek rakamları kaydetmemizi .

İlk önce, [1 ... len (input)] ile bir aralık oluştururuz bLR, sonra her elemanı tekrar ederizn aralıkta nzamanlar. Add ++ 'da otomatik vectorization olmadığı dBcB]için, bir çift listesi oluşturmak için kendisiyle sıkıştırıyoruz[[1,1],[2,2]...[n,n]]. Daha sonra çiftler üzerinde tekrar ile birleştirilmiş bir yıldız haritası uygularız : £Xonları bir düz dizide birleştirmeden önce (¦Ω+ ) .

Sonra, biz maksimum bu diziyi ve masa bunu çoğaltmak d‽b>. Diğer bir deyişle, dizideki her öğe ikinci dizideki diğer öğelerle eşleştirilir ve dyadic maximum komutu çiftin üzerinde çalıştırılır. Bir örnek girişi için [6 5] , bu dizi oluşturur [1 2 2 2 2 2 2 2 2] bir dizi için indeks olarak mozaik düzleştirilmiş bir versiyonu,. Her eleman azaltma gerekir böylece Maalesef, 0-dizinlenmiş dizi kullanır ++ ekleyin: 1€Ω_.

Ardından, girişi tekrar Alisteye alarak ( ), girişi tekrar liste olarak alarak baytları kaydeden giriş listesine indeksleriz . €Ω:Diziyi uygun bir şekilde lengthed parçalara ayırmadan önce listeye dizin ekleyin. Girişteki hane sayısı ile gösterilirsex, sonra parça boyutu

x(x-1)2

ya da xth üçgen sayı . Girdi uzunluğunu zorlayarak, 1'den bu değere kadar olan aralığı hesaplayarak ve ardından toplamı alarak bunu üretiyoruz AbLR¦+. Şimdi, yığın [6 5] girişi için [[6 5 5 5 5 5 5 5 5] 3] benziyor . Tdiziyi büyüklükte parçalara bölern, ancak argümanlar şu an yanlış sırada, bu yüzden $doğramadan ve geri dönmeden önce bunları değiştiriyoruz T.


1

Kömür , 17 bayt

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

Çevrimiçi deneyin! Açıklama:

F⮌…Lθ

Karakterlerin indekslerini ters sıra ile çevirin.

⊕⊘×ι⁺³ι

Karenin boyutunu hesaplayın.

UO...§θι

Geçerli karakteri kullanarak kareyi çizin.




1

Kömür , 14 bayt

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

Çevrimiçi deneyin!

Nasıl?

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

... bu yöntem golf edilebilir mi?


“... bu yöntem golf edilebilir mi?” Neil'in çözümü bile daha uzundur, bu yüzden burada umut görmüyorum. : P
Outgolfer Erik,

×⊕κι iki kez olsa.
Jonathan Allan,

Şey değerlerine beri, bir değişkene o atamak kolay değil, olduğu ιve κher döngü her işleminde değişiklik.
Outgolfer Erik,

Bir fonksiyon olmalı ama mümkün olup olmadığını bile bilmiyorum.
Jonathan Allan,

Sorulması gereken soru, bayt veya daha az olması halinde, (işlevin nasıl tanımlandığına bağlı olarak) 3'te (veya 5'te) mümkün olup olmadığıdır. ;) (Açık cevap elbette değil.)
Outgolfer Erik,

1

Stax , 12 bayt

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

Koş ve hata ayıkla

kullanma Bu algoritmayı .

Açıklama:

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 bayt

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

Koş ve hata ayıkla

Açıklama:

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

1

Ataşesi , 34 bayt

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

Çevrimiçi deneyin!

açıklama

Galen İvanov'un J cevabına benzer şekilde çalışıyor .

{_[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


1

C (gcc) , 130 bayt

Kaba iş yapabiliyorken kimin lüks matematik yapması gerekiyor?

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

Çevrimiçi deneyin!


1

QBasic 1.1 , 127 bayt

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, DLosc sayesinde .

Xnor'ın Python 2 algoritmasının değiştirilmiş bir versiyonunu kullanır .

Giriş, alıntılanmamış bir dizedir. Çıktı, \nfazladan boşluk veya \ns olmadan ayrılmış .


1

QBasic , 111 bayt

Girdiyi isteyen ve konsola giden çıkışlar için anonim bir işlev.

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

İyi görünüyor - fakat "tam program" demek istemiyor musunuz? QBasic'in "adsız işlevleri" olduğunu sanmıyorum.
DLosc

0

Php 7.1 , 163 bayt

CLI üzerinden numarayı argüman olarak sağlama:

<?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";

Çok golf değil:

$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";

Çıktı:

122333
222333
222333
333333
333333
333333

Yöntem:

Temelde rakamdan oluşan çok boyutlu dizi kareleri oluşturun ve sonra hepsini üst üste getirin (array_replace_recursive).

(Evet, bunun utanç verici derecede uzun olduğunu biliyorum.)


Girdi önceden tanımlanmış bir rakam dizisiyse ve yankı dizilişi / birleştirme bir basamaklar listesi atamasıyla kaldırılır / değiştirilirse, bu hala uzun süre devam edecek şekilde yaklaşık 119 byte'a kadar azaltılabilir.
Progrock


0

Japt, 12 bayt

Girdiyi dizge olarak alır, dizelerin dizisini çıkarır.

Ë+pE
¬£h°YçX

Dene


açıklama

            :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

0

uBASIC , 120 bayt

Giriş foprm STDIN'ini alan ve STDOUT'a çıkış yapan anonim bir işlev

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

Çevrimiçi deneyin!


0

Visual Basic .NET (VBC) , 198 bayt

bir SubSTDIN'den giriş alan ve STDOUT'a çıkış yapan rutin.

StrDup’ın çalışması için görünmüyordu:

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

Çevrimiçi deneyin!


0

Lua, 149 140 bayt

Rakam dizelerinin bir listesini kabul eden ve sonucu stdout'a basan işlev. Bu benim kod golf ilk denemem (ve dil seçimi de yardımcı olmuyor) bu yüzden benimle ayı :)

Çevrimiçi deneyin!

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

Ungolfed:

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


0

Yabasic , 108 bayt

STDIN'den giriş alan ve STDOUT'a çıkış yapan anonim bir işlev

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

Çevrimiçi deneyin!

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.