Построить полузигзаг


29

Вам будет дано положительное целое число в Nкачестве входных данных. Ваша задача - построить полу-зигзаг из Nсторон, каждой длины N. Поскольку довольно сложно четко описать задачу, вот несколько примеров:

  • N = 1:

    О
    
  • N = 2:

    О
     OO
    
  • N = 3:

    OO
     OO
      ООО
    
  • N = 4:

    OOOOO
     OO
      OO
       ОООО
    
  • N = 5:

    OOOOOO
     ООО
      ООО
       ООО
        OOOOOO
    
  • N = 6:

    ООООООО
     ООО
      ООО
       ООО
        ООО
         OOOOOOOOOOOO
    
  • N = 7:

    OOOOOOOOO
     ОООО
      ОООО
       ОООО
        ОООО
         ОООО
          OOOOOOOOOOOOOO
    
  • Большой тестовый набор с N = 9

Как вы можете видеть, полузигзаг состоит из чередующихся диагональных и горизонтальных линий, и он всегда начинается с диагональной линии слева направо сверху вниз. Обратите внимание, что символы на горизонтальных линиях разделены пробелом.

правила

  • Вы можете выбрать любой непробельный символ вместо O, он может даже быть непоследовательным.

  • Вы можете вывести / вернуть результат в виде строки или в виде списка строк, каждая из которых представляет одну строку .

  • У вас может быть завершающий или ведущий символ новой строки.

  • Применяются стандартные лазейки .

  • Вы можете принимать входные данные и предоставлять выходные данные любым стандартным способом .

  • Если возможно, пожалуйста, добавьте ссылку на тестирование в ваше сообщение. Я буду приветствовать любой ответ, который показывает усилия в гольф и имеет объяснение.

  • Это , поэтому выигрывает самый короткий код в байтах на каждом языке !



Должны ли мы поместить пробелы между O, которые горизонтальны?
HatsuPointerKun

1
@HatsuPointerKun Обратите внимание, что символы на горизонтальных линиях разделены пробелом. - Да, вы должны поставить пробелы.
г-н Xcoder

1
О да. Я должен научиться читать. Спасибо
HatsuPointerKun

1
@JohnHamilton Ответы теоретически должны работать для любого числа, указанного в качестве входного. Они не должны беспокоиться о том, что экран может держать.
г-н Xcoder

Ответы:


10

Древесный уголь , 24 байта

FN«↶§7117ι×⁺#× ﹪ι²⁻Iθ¹»#

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

-5 спасибо Нейлу .

АСТ:

Program
├F: For
│├N: Input number
│└Program
│ ├↶: Pivot Left
│ │└§: At index
│ │ ├'7117': String '7117'
│ │ └ι: Identifier ι
│ └Print
│  └×: Product
│   ├⁺: Sum
│   │├'#': String '#'
│   │└×: Product
│   │ ├' ': String ' '
│   │ └﹪: Modulo
│   │  ├ι: Identifier ι
│   │  └2: Number 2
│   └⁻: Difference
│    ├I: Cast
│    │└θ: Identifier θ
│    └1: Number 1
└Print
 └'#': String '#'

Это было слишком легко для древесного угля :)
Mr. Xcoder

@ Mr.Xcoder Чувствуется, что это действительно не так уж и плохо ... не уверен, как играть в гольф.
Эрик Outgolfer

ОП сказал, что символ может быть любым и не должен быть последовательным, поэтому я собирался сделать что-то вроде FN§⟦↘→↗→⟧ι⁻Iθ¹→(только 15 байт), но списки направлений, похоже, не сработали в Charcoal. Жалость.
Чарли

@CarlosAlejo Пробовал это тоже, но, к сожалению, это не работает.
Эрик Outgolfer

1
@CarlosAlejo FN✳§⟦↘→↗→⟧ι⁻θ¹Oбудет работать после того, как Деннис потянет в направлении
только ASCII

7

Python 2 , 157 153 байта

n=input()
o,s=q='O '
def p(k,t=q*n+s*(4*n-6)):print(t*n)[k*~-n:][:n*3/2*~-n+1]
p(2)
for i in range(n-2):p(0,i*s+s+o+s*(4*n-7-2*i)+o+s*(2*n+i-2))
n>1>p(5)

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

  • n*3/2*~-n+1 ширина каждой строки: n3n / 2⌋ · (n − 1) + 1 символ.
  • Строка q*n+s*(4*n-6)представляет верхнюю и нижнюю строки. Если мы повторим это и нарежем, [2*(n-1):]мы получим верхний ряд; если мы нарезаем, [5*(n-1):]мы получаем нижний ряд. Отсюда и определение pи призывы к p(2)и p(5). Но так как нам все равно нужны повторение и разрезание по длине строки для всех других строк, мы снова используем pв цикле.
  • Это i*s+s+o+…просто скучное выражение для средних рядов.
  • n>1>p(5)будет короткое замыкание, если n≯1, не вызывая p(5)оценки. Следовательно, это сокращение для if n>1:p(5).

Вау, отличное решение, такое умное. Вы заработали мое возражение
мистер Xcoder

Ничего себе, никогда не знал, что у Питона было короткое замыкание при таких сравнениях, +1.
Захари

6

Mathematica, 126 125 121 112 104 89 86 байт

(m=" "&~Array~{#,#^2-#+1};Do[m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X",{j,#},{i,#}];m)&
  • #номер входа для анонимной функции (завершается финалом &).
  • m=" "&~Array~{#,#^2-#+1};создает матрицу пространственных символов правильного размера, заполняя массив заданных измерений #,#^2-#+1выходными данными постоянной анонимной функции «вывести пробел» " "&.
  • Do[foo,{j,#},{i,#}]представляет собой пару вложенных циклов делать, где jдиапазоны от 1к #и внутри этого iдиапазона от 1до #.
  • m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X"устанавливает соответствующую часть матрицы как символ Xна основе jи i. -iИспользует отрицательную индексацию , чтобы сохранить байты из #-i+1. (Я забыл написать, Mod[j,4]как j~Mod~4в оригинальной версии этого кода.) Jenny_mathy указала, что мы можем использовать модульный остаток для индексации в списке напрямую (а не использовать Switch) для сохранения 9 байтов, а JungHwan Min отметил, что мы не ' не нужно использовать, ReplacePartтак как мы можем установить часть массива, которая 1[i,#,-i][[j~Mod~4]]использует странное поведение и общность [[foo]]для сохранения байтов{1,i,#,-i}[[j~Mod~4+1]]
  • Так как мета установила, что список символов является строкой (как указал JungHwan Min ), нам не нужно отображать какие-либо функции по строкам матрицы символов, поскольку это уже список «строк».

Вы можете проверить это в изолированной программной среде Wolfram Cloud , вставив код, подобный следующему, и нажав Shift + Enter или цифровую клавишу Enter:

(m=" "&~Array~{#,#^2-#+1};Do[m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X",{j,#},{i,#}];m)&@9//MatrixForm

1
Очень хорошо! Вы можете заменить StringJoin на "" <> # &, чтобы сохранить 4 байта
J42161217

@Jenny_mathy Спасибо за совет! Это кажется довольно полезным.
Марк С.

2
Вы также можете заменить Switch [...] на {1, i, #, - i} [[j ~ Mod ~ 4 + 1]] и сохранить 9 байтов!
J42161217,

1
Вам на самом деле не нужно ReplacePartздесь. m=ReplacePart[...]может быть m[[{1,i,#,-i}[[j~Mod~4+1]],j#-#+i+1-j]]="X"- Вы можете из списка. Это избавляет от 15 байтов. SetPart
Юнг Хван Мин

1
{1,i,#,-i}[[j~Mod~4+1]]тоже может быть 1[i,#,-i][[j~Mod~4]]. Этот трюк работает, потому что [[0]]возвращает Headвыражение.
Юнг Хван Мин

4

C ++, 321 234 байта

-87 байт благодаря Захари

#include<vector>
#include<string>
auto z(int n){std::vector<std::string>l;l.resize(n,std::string(n*n+n/2*(n-1),32));l[0][0]=79;int i=0,j,o=0;for(;i<n;++i)for(j=1;j<n;++j)l[i%4?i%4-1?i%4-2?0:n-j-1:n-1:j][i*n+j-i+(o+=i%2)]=79;return l;}

Возвращает вектор строк


Я получил его до 318 байт: repl.it/JpJ2
Захари

Исправление, я уменьшил его до 239 байт : repl.it/JpJ2/1
Захари

Извините за спам, 234 байта: repl.it/JpJ2/3
Захари

1
Что я могу сказать, кроме как пожалуйста!
Захари

@ Zacharý большое спасибо, сэр
HatsuPointerKun

4

Mathematica, 179 байтов

Rotate[(c=Column)@(t=Table)[{c@(a=Array)[" "~t~#<>(v="o")&,z,0],c@t[t[" ",z-1]<>v,z-1],c@a[t[" ",z-2-#]<>v&,z-1,0],c@t[v,z-Boole[!#~Mod~4<1]-1]}[[i~Mod~4+1]],{i,0,(z=#)-1}],Pi/2]&

редактировать для @JungHwanMin


Я не ожидал, что это будет так коротко, молодец!
г-н Xcoder

Просто вопрос: Mod[z,4]==0можно заменить на Mod[z,4]<1?
г-н Xcoder

да, я могу немного
J42161217

3
Я действительно не знаю , Mathematica, но вы можете заменить Mod[#,4]с #~Mod~4на -1 байт?
г-н Xcoder

1
Упс ... случайно понизили. Не могли бы вы отредактировать ответ, чтобы я перевернул его?
JungHwan Мин

4

05AB1E , 21 20 19 байтов

Код

Использует новый режим холста:

Fx<)Nè'ONÉúR3212NèΛ

Использует кодировку 05AB1E . Попробуйте онлайн!

Объяснение:

F                      # For N in range(0, input)
 x<)                   #   Push the array [input, 2 × input - 1]
    Nè                 #   Retrieve the Nth element
      'ONÉúR           #   Push "O" if N is odd, else "O "
            3212Nè     #   Retrieve the Nth element of 3212
                  Λ    #   Write to canvas

Для ввода 6 это дает следующие аргументы (в том же порядке) для холста:

[<num>, <fill>, <patt>]
[6,     'O',     3]
[11,    'O ',    2]
[6,     'O',     1]
[11,    'O ',    2]
[6,     'O',     3]
[11,    'O ',    2]

Чтобы объяснить, что делает холст, мы выбираем первый набор аргументов из списка выше.

Число 6 определяет длину строки, которая будет записана на холсте. Наполнитель используется для записи на холсте, который в данном случае является O. Он циклически проходит через строку наполнителя. Направление строки определяется последним аргументом, направлением. Направления:

7  0  1
 \ | /
6- X -2
 / | \
5  4  3

Это означает, что 3 устанавливает направление на юго-восток , что также можно попробовать онлайн .


Также обратите внимание, что режим холста находится в
Adnan

: O 05AB1E мутирует в древесный уголь (также это бьется древесный уголь O_o)
только ASCII

@ ASCII-only Да, я видел рост всех языков на основе ASCII (Древесный уголь, SOGL, V и т. Д.) И увидел, как 05AB1E утонул в фоновом режиме, поэтому мне пришлось с этим что-то делать: p
Adnan

так ты копировал уголь? : P 05ab1e даже имеет холст и направленную печать (хотя древесный уголь поддерживает только этот стиль печати с использованием длины через python)
только ASCII

2

SOGL V0.12 , 36 байт

╝.H∫2\?.╝}F2%?№@.┌Ο};1w⁄Hh1ž}.4%1>?№

Попробуй здесь!

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

╝                                     get a diagonal from the bottom-left corner with the length of the input - the starting canvas
 .H∫                        }         for each number in the range [1,inp-1] do, pushing counter
    2\?  }                              if it divides by 2, then
       .╝                                 create another diagonal of the input
          F2%                           push counter % 2
             ?     }                    if that [is not 0]
              №                           reverse the current canvas upside down
               @.┌Ο                       get an alternation of spaces and dashes with the dash amount of the input length
                    ;                   get the canvas on top of the stack
                     1w⁄                get its 1st element length
                        H               decrease it
                         h              swap the bottom 2 items - the canvas is now at the bottom and the current addition ontop
                          1             push 1
                           ž            at 1-indexed coordinates [canvasWidth-1, 1] in the canvas insert the current part made by the Ifs
                             .4%1>?   if input%4 > 1
                                   №    reverse the array vertically

Если ввод 1 не разрешен, то ο.∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№тоже будет работать. Если бы случайные числа с плавающей точкой были разрешены, .∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№это тоже сработало бы. Если бы я не ленился и не реализовал , }F2%?можно было бы заменить на -4 байта


2

Mathematica, 106 87 байтов

SparseArray[j=i=1;k=#-1;Array[{j+=Im@i;k∣#&&(i*=I);j,#+1}->"o"&,l=k#+1,0],{#,l}," "]&

Возвращает SparseArrayобъект Strings. Чтобы визуализировать вывод, вы можете добавить Grid@. Выдает ошибку для случая 1, но это безопасно игнорировать.

объяснение

j=i=1

Установите iи j1.

k=#-1

Установите kдля ввода - 1.

l=k#+1

Установите lнаk*input + 1

Array[ ..., l= ...,0]

Итерируйте lвремя, начиная с 0, увеличивая 1каждый раз ...


j+=Im@i

Добавьте мнимый компонент iк j...

k∣#&&(i*=I)

Если текущая итерация делится на k, умножьте iна мнимую единицу ...

{... j,#+1}->"o"

Создайте Ruleобъект, который меняет элемент в позиции {j, current iteration + 1}на"o"


SparseArray[ ...,{#,l}," "]

Создайте SparseArrayобъект, используя сгенерированные Ruleобъекты, с измерением {input, l}, используя " "как пустое.

Попробуйте это на Wolfram Sandbox!


1
что-то не так с делом n = 3
J42161217

1
n = 2, 4,5,6 также есть проблемы с корректностью, но я думаю, что это работает для 7 и выше. Мне любопытно: есть ли прецедент относительно того, SparseArrayсчитается ли массив? Это можно визуализировать с помощью Gridили MatrixForm, но я бы не стал считать это списком строк. Если двумерного массива символов достаточно, это отсекает 8 байтов моего решения (например, 12 до помощи Jenny_mathy).
Марк С.

1
@Метки. Кроме того, массив строк подходит для мета-консенсуса . Если что-то неясно, пожалуйста, обращайтесь к ОП (поскольку он / она устанавливает правила, а не мы). Простой поиск «SparseArray» на этом сайте дает множество SparseArrayответов, поэтому я предполагаю, что все в порядке.
ЮнгХван Мин

1
@Метки. Также на этой странице есть много хитростей по игре в гольф Mathematica.
Юнг Хван Мин

1
@JungHwanMin Я отредактировал свой ответ, как ты и просил
J42161217

2

Python 3 , 228 226 224 215 197 195 байт

-11 байт благодаря @Mr. Xcoder

-2 байта благодаря @Mr. Xcoder

def f(n,s=range):
 x=y=t=c=0;z=[]
 for i in s(n*n-n+2):c+=i%(n-(2<=n))<1;z+=[[x,y]];t=max(t,x);x+=2-c%2;y+=[-1,1][c%4<3]*(c%2)
 return'\n'.join(''.join(' O'[[k,j]in z]for k in s(t))for j in s(n))

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

Пояснение и менее понятный код:

def f(n):
 x=y=t=c=0;z=[]                       #initialize everything
 for i in range(n*n-n+2):             #loop n*n-n+2 times which is the numberr of 'o's expected
    c+=i%[~-n,n]<n-1                  #if one cycle has been completed, increase c by 1, if n>1.                                            
    z+=[[x,y]]                        #add [x,y] to z(record the positions of 'o')
    t=max(t,x)                        #trap maximum value of x-coordinate(to be used later while calculatng whole string)
    r=[[2,0],[1,1],[2,0],[1,-1]][c%4] #r gives direction for x and y to move, adjust it as per c i.e. cycles
    x+=r[0];y+=r[1]                   #yield newer values of x and y 
 return '\n'.join(''.join(' o'[[k,j]in z]for k in range(t))for j in range(n)) #place space or 'o' accordingly as per the recorded posititons in z

1
Очень хорошая работа. Поздравляем!
мистер Xcoder

@ Mr.Xcoder Спасибо. Я должен сказать, что это было сложно, особенно были проблемы с определением правильного диапазона.
officialaimm


1
215 байт , if 2>n:return'o'это довольно избыточно. Я сделал обходной путь c+=i%[~-n,n][2>n]<1вместо c+=i%~-n<1.
г-н Xcoder

1
Извините за очень позднее улучшение, 195 байт
г-н Xcoder

1

Haskell , 197 байт

a n c=take(2*n)$cycle$c:" "
r i n x y=take(div(3*n)2*(n-1)+1)$(' '<$[1..i])++(cycle$"O "++(a(2*n-i-3)y)++"O "++(a(n+i-2)x))
z n=take n$(r 0 n 'O' ' '):[r i n ' ' ' '|i<-[1..n-2]]++[r(n-1)n ' ' 'O']

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

Благодаря @Lynn: исправлены пробелы между Os на горизонтальных сегментах зигзага, но это стоит много байтов!

Некоторые объяснения:

  • rстрока вывода: она имеет 0 y y y y y 0 x x x 0 y ...формат, количество xи в yзависимости от строки и начальногоn
  • для верхнего ряда x='0'иy=' '
  • для средних рядов x=' 'иy=' '
  • для нижнего ряда x=' 'иy='0'
  • take(div(3*n)2*(n-1)+1) режет бесконечный ряд в нужном месте
  • каждый вывод имеет одну верхнюю строку и одну нижнюю строку, за исключением случаев, когда n=1: take nобрабатывает этот случай.

Красиво в гольф! Я думаю, вы можете оставить пару таких мест. И replicate n xможет быть заменен x<$[1..n]. Кроме того, в вашем ответе отсутствуют пробелы между Os на горизонтальных сегментах зигзага.
Линн

@ Линн спасибо! с пробелами на горизонтальных сегментах мой метод становится громоздким, но я все равно хотел исправить код ...
jferard

Вы можете сэкономить немного, используя операторы и удаляя ненужные пробелы, см. Здесь .
ბიმო

1

Python 2 , 155 151 146 137 байт

m=input()
n=m-1
r=range(n+2)
for L in zip(*[' '*i+'O'+n*' 'for i in(r+[n,m]*~-n+r[-2::-1]+([m,0]*n)[:-1])*m][:1+3*m/2*n]):print''.join(L)

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


@ Mr.Xcoder Ааа. Я вижу сейчас.
TFeld

@ Mr.Xcoder Исправлено.
TFeld

Я на год опаздываю на вечеринку в гольф, но `L`[2::5]сохраняю байты больше''.join(L)
г-н Xcoder
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.