Imprimir este diamante


76

Esta questão está se espalhando como um vírus no meu escritório. Existem várias abordagens:

Imprima o seguinte:

        1
       121
      12321
     1234321
    123454321
   12345654321
  1234567654321
 123456787654321
12345678987654321
 123456787654321
  1234567654321
   12345654321
    123454321
     1234321
      12321
       121
        1

As respostas são pontuadas em caracteres com menos caracteres sendo melhores.


4
Qual é o critério vencedor? E isso é um desafio ou um golfe?
Paul R

21
Eu li "complexidade kolmogorov" como "código-golfe".
12134

1
@DavidCarraher "Kolmogorov-Complexity" foi editado depois que a pergunta foi feita. O questionador original ainda não especificou os critérios de vencimento.
Gareth

@Gareth Meu comentário foi feito depois que a tag "kolmogorov-Complexity" foi adicionada, mas antes da tag "code-golf". Naquela época, as pessoas ainda estavam se perguntando se era uma questão de código de golfe.
DavidC

3

Respostas:


24

J, 29 26 24 23 22 21 caracteres

,.(0&<#":)"+9-+/~|i:8

Obrigado a FUZxxl pelo "+truque (acho que nunca usei u"vantes, heh).

Explicação

                  i:8  "steps" vector: _8 _7 _6 ... _1 0 1 ... 7 8
                 |     magnitude
              +/~      outer product using +
            9-         inverts the diamond so that 9 is in the center
  (      )"+           for each digit:
      #                  copy
   0&<                   if positive then 1 else 0
       ":                copies of the string representation of the digit
                         (in other words: filter out the strictly positive
                          digits, implicitly padding with spaces)
,.                     ravel each item of the result of the above
                       (necessary because the result after `#` turns each
                        scalar digit into a vector string)

Em vez de "0]escrever "+.
FUZxxl

Para um caractere a menos, escreva,.0(<#":)"+9-+/~|i:8
FUZxxl 11/11/2015

1
Aqui é a sua solução traduzido para 25 caracteres de APL:⍪↑{(0<⍵)/⍕⍵}¨9-∘.+⍨|9-⍳17
FUZxxl

25

APL ( 33 31)

A⍪1↓⊖A←A,0 1↓⌽A←⌽↑⌽¨⍴∘(1↓⎕D)¨⍳9

Se espaços que separam os números forem permitidos (como na entrada Mathematica), ele poderá ser reduzido para 28 26:

A⍪1↓⊖A←A,0 1↓⌽A←⌽↑⌽∘⍕∘⍳¨⍳9

Explicação:

  • (Programa longo :)
  • ⍳9: uma lista dos números de 1 a 9
  • 1↓⎕D: ⎕Dé a sequência '0123456789', 1↓remove o primeiro elemento
  • ⍴∘(1↓⎕D)¨⍳9: para cada elemento N de ⍳9, retire os primeiros N elementos de 1↓⎕D. Isso fornece uma lista: ["1", "12", "123", ... "123456789"] como seqüências de caracteres
  • ⌽¨: inverta cada elemento desta lista. ["1", "21", "321" ...]

  • (Programa curto :)

  • ⍳¨⍳9: a lista de 1 a N, para N [1..9]. Isso fornece uma lista [[1], [1,2], [1,2,3] ... [1,2,3,4,5,6,7,8,9]] como números.
  • ⌽∘⍕∘: o reverso da representação de string de cada uma dessas listas. ["1", "2 1" ...]
  • (O mesmo de agora em diante :)
  • A←⌽↑: cria uma matriz da lista de listas, preenchendo à direita com espaços e depois inverta isso. Isso fornece o quadrante superior do diamante. É armazenado em A.
  • A←A,0 1↑⌽A: A, com o reverso de A menos sua primeira coluna anexada à direita. Isso fornece a metade superior do retângulo. Isso é armazenado em A novamente.
  • A⍪1↓⊖A: ⊖Aé A espelhado verticalmente (dando a metade inferior), 1↓remove a linha superior da metade inferior e A⍪fica a metade superior em cima 1↓⊖A.

5
+1 Incrível. Você poderia traduzi-lo para nós analfabetos da APL?
12133

3
O código não-ascii não deve ser contado em UTF-8 em vez de pontos de código? Isso levaria a APL para mais perto de seus parentes terrestres.
John Dvorak

5
@JanDvorak Não, pois existe uma página de código APL , que cabe o conjunto de caracteres inteiro em um único byte. Mas acho que você provavelmente já descobriu isso em algum momento desde 2013.;)
Martin Ender

23

Clojure, 191 179 bytes

#(loop[[r & s](range 18)h 1](print(apply str(repeat(if(< r 8)(- 8 r)(- r 8))\ )))(doseq[m(concat(range 1 h)(range h 0 -1))](print m))(println)(if s(recur s((if(< r 8)inc dec)h))))

-12 bytes, alterando o externo doseqpara a loop, o que me permitiu me livrar do atom(yay).

Um duplo "for-loop". O loop externo ( loop) passa por cada linha, enquanto o loop interno ( doseq) passa por cada número da linha, que está no intervalo (concat (range 1 n) (range n 0 -1)), onde né o número mais alto da linha.

(defn diamond []
  (let [spaces #(apply str (repeat % " "))] ; Shortcut function that produces % many spaces
    (loop [[row-n & r-rows] (range 18) ; Deconstruct the row number from the range
           high-n 1] ; Keep track of the highest number that should appear in the row
      (let [top? (< row-n 8) ; Are we on the top of the diamond?
            f (if top? inc dec) ; Decided if we should increment or decrement
            n-spaces (if top? (- 8 row-n) (- row-n 8))] ; Calculate how many prefix-spaces to print
        (print (spaces n-spaces)) ; Print prefix-spaces
        (doseq [m (concat (range 1 high-n) (range high-n 0 -1))] ; Loop over the row of numbers
          (print m)) ; Print the number
        (println)

        (if r-rows
          (recur r-rows (f high-n)))))))

Devido a um erro na lógica da minha primeira tentativa (inserindo acidentalmente os espaços de prefixo entre cada número), consegui o seguinte:

1
1       2       1
1      2      3      2      1
1     2     3     4     3     2     1
1    2    3    4    5    4    3    2    1
1   2   3   4   5   6   5   4   3   2   1
1  2  3  4  5  6  7  6  5  4  3  2  1
1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
12345678987654321
1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1
1  2  3  4  5  6  7  8  9  8  7  6  5  4  3  2  1
1   2   3   4   5   6   7   8   7   6   5   4   3   2   1
1    2    3    4    5    6    7    6    5    4    3    2    1
1     2     3     4     5     6     5     4     3     2     1
1      2      3      4      5      4      3      2      1
1       2       3       4       3       2       1
1        2        3        2        1
1         2         1

Nem mesmo correto, ignorando o bug óbvio, mas parecia legal.


20

Mathematica 83 49 43 54 51

Print@@#&/@(Sum[k~DiamondMatrix~17,{k,0,8}]/.0->" ")

formatação melhorada


Com 3 bytes salvos, graças a Kelly Lowder.

Análise

A parte principal do código ,,Sum[DiamondMatrix[k, 17], {k, 0, 8}] pode ser verificada no WolframAlpha .

A seguir, é mostrada a lógica subjacente da abordagem, em uma escala menor.

a = 0~DiamondMatrix~5;
b = 1~DiamondMatrix~5;
c = 2~DiamondMatrix~5;
d = a + b + c;
e = d /. 0 -> "";
Grid /@ {a, b, c, d, e}

grades


1
David, você me venceu desta vez! :-)
Mr.Wizard

1
Outra tentativa (55 caracteres):f = Table[# - Abs@k, {k, -8, 8}] &; f[f[9]] /. n_ /; n < 1 -> "" // Grid
DavidC 22/03

Ainda outro (71 caracteres):Table[9 - ManhattanDistance[{9, 10}, {j, k}], {j, 18}, {k, 18}] /. n_ /; n < 1 -> "" // Grid
DavidC 22/03

2
Grid@#@#@9&[Table[#-Abs@k,{k,-8,8}]&]/.n_/;n<1->""50 caracteres.
chyanog

Uma exibição visual do código:ArrayPlot[Sum[k~DiamondMatrix~17, {k, 0, 8}], AspectRatio -> 2]
DavidC 23/11

15

Python 2, 72 69 67 61

Não inteligente:

s=str(111111111**2)
for i in map(int,s):print'%8s'%s[:i-1]+s[-i:]

1
não funciona no Python 3+, o que requer parens em torno dos argumentos para imprimir :(
Griffin

7
@ Griffin: No código de golfe, escolho Python 2 ou Python 3, dependendo se eu preciso da impressão para ser uma função.
Steven Rumbalski

3
s=`0x2bdc546291f4b1`
gnibbler

1
@gnibbler. Sugestão muito inteligente. Infelizmente, o repr desse hexadecimal inclui um final 'L'.
9118 Steven Rumbalski em 15/10

1
@gnibbler: Funciona em Python executando em plataformas de 64 bits, mas não em plataformas de 32 bits.
precisa

14

C, 79 caracteres

v;main(i){for(;i<307;putchar(i++%18?v>8?32:57-v:10))v=abs(i%18-9)+abs(i/18-8);}

4
Explicação, por favor?
Lucas Henrique

1
@LucasHenrique Total de 307 caracteres. i% 18-9 é o valor x no plano cartesiano que se espelha no eixo y. i / 18-8 é o valor y no plano cartesiano que se espelha no eixo x. Resumi-los em conjunto para obter 1: 1 diagonal (que causa a mudança numérica para formar em 1:... 1 diamante (32:57) -v é valor numérico UNICHAR para ASCII 0-9 10 nova linha
Albert Renshaw


12

GolfScript, 33 31 30 caracteres

Outra solução GolfScript

17,{8-abs." "*10@-,1>.-1%1>n}%

Obrigado a @ PeterTaylor por outro char.

Versões Previos:

17,{8-abs" "*9,{)+}/9<.-1%1>+}%n*

( online )

17,{8-abs" "*9,{)+}/9<.-1%1>n}%

1
Você não precisa os espaços à direita (o texto da pergunta não tê-los), então você pode pular adicionando os números para os espaços e salvar um caractere como17,{8-abs." "*10@-,1>.-1%1>n}%
Peter Taylor

12

Mathematica 55 50 45 41 38

(10^{9-Abs@Range[-8,8]}-1)^2/81//Grid

Grid[(10^Array[{9}-Abs[#-9]&,17]-1)^2/81]

Gráficos do Mathematica


1
Muito bom trabalho.
22413 DavidC

@DavidCarraher Obrigado: D
chyanog 23/03

Eu ecoo o comentário de David. Como você chegou a isso?
Mr.Wizard

Posso atualizar sua resposta com a modificação mais curta que escrevi?
Mr.Wizard

@ Mr.Wizard Certamente.
chyanog

10

Javascript, 114

Minha primeira entrada no Codegolf!

for(l=n=1;l<18;n-=2*(++l>9)-1,console.log(s+z)){for(x=n,s="";x<9;x++)z=s+=" ";for(x=v=1;x<2*n;v-=2*(++x>n)-1)s+=v}

Se isso puder ser reduzido, por favor, comente :)


droga!! Perdi o espaço e fiz meio diamante. Preciso dormir agora
Joomler

9

PHP, 92 90 caracteres

<?for($a=-8;$a<9;$a++){for($b=-8;$b<9;){$c=abs($a)+abs($b++);echo$c>8?" ":9-$c;}echo"\n";}

Calcula e imprime a distância de Manhattan da posição do centro. Imprime um espaço se for menor que 1.

Um usuário anônimo sugeriu a seguinte melhoria (84 caracteres):

<?for($a=-8;$a<9;$a++,print~õ)for($b=-8;$b<9;print$c>8?~ß:9-$c)$c=abs($a)+abs($b++);

O segundo não funciona.
Christian

Sei que é muito tarde, mas sempre preciso jogar golfe quando vejo scripts PHP. 83 bytes com <?saltado por meta . Além disso, você parece ter alguns problemas de codificação no segundo código.
RedClover

@Saku O segundo não é meu. Foi sugerido como uma edição da minha resposta por um usuário anônimo. Acabei de adicioná-lo sem verificar - não sei ao certo por que o usuário não publicou apenas como sua própria tentativa. A meta questão adia essa resposta em quase 3 anos.
Gareth

Eu quis dizer que não incluo <?no bytecount. Também fiz outras melhorias.
RedClover

8

Carvão (não concorrente), 13 bytes

Não está competindo porque o idioma é (muito) mais novo que a questão.

F⁹«GX⁻⁹ιI⁺ι¹→

Experimente online!

Quão?

Desenha nove diamantes numéricos concêntricos sucessivamente menores, um em cima do outro:

F⁹«   Loop ι from 0 to 8:
GX     Draw a (filled) polygon with four equilateral diagonal sides
⁻⁹ι      of length 9-ι
I⁺ι¹    using str(ι+1) as the character
→       Move right one space before drawing the next one

4
Agora, isso deve estar competindo de acordo com o novo consenso na meta.
officialaimm

7

Lisp comum, 113 caracteres

(defun x(n)(if(= n 0)1(+(expt 10 n)(x(1- n)))))(dotimes(n 17)(format t"~17:@<~d~>~%"(expt(x(- 8(abs(- n 8))))2)))

Primeiro notei que os elementos do diamante podiam ser expressos assim:

  1   =   1 ^ 2
 121  =  11 ^ 2
12321 = 111 ^ 2

etc.

xcalcula recursivamente a base (1, 11, 111, etc), que é ao quadrado e depois impressa centralizada por format. Para fazer os números subirem para o termo mais alto e recuar novamente, eu costumava (- 8 (abs (- n 8)))evitar um segundo loop


7

JavaScript, 81

for(i=9;--i+9;console.log(s))for(j=9;j;s=j--^9?k>0?k+s+k:" "+s:k+"")k=i<0?j+i:j-i

6

PowerShell (2 opções): 92 84 45 bytes

1..8+9..1|%{' '*(9-$_)+[int64]($x='1'*$_)*$x}
1..9+8..1|%{' '*(9-$_)+[int64]($x='1'*$_)*$x}

Graças ao Strigoides pela dica de usar 1 ^ 2,11 ^ 2,111 ^ 2 ...


Raspou alguns caracteres por:

  • Eliminando $w.
  • Aninhada a definição de $xno lugar de seu primeiro uso.
  • Pegou algumas pistas da solução de Rynant :
    • Combinadas as matrizes inteiras com, em +vez de ,permitir a eliminação dos parênteses em torno das matrizes e uma camada de aninhamento nos loops.
    • Usado 9-$_para calcular o tamanho dos espaços necessários, em vez de métodos matemáticos e de objetos mais complicados. Isso também eliminou a necessidade de $y.

Explicação:

1..8+9..1ou 1..9+8..1gera uma matriz de números inteiros ascendendo de 1 a 9 e depois retornando a 1.

|%{... }canaliza a matriz inteira em um ForEach-Objectloop por meio do alias embutido %.

' '*(9-$_)+ subtrai o número inteiro atual de 9 e, em seguida, cria uma sequência de muitos espaços no início da saída para esta linha.

[int64]($x='1'*$_)*$xdefine $xcomo uma sequência de 1s, desde que o número inteiro atual seja grande. Em seguida, é convertido em int64 (necessário para gerar corretamente 111111111 2 sem usar a notação E) e ao quadrado.

insira a descrição da imagem aqui


1
Você pode salvar um byte por vazamento a um long, em vez deint64
Veskah

Outra maneira de salvar um byte1..8+9..1|%{' '*(9-$_)+ +($x='1'*$_+'L')*$x}
mazzy

5

Vim, 62 39 38 pressionamentos de tecla

Obrigado a @DJMcMayhem por salvar uma tonelada de bytes!

Minha primeira resposta Vim, tão emocionante!

i12345678987654321<ESC>qqYP9|xxI <ESC>YGpHq7@q

Tentei escrever os números através de uma gravação, mas é muito mais longo

Experimente online!

Explicação:

i123 ... 321<ESC>                   Write this in insert mode and enter normal mode
qq                                  Start recording into register q
  YP                                Yank this entire line and Paste above
    9|                              Go to the 9th column
      xx                            Delete character under cursor twice
        I <ESC>                     Go to the beginning of the line and insert a space and enter normal mode
               Y                    Yank this entire line
                G                   Go to the last line
                 p                  Paste in the line below
                  H                 Go to the first line
                   q                End recording
                    7@q             Repeat this 7 times

EDITAR:

Eu usei em Hvez de gge salvei 1 byte


Você pode excluir mae alterar `ai<space>para I<space>.
DJMcMayhem

Além disso, você provavelmente pode excluir o estágio 3 se alterar o estágio 1 para colar acima e abaixo.
DJMcMayhem

@DJMcMayhem Obrigado pela sugestão! Inicialmente, eu estava pensando em introduzir um novo registro para os bits copiados, mas isso é muito mais curto!
Kritixi Lithos

5

APL (Dyalog Classic) , 20 19 bytes

(⍉⊢⍪1↓⊖)⍣2⌽↑,⍨\1↓⎕d

Experimente online!

⎕d são os dígitos '0123456789'

1↓solte o primeiro ( '0')

,⍨\ varredura de catenação trocada, ou seja, os prefixos invertidos '1' '21' '321' ... '987654321'

misture em uma matriz preenchida com espaços:

1
21
321
...
987654321

inverter a matriz horizontalmente

(... )⍣2faça isso duas vezes:

⍉⊢⍪1↓⊖a transposição ( ) da própria matriz ( ) concatenada verticalmente ( ) com a matriz verticalmente invertida ( ) sem sua primeira linha ( 1↓)


4

R, 71 caracteres

Para os registros:

s=c(1:9,8:1);for(i in s)cat(rep(" ",9-i),s[0:i],s[(i-1):0],"\n",sep="")

+1 - pode economizar alguns commessage(rep(" ",9-i),s[c(1:i,i:1-1)])
flodel

@flodel você tem que observar que que imprime para stderr, e você também pode fazer for(i in s<-c(1:9,8:1))...para salvar um byte
Giuseppe


4

k ( 64 50 caracteres)

-1'(::;1_|:)@\:((|!9)#'" "),'$i*i:"J"$(1+!9)#'"1";

Método antigo:

-1',/(::;1_|:)@\:((|!9)#\:" "),',/'+(::;1_'|:')@\:i#\:,/$i:1+!9;


(1+!9)#'"1"is,\9#"1"
ngn

4

CJam, 31 27 bytes

O CJam é muito mais recente que esse desafio, portanto, essa resposta não é elegível para ser aceita. Este foi um pequeno desafio à noite de sábado, no entanto. ;)

8S*9,:)+9*9/2%{_W%1>+z}2*N*

Teste aqui.

A idéia é formar primeiro o quadrante superior esquerdo. Aqui está como isso funciona:

Primeiro, forme a string " 123456789"usando 8S*9,:)+. Esta cadeia tem 17 caracteres. Agora, repetimos a sequência 9 vezes e depois a dividimos em substrings de comprimento 9 com 9/. A incompatibilidade entre 9 e 17 compensará todas as outras linhas um caractere à esquerda. Imprimindo cada substring em sua própria linha, obtemos:

        1
23456789 
       12
3456789  
      123
456789   
     1234
56789    
    12345
6789     
   123456
789      
  1234567
89       
 12345678
9        
123456789

Portanto, se simplesmente soltarmos todas as outras linhas (o que funciona convenientemente 2%), obteremos um quadrante conforme desejado:

        1
       12
      123
     1234
    12345
   123456
  1234567
 12345678
123456789

Finalmente, espelhamos isso duas vezes, transpondo a grade no meio para garantir que as duas operações de espelhamento sigam eixos diferentes. O espelhamento em si é apenas

_      "Duplicate all rows.";
 W%    "Reverse their order.";
   1>  "Discard the first row (the centre row).";
     + "Add the other rows.";

Por fim, apenas juntamos todas as linhas com novas linhas, com N*.


3

GolfScript, 36 caracteres

Supondo que isso seja um desafio ao , aqui está uma solução básica do GolfScript:

9,.);\-1%+:a{a{1$+7-.0>\" "if}%\;n}%

3

Ruby, 76 caracteres

def f(a)a+a.reverse[1..-1]end;puts f [*1..9].map{|i|f([*1..i]*'').center 17}

Melhorias são bem-vindas. :)


1
69 caracteres:f=->x{[*1..x]+[*1...x].reverse};puts f[9].map{|i|(f[i]*'').center 17}
Patrick Oscity

Ótimo comentário, eu não conhecia o '...' e não entendia como isso poderia funcionar.
GB

60 caracteres:[*-8..8].map{|i|puts' '*i.abs+"#{eval [?1*(9-i.abs)]*2*?*}"}
GB

3

Befunge-93 , 155 caracteres

9:v:<,+55<v5*88<v-\9:$_68v
> v>     ^>3p2vpv  -1<!  *
, 1^  2p45*3+9<4:    ,:  +
g -^_75g94+4pg7^!    +^ ,<
1 : ^ `0    :-1$_:68*^$
^1_$:55+\-0\>:#$1-#$:_^

Experimente online!

Definitivamente poderia ser mais jogado, mas é o meu primeiro programa Funge e minha cabeça já está doendo. Nos divertimos muito,


3

JavaScript, 170 bytes

Meu primeiro código de golfe :)

Golfe

a="";function b(c){a+=" ".repeat(10-c);for(i=1;i<c;i++)a+=i;for(i=2;i<c;i++)a+=c-i;a+="\n";}for(i=2;i<11;i++)b(i);for(i=9;i>1;i--)b(i);document.write("<pre>"+a+"</pre>");

Ungolfed

var str = "";
function row(line) {
    str += " ".repeat(10 - line);
    for (var i = 1; i < line; i++) {
        str += i;
    }
    for (var i = 2; i < line; i++) {
        str += line - i;
    }
    str += "\n";
}
for (var line = 2; line < 11; line++) {
    row(line);
}
for (var line = 9; line > 1; line--) {
    row(line);
}
document.write("<pre>" + str + "</pre>");

Bem-vindo ao PPCG!
21

2

Perl 56 54 caracteres

Adicionado 1 caractere para o -pswitch.

Usa repunhas ao quadrado para gerar a sequência.

s//12345678987654321/;s|(.)|$/.$"x(9-$1).(1x$1)**2|eg

2

Perl, 43 + 1

adicionando +1 para o -Equal é necessário parasay

say$"x(9-$_).(1x$_)**2for 1..9,reverse 1..8

editar: encurtou um pouco


2

Python, 65

for i in map(int,str(int('1'*9)**2)):print' '*(9-i),int('1'*i)**2

Tente anexar I=int;seu código e substituir todas as instâncias subseqüentes de intporI
Cyoce

@ Cyoce eu tinha pensado nisso. Ele salvou 2 caracteres cada vez que inté usado e é usado 3 vezes, portanto, salva 6 caracteres a um custo de 6 caracteres.
cardboard_box

2

Groovy 77 75

i=(-8..9);i.each{a->i.each{c=a.abs()+it.abs();print c>8?' ':9-c};println""}

versão antiga:

(-8..9).each{a->(-8..9).each{c=a.abs()+it.abs();print c>8?' ':9-c};println""}

adicionou uma solução de 57 carbonos. Você pode substituir ambos eachpor anypara salvar dois caracteres.
Matias Bjarland

2

Scala - 86 caracteres

val a="543210/.-./012345";for(i<-a){for(j<-a;k=99-i-j)print(if(k<1)" "else k);println}

2

Javascript, 137

Com recursão:

function p(l,n,s){for(i=l;i;s+=" ",i--);for(i=1;i<=n;s+=i++);for(i-=2;i>0;s+=i--);return(s+="\n")+(l?p(l-1,n+1,"")+s:"")}alert(p(8,1,""))

Primeira vez em CG :)

Ou 118

Se eu conseguir encontrar uma implementação JS que seja executada 111111111**2com maior precisão.
(Aqui: 12345678987654320).

a="1",o="\n";for(i=0;i<9;i++,o+="         ".substr(i)+a*a+"\n",a+="1");for(i=8;i;i--)o+=o.split("\n")[i]+"\n";alert(o)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.