Распечатать этот бриллиант


76

Этот вопрос распространяется как вирус в моем офисе. Есть довольно разные подходы:

Распечатайте следующее:

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

Ответы оцениваются в символах с меньшим количеством символов, которые лучше.


4
Какой критерий выигрыша? И это вызов или гольф?
Пол Р

21
Я читал «Колмогоров-Сложность» как «Код-Гольф».
DavidC

1
@DavidCarraher "kolmogorov-сложно" был отредактирован после того, как вопрос был задан. Исходный вопросник еще не определил критерии победы.
Гарет

@Gareth Мой комментарий был сделан после добавления тега "kolmogorov-сложно", но до добавления тега "code-golf". В то время люди все еще задавались вопросом, было ли это вопросом игры в гольф.
DavidC

3
perlmonks.com/?node_id=891559 имеет решения Perl.
b_jonas

Ответы:


24

J, 29 26 24 23 22 21 символов

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

Спасибо FUZxxl за "+трюк (я не думаю, что когда-либо использовал u"vраньше, хе).

объяснение

                  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)

Вместо того "0], чтобы писать "+.
FUZxxl

Для менее одного символа, напишите,.0(<#":)"+9-+/~|i:8
FUZxxl

1
Вот ваше решение, переведенное на 25 символов APL:⍪↑{(0<⍵)/⍕⍵}¨9-∘.+⍨|9-⍳17
FUZxxl

25

APL ( 33 31)

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

Если разрешены пробелы, разделяющие числа (как в записи Mathematica), его можно сократить до 28 26:

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

Объяснение:

  • (Длинная программа :)
  • ⍳9: список номеров от 1 до 9
  • 1↓⎕D: ⎕Dэто строка '0123456789', 1↓удаляет первый элемент
  • ⍴∘(1↓⎕D)¨⍳9: для каждого элемента N из ⍳9взять первые N элементов из 1↓⎕D. Это дает список: ["1", "12", "123", ... "123456789"] как строки
  • ⌽¨: перевернуть каждый элемент этого списка. ["1", "21", "321" ...]

  • (Короткая программа :)

  • ⍳¨⍳9: список от 1 до N для N [1..9]. Это дает список [[1], [1,2], [1,2,3] ... [1,2,3,4,5,6,7,8,9]] в виде чисел.
  • ⌽∘⍕∘: обратная сторона строкового представления каждого из этих списков. ["1", "2 1" ...]
  • (То же самое отныне :)
  • A←⌽↑: создает матрицу из списка списков, дополняет ее пробелами справа, а затем наоборот. Это дает верхний сектор алмаза. Хранится в А.
  • A←A,0 1↑⌽A: A, с обратным знаком A минус его первый столбец, прикрепленный справа. Это дает верхнюю половину прямоугольника. Это затем сохраняется в A снова.
  • A⍪1↓⊖A: ⊖AЗеркально отражается вертикально (давая нижнюю половину), 1↓удаляет верхний ряд нижней половины и A⍪является верхней половиной сверху 1↓⊖A.

5
+1 Удивительно. Не могли бы вы перевести это для нас неграмотных APL?
DavidC

3
Разве не код ascii должен учитываться в кодировке UTF-8 вместо кодовых точек? Это подтолкнет APL ближе к его земным родственникам.
Джон Дворжак

5
@JanDvorak Нет, поскольку существует кодовая страница APL , которая помещает весь набор символов в один байт. Но я думаю, что вы, наверное, поняли это в какой-то момент с 2013 года.;)
Мартин Эндер

23

Clojure, 191 179 байт

#(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 байт, изменив внешнее doseqна a loop, что позволило мне избавиться от atom(yay).

Двойной «для петли». Внешний цикл ( loop) проходит по каждой строке, в то время как внутренний цикл ( doseq) проходит по каждому числу в строке, которая находится в диапазоне (concat (range 1 n) (range n 0 -1)), где nнаходится наибольшее число в строке.

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

Из-за ошибки в логике в моей первой попытке (случайно вставив вместо каждого из них префиксные пробелы), мне удалось получить это:

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

Даже не правильно игнорировать очевидную ошибку, но она выглядела круто.


20

Mathematica 83 49 43 54 51

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

улучшено форматирование


С 3 байтами сохранены благодаря Келли Лоудер.

Анализ

Основная часть кода Sum[DiamondMatrix[k, 17], {k, 0, 8}], может быть проверена на WolframAlpha .

Ниже показана основная логика подхода в меньшем масштабе.

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}

сетки


1
Дэвид, ты победил меня на этот раз! :-)
Mr.Wizard

1
Еще одна попытка (55 символов):f = Table[# - Abs@k, {k, -8, 8}] &; f[f[9]] /. n_ /; n < 1 -> "" // Grid
DavidC

Еще один (71 символ):Table[9 - ManhattanDistance[{9, 10}, {j, k}], {j, 18}, {k, 18}] /. n_ /; n < 1 -> "" // Grid
DavidC

2
Grid@#@#@9&[Table[#-Abs@k,{k,-8,8}]&]/.n_/;n<1->""50 символов
Chyanog

Визуальное отображение кода:ArrayPlot[Sum[k~DiamondMatrix~17, {k, 0, 8}], AspectRatio -> 2]
DavidC

15

Python 2, 72 69 67 61

Не умно:

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

1
не работает в Python 3+, для печати которого требуются символы в скобках :(
Griffin

7
@ Гриффин: в коде гольф я выбираю Python 2 или Python 3 в зависимости от того, нужна ли мне печать, чтобы быть функцией.
Стивен Румбальски

3
s=`0x2bdc546291f4b1`
Гнибблер

1
@gnibbler. Очень умное предложение. К сожалению, отображение этого шестнадцатеричного числа включает в себя трейлинг 'L'.
Стивен Румбальски

1
@gnibbler: это работает в Python, работающем на 64-битных платформах, но не на 32-битных платформах.
Конрад Боровски

14

С, 79 символов

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
Пояснения пожалуйста?
Лукас Энрике

1
@LucasHenrique 307 символов всего. i% 18-9 - это значение x на декартовой плоскости, отражающей себя по оси y. i / 18-8 - это значение y на декартовой плоскости, отражающей себя по оси x. Суммируйте их вместе, чтобы получить диагональ 1: 1 (что приводит к формированию числового сдвига на ромбах 1: 1. (32:57) -v - это уникальное числовое значение для новой строки ASCII 0-9. 10.
Альберт Реншоу,

14

Python 2, 60 59

for n in`111111111**2`:print`int('1'*int(n))**2`.center(17)

Злоупотребления клюшки и повторы.


Пробел после inключевого слова может быть удален, как вы это сделали с printклавиатурой.
Конрад Боровски

@GlitchMr: Спасибо! Обновлено.
nneonneo

Я получаю дополнительно Lв середине семь строк вывода.
Стивен Румбальски

Вы не должны ... какую версию Python вы используете?
nneonneo

12

GolfScript, 33 31 30 символов

Другое решение GolfScript

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

Спасибо @PeterTaylor за другого персонажа .

Предыдущие версии:

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

( запустить онлайн )

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

1
Вам не нужны конечные пробелы (в тексте вопроса их нет), поэтому вы можете пропустить добавление чисел к пробелам и сохранить один символ как17,{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]

Математическая графика


1
Очень хорошая работа.
DavidC

@DavidCarraher Спасибо: D
Chyanog

Я повторяю замечание Дэвида. Как ты это придумал?
Mr.Wizard

Могу ли я обновить ваш ответ более короткой модификацией, которую я написал?
Мистер Волшебник,

@ Mr.Wizard Конечно.
Chyanog

10

Javascript, 114

Моя первая запись на 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}

Если это может быть сокращено дальше, пожалуйста, прокомментируйте :)


черт возьми!! Я пропустил пространство и сделал половину алмаза. Я должен спать сейчас
Joomler

9

PHP, 92 90 символов

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

Вычисляет и печатает манхэттенское расстояние от центра. Печатает пробел, если он меньше 1.

Анонимный пользователь предложил следующее улучшение (84 символа):

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

2-й не работает.
Кристиан

Я знаю, что уже очень поздно, но мне всегда нужно играть в гольф, когда я вижу скрипты PHP. 83 байта с <?пропущенным мета . Кроме того, у вас, похоже, есть проблемы с кодировкой во втором коде.
RedClover

@ Соаку Второй не мой. Это было предложено в качестве редактирования моего ответа анонимным пользователем. Я только добавил это без проверки - не совсем уверен, почему пользователь не просто опубликовал это как свою собственную попытку на самом деле. Этот мета вопрос ставит после этого ответа почти на 3 года.
Гарет

Я имел в виду, что я не включаю <?в список байтов. Я также сделал некоторые другие улучшения.
RedClover

8

Древесный уголь (неконкурентный), 13 байт

Не конкурировать, потому что язык (намного) новее, чем вопрос.

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

Попробуйте онлайн!

Как?

Рисует девять последовательно меньших концентрических числовых алмазов друг над другом:

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
Это должно теперь конкурировать в соответствии с новым консенсусом в мета.
officialaimm

7

Common Lisp, 113 символов

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

Сначала я заметил, что элементы бриллианта можно выразить так:

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

и т.п.

xРекурсивно вычисляет основание (1, 11, 111 и т. д.), которое возводится в квадрат, а затем печатается по центру format. Чтобы числа поднимались до максимального значения и снова возвращались, я использовал, (- 8 (abs (- n 8)))чтобы избежать второго цикла



6

PowerShell (2 варианта): 92 84 45 байт

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

Спасибо Strigoides за подсказку использовать 1 ^ 2,11 ^ 2,111 ^ 2 ...


Побрили некоторых персонажей:

  • Устраняя $w.
  • Вложено определение $xна место его первого использования.
  • Взял некоторые подсказки из решения Райнанта :
    • Объединение целочисленных массивов с +вместо ,которых позволяет исключить скобки вокруг массивов и слой вложения в циклы.
    • Используется 9-$_для вычисления необходимой длины пробелов вместо более сложных математических и объектных методов. Это также избавило от необходимости $y.

Объяснение:

1..8+9..1или 1..9+8..1генерирует массив целых чисел, возрастающих от 1 до 9, затем убывающих обратно до 1.

|%{... }передает целочисленный массив в ForEach-Objectцикл через встроенный псевдоним %.

' '*(9-$_)+ вычитает текущее целое число из 9, а затем создает строку с таким количеством пробелов в начале вывода для этой строки.

[int64]($x='1'*$_)*$xопределяет $xкак строку 1s, пока текущее целое число большое. Затем он преобразуется в int64 (требуется для правильного вывода 111111111 2 без использования E-записи) и возводится в квадрат.

введите описание изображения здесь


1
Вы можете сохранить байт, longint64
применив

Еще один способ сохранить байт1..8+9..1|%{' '*(9-$_)+ +($x='1'*$_+'L')*$x}
маззи

5

Vim, 62 39 38 нажатий клавиш

Спасибо @DJMcMayhem за сохранение тонны байтов!

Мой первый ответ Vim, так волнительно!

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

Я пытался записать числа через запись, но это намного дольше

Попробуйте онлайн!

Объяснение:

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

РЕДАКТИРОВАТЬ:

Я использовал Hвместо ggи сохранил 1 байт


Вы можете удалить maи изменить `ai<space>на I<space>.
DJMcMayhem

Кроме того, вы можете удалить этап 3, если измените этап 1 на вставку сверху и снизу.
DJMcMayhem

@DJMcMayhem Спасибо за предложение! Сначала я думал о введении нового регистра для скопированных битов, но это намного короче!
Критиси Литос

5

APL (Dyalog Classic) , 20 19 байтов

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

Попробуйте онлайн!

⎕d цифры '0123456789'

1↓брось первый ( '0')

,⍨\ Сканирование поменяно местами, т.е. обратные префиксы '1' '21' '321' ... '987654321'

смешать в матрицу с пробелами:

1
21
321
...
987654321

перевернуть матрицу по горизонтали

(... )⍣2сделать это дважды:

⍉⊢⍪1↓⊖транспозиция ( ) самой матрицы ( ), соединенная вертикально ( ) с вертикально инвертированной матрицей ( ) без ее первой строки ( 1↓)


4

R, 71 символов

Для записей:

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

+1 - может спасти несколько сmessage(rep(" ",9-i),s[c(1:i,i:1-1)])
flodel

@flodel вы должны заметить, что это печатает на stderr, и вы также можете сделать, for(i in s<-c(1:9,8:1))...чтобы сохранить байт
Giuseppe


4

к ( 64 50 символов)

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

Старый метод:

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


(1+!9)#'"1"это,\9#"1"
нгн

4

CJam, 31 27 байт

CJam намного новее, чем этот вызов, поэтому этот ответ не может быть принят. Это был аккуратный маленький субботний вечер, хотя. ;)

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

Проверьте это здесь.

Идея состоит в том, чтобы сначала сформировать верхний левый квадрант. Вот как это работает:

Сначала сформируйте строку " 123456789", используя 8S*9,:)+. Эта строка длиной 17 символов. Теперь мы повторяем строку 9 раз, а затем разбиваем ее на подстроки длиной 9 с 9/. Несоответствие между 9 и 17 сместит каждую строку на один символ влево. Распечатав каждую подстроку в отдельной строке, мы получим:

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

Так что, если мы просто отбрасываем все остальные строки (что удобно работает 2%), мы получаем один квадрант по желанию:

        1
       12
      123
     1234
    12345
   123456
  1234567
 12345678
123456789

Наконец, мы отражаем это дважды, переставляя сетку между ними, чтобы гарантировать, что две операции зеркального отображения идут вдоль разных осей. Само зеркалирование просто

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

Наконец, мы просто соединяем все строки с помощью новых строк, с N*.


3

GolfScript, 36 символов

Предполагая, что это подразумевается как вызов , вот базовое решение GolfScript:

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

3

Рубин, 76 знаков

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

Улучшения приветствуются. :)


1
69 символов:f=->x{[*1..x]+[*1...x].reverse};puts f[9].map{|i|(f[i]*'').center 17}
Патрик Осцити

Замечательный комментарий, я не знал «...» и не понимал, как это может работать.
GB

60 символов:[*-8..8].map{|i|puts' '*i.abs+"#{eval [?1*(9-i.abs)]*2*?*}"}
GB

3

Befunge-93 , 155 символов

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-#$:_^

Попробуйте онлайн!

Это определенно может быть больше в гольфе, но это моя первая программа Funge, и моя голова уже болит. Было очень весело, хотя


3

JavaScript, 170 байт

Мой первый код гольф :)

Golfed

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

Добро пожаловать в PPCG!
Евгений Новиков

2

Perl 56 54 персонажа

Добавлен 1 символ для -pпереключателя.

Использует воссоединения в квадрате для создания последовательности.

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

2

Perl, 43 + 1

добавление +1, для -Eкоторого требуетсяsay

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

редактировать: немного сокращен


2

Питон, 65

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

Попробуйте предваряя I=int;ваш код и заменить все последующие экземпляры intсI
Cyoce

@ Кайос, я думал об этом. Это позволит сэкономить 2 символа каждый раз, когда intон используется, и он используется 3 раза, поэтому он экономит 6 символов при стоимости 6 символов.
картонная

2

Groovy 77 75

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

старая версия:

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

добавлено 57 символов, отличное решение. Вы можете заменить и eachс , anyчтобы спасти двух символов.
Матиас Бьярланд


2

Javascript, 137

С рекурсией:

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

Первый раз на CG :)

Или 118

Если я могу найти реализацию JS, которая выполняется 111111111**2с более высокой точностью.
(Здесь: 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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.