Покажите цепочку маленьких гор с нечетным числом на вершине!


19

Первая строка состоит из ceil(n/2)элементов, где каждый элемент:<space><odd-number><space>

Вторая строка сделана с ceil(n/2)элементами, но каждый элемент / \только.

Вы можете предположить n >= 0и n <= 10.

Примеры

Вход: 3

 1  3
/ \/ \

Вход: 10

 1  3  5  7  9
/ \/ \/ \/ \/ \

Пример в Python 3, 103 байта:

lambda a:print("".join([" "+str(i)+" "for i in range(1,a+1,2)]+["\n"]+["/ \\"for i in range(1,a+1,2)]))

Самый короткий код в байтах побеждает :)


3
Можете ли вы предположить, что все входные данные будут меньше 11?
Синий

Да, все входные данные будут меньше, чем 11!
Сигмей,

8
Добро пожаловать на сайт! По умолчанию для code-golf мы считаем байты, а не символы. Если вы хотите изменить это, это ваш выбор. Кроме того, я бы порекомендовал Песочницу в следующий раз :)
Эрик Outgolfer

Я имел ввиду байты, ты прав! Есть ли хороший счетчик байтов?
Сигмей,

1
Как конкретно мы должны обрабатывать пробелы? Вы говорите, что каждый элемент есть <space><odd-number><space>, но контрольные примеры не имеют пробела после последнего нечетного числа. Это необязательно? Кроме того, вывод для n=0двух пустых строк?
xnor

Ответы:


12

05AB1E , 19 15 14 12 байт

05AB1E использует кодировку CP-1252 .
Сохранено 4 байта благодаря Аднану . Экономия
2 байта благодаря carusocomputing

ÅÉðìDg…/ \×»

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

объяснение

ÅÉ               # list of uneven number up to input
  ðì             # prepend a space to each
    Dg           # get length of list
      …/ \       # push the string "/ \"
          ×      # repeat the string length-list times
           »     # join rows by spaces and columns by newlines

КАК ÏДОЛГО СУЩЕСТВУЕТ ?! Это кажется очень полезным.
Волшебная Урна Осьминога

2
@carusocomputing Долгое время: р
Аднан

2
LDÉÏтак же, как ÅÉи „ ýðìможет быть заменено ðì)»:).
Аднан

2
Вы можете удалить ), не так ли?
Волшебная Осьминог Урна

3
ÅÉðìDg…/ \×»использует Dgвместо ¹;îдругого байта сохранения.
Волшебная Урна Осьминога

11

Пайк, 16 байт

S2%idm+dJil*"/ \

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

17 байт и больше

S2%i`~Bd.:il*"/ \

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

Это использует ИМХО УДИВИТЕЛЬНЫЙ алгоритм для проверки правильности выравнивания первой строки.

S                 - range(1, input+1)
 2%               -  ^[::2]
   i              -   i = ^
    `             -    str(^)
     ~Bd.:        -     ^.translate("><+-.,[]", " ") <-- awesome bit here
          il      -  len(i)
            *"/ \ - ^ * "/ \"

Это заменяет все символы в строковом списке пробелами. ~Bсодержит все символы на языке Brain ****, и я впервые использую эту переменную.

Программа `~Bd.:делает это:

`~Bd.: - input = [1, 3, 5, 7]
`      - str(input)  # stack now ["[1, 3, 5, 7]"]
 ~B    - "><+-.,[]"  # stack now ["[1, 3, 5, 7]", "><+-.,[]"]
   d   - " "         # stack now ["[1, 3, 5, 7]", "><+-.,[]", " "]
    .: - translate() # stack now [" 1  3  5  7 "]

... это ... просто потрясающе? Вы знаете, что вы просто победили 05AB1E и все, верно?
Эрик Outgolfer

Я попробовал желе; это наверняка будет намного дольше.
Эрик Outgolfer

«Я использовал кодировку BF для равномерного распределения массива чисел». Вещи, о которых вы никогда не думали, что скажете ...
ETHproductions

Это действительно умно :) Хорошо сделано
Sygmei

@ErikGolfer ー リ ッ ク ゴ ル フ ァ ー Больше не победил 05AB1E.
boboquack

6

Python 2, 63 байта

lambda n:' '.join(n%2*`n`for n in range(n+1))+'\n'+-~n/2*'/ \\'

Маленькая хитрость для первой строки: она не печатает четные числа, а принимает их как пустую строку, что приводит к появлению пустого пробела (там будет 0) и двойных пробелов между числами без каких-либо изменений в диапазоне, Недостатком является ведущее место в четных n


6

Python 2 3, 67 65 63 60 байт

Ничего слишком сумасшедшего здесь, я думаю, что первый раздел, вероятно, можно сделать короче, но я не совсем уверен, как . Я использую тот факт, что в этом случае -~n/2будет работать для ceil.

lambda n:-~n//2*' %d '%(*range(1,n+1,2),)+'\n'+-~n//2*'/ \\'

Ниже представлены альтернативные 61 и 65-байтовые решения в Python 2:

lambda n:-~n/2*' %d '%tuple(range(1,n+1,2))+'\n'+-~n/2*'/ \\'
lambda n:' '+'  '.join(map(str,range(1,n+1,2)))+'\n'+-~n/2*'/ \\'

Спасибо Роду за сохранение 2 байта и Artyer за сохранение другого байта путем переключения версии :)


Если вы перейдете на Python 3, вы можете заменить %(tuple(...))на %[*...], но вам придется это сделать-~n//2
Artyer

@Artyer Пробовал это, но он выдает кучу ошибок. Я думаю, что мне нужно было бы привести rangeк списку, потому что 3 - rangeэто как Python 2 xrange.
Каде

Вы также можете удалить круглые скобки, которые окружаютtuple()
Род

Вы можете сделать (*<iterable>,)приведение к кортежу в Python 3. Это сохраняет 1 байт, хотя после превращения n/2в n//2Python 3.
Artyer

@Rod и Artyer спасибо большое! :)
Kade

6

JavaScript (ES6), 55 байт

f=n=>n%2?f(n-1).replace(`
`,` ${n} 
/ \\`):n?f(n-1):`
`
<input type=number min=1 max=10 oninput=o.textContent=f(this.value)><pre id=o>

Обратите внимание на пробел в конце второй строки.


Дангит, я думал, что .replaceможет быть лучше, но я не удосужился проверить ...
ETHproductions

Вопрос гласит: «Вы можете предположить ...»
Соломон Уцко

1
@SolomonUcko HTML не является частью ответа, он просто служит для демонстрации своей работы. Таким образом, он может также ограничить значение от 1 до 10, поскольку в противном случае результат не будет действительным.
Нил

Понимаю. В противном случае вы должны были бы определить правильный интервал
Соломон Уцко

5

Python 2, 53 байта

lambda n:" 1  3  5  7  9"[:-~n/2*3]+'\n'+-~n/2*"/ \\"

Использует ограничение n <= 10для генерации верхней строки, отрубая кусок из жестко закодированной строки.

Выходы от 1 до 10:

 1 
/ \
 1 
/ \
 1  3 
/ \/ \
 1  3 
/ \/ \
 1  3  5 
/ \/ \/ \
 1  3  5 
/ \/ \/ \
 1  3  5  7 
/ \/ \/ \/ \
 1  3  5  7 
/ \/ \/ \/ \
 1  3  5  7  9
/ \/ \/ \/ \/ \
 1  3  5  7  9
/ \/ \/ \/ \/ \

Выход для 0 - две пустые строки.


5

Vim, 73 59 56 байт

Это действительно большое количество байтов IMO для простой проблемы. Я чувствую, что упускаю что-то очевидное.

caw="/2*2
caw1357911/"
DYp:s;.;/ \\;g
k:s// & /g

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

непечатные:

^Acaw^R=^R"/2*2      # Transform a number into the next odd number (3->5,4>5)
^[^Acaw1357911^[/^R" # Insert 1357911, delete everything after the number above
DYp:s;.;/ \\;g       # Duplicate the line, replace numbers with / \
k:s// & /g           # On the line above, add spaces around numbers
<trailing newline>

Хорошо, я всегда vvv upvote! Однако непечатаемые символы также считаются байтами, поэтому это решение на самом деле составляет 73 байта. Прости за это!
DJMcMayhem

Однако у меня есть несколько советов. 1) Если вы используете другой разделитель в своей команде замещения, вам не нужно избегать косой черты, так что вы можете это сделать :s;.;/ \\;g. 2) в вашей второй команде замещения вы можете оставить поиск пустым, и он будет использовать ваш последний поиск (что так и происходит). Также &эквивалентно \0и на один байт короче. Таким образом, вы получаете:s// & /g
DJMcMayhem

Благодарность! Я надеялся увидеть ответ V от вас, чтобы увидеть, если вы использовали другой подход для меньшего количества байтов, но это нормально! Я думаю, что первый комментарий - это то, что я забыл обновить ссылку «Попробуй онлайн». Второй получил мне 3 байта, так что спасибо!
nmjcman101

4

Mathematica, 65 байт

" "<>Range[1,#,2]~StringRiffle~"  "<>"
"<>"/ \\"~Table~⌈#/2⌉&

Анонимная функция. Принимает число в качестве ввода и возвращает строку в качестве вывода. Символы Unicode, соответственно, это U + 2308 ЛЕВОЙ ПОТОЛОК для \[LeftCeiling]и U + 2309 ПРАВОЙ ПОТОЛОК для \[RightCeiling].


4

WinDbg, 100 байт

.echo;.for(r$t1=1;@$t1<=2*@$t0+@$t0%2;r$t1=@$t1+2){j@$t1<=@$t0 .printf"\b %d \n",@$t1;.printf"/ \\"}

Ввод осуществляется путем установки значения в псевдорегистре $t0.

Похоже, здесь меньше всего просто напечатать строку в процессе ее создания, а не пытаться сначала ее построить и отобразить все целиком. У меня было бы более короткое решение, если бы WinDbg позволял мне писать по адресу 0.

Как это устроено:

.echo;                                            * Print a new line that'll be deleted
.for(r$t1=1; @$t1 <= 2*@$t0+@$t0%2; r$t1=@$t1+2)  * Enumerate 1 to 4*ceil($t0/2), count by 2
{
    j@$t1<=@$t0                                   * If $t1 <= $t0...
        .printf"\b %d \n",@$t1;                   * ...Print $t1 (and newline for last n)
        .printf"/ \\"                             * ...Else print the / \'s
}

Выход для каждого значения n:

0:000> .for(r$t0=0;b>@$t0;r$t0=@$t0+1){.printf"\n\nn=%d\n",@$t0; .echo;.for(r$t1=1;@$t1<=2*@$t0+@$t0%2;r$t1=@$t1+2){j@$t1<=@$t0 .printf"\b %d \n",@$t1;.printf"/ \\"}}


n=0



n=1
 1 
/ \

n=2
 1 
/ \

n=3
 1  3 
/ \/ \

n=4
 1  3 
/ \/ \

n=5
 1  3  5 
/ \/ \/ \

n=6
 1  3  5 
/ \/ \/ \

n=7
 1  3  5  7 
/ \/ \/ \/ \

n=8
 1  3  5  7 
/ \/ \/ \/ \

n=9
 1  3  5  7  9 
/ \/ \/ \/ \/ \

n=10
 1  3  5  7  9 
/ \/ \/ \/ \/ \

4

> <> (FISH), 69 60 68 55 байтов

5|v&+%1:,2
1->:?!v:
8~v!?l<on$o:*4
a&/o
1->:?!;"\ /"ooo

Вставьте его в этот онлайн-переводчик!

Число 5 в первой строке - это ваше введенное значение (жестко закодировано как 5, заменено на 0-a или i для ввода пользователем).

Редактировать 1: перемещение новой строки перенесено в пробел первой строки (было пустым), чтобы сэкономить 9 байт на месте новой строки.

Редактировать 2: Как отметил пользователь7150406, вывод был неправильным (печать без пробелов), это было исправлено с потерей 8 байтов.

Правка 3: полностью изменила логику, нет смысла проверять, не является ли число нечетным - лучше положить все числа в стек и удалять каждую вторую. Байт сохранен 13!


4

Ява, 118 112 байт

Изменить: Сохранено 6 байт благодаря @peech

Golfed:

String M(int n){String o=" ";int i=1;n+=1;for(;i<n;i+=2)o+=i+"  ";o+="\n";for(i=0;i<n/2;i++)o+="/ \\";return o;}

Ungolfed:

public String M(int n)
{
    String o = " ";
    int i=1;
    n += 1;
    for (; i < n;i+=2)
        o += i + "  ";
    o += "\n";
    for (i = 0; i < n/2; i++)
        o += "/ \\";
    return o;  
}

Тестирование:

    OddMountains om = new OddMountains();
    System.out.println(om.M(1));
    System.out.println();
    System.out.println(om.M(3));
    System.out.println();
    System.out.println(om.M(5));
    System.out.println();
    System.out.println(om.M(7));
    System.out.println();
    System.out.println(om.M(10));

 1  
/ \

 1  3  
/ \/ \

 1  3  5  
/ \/ \/ \

 1  3  5  7  9  
/ \/ \/ \/ \/ \

Аааа, ты меня побил :) Я также хотел опубликовать ответ на Java. Во всяком случае, вот несколько советов по его использованию: вам не нужно инициализироваться iв первом цикле for, это может выглядеть так for(; i < n; i++). С этим изменением вы можете играть в гольф еще дальше: o += i + " ";изменения в o += i++ + " ";и для петли становятся for(; i < n; ). Это если вы хотите сохранить, если заявление. Вы можете изменить свой приращение i на i i += 2 и удалить целое выражение if, но в этом случае мое второе предложение не применяется :) (ps: я не проверял это :))
peech

@peech Если это утешительно, я обычно гоняюсь за первым ответом на C #. Если этого не произошло, я перебираю свой ответ через Java :) Спасибо за советы. Я удалил iинициализацию из forцикла, но другие вещи застряли в цикле. Возможно, мне придется немного поиграть с этим :)
Пит Арден,

Да, я так рад, что в своем предыдущем комментарии я сказал: «Я не проверял это» ... конечно, это не работает o += i++ + " ";:). Кстати, у вас есть крошечная ошибка в коде :) , так как Java использует floor()на целочисленное деление (4/3 = 1), то вы должны сделать это так: int i = 1; n += 1; for (; i < n; i += 2) { ... jada jada ... }. если вы увеличиваете i на i i += 2, вам не нужно это, если оператор проверяет четность. Это также сохраняет еще 3 байта :) попробуйте здесь: ideone.com/ekaUUH
peech

@peech Если кто-то достаточно уверен в том, чтобы исправить мой код, я предполагаю, что он должен быть правильным, поэтому, когда он не работает, я пытаюсь снова и снова, думая: «Это должен быть я ...» :) Не беспокойтесь! Спасибо за подсказки - я обнаружил floorпричудливость деления, когда играл с какой-то Java несколько дней назад :)
Пит Арден

3

C # 6, 95 байт

n=>{var o="";int i=1;for(;i<=n;i+=2)o+=$" {i} ";o+='\n';for(i=1;i<=n;i+=2)o+="/ \\";return o;};

Полная лямбда:

Func<int, string> a = n=>
{
    var o="";int i=1;
    for(;i<=n;i+=2)
        o+=$" {i} ";
    o+='\n';
    for(i=1;i<=n;i+=2)
        o+="/ \\";
    return o;
};

3

CJam, 26 23 байта

Sri,:)2%_S2**N@,"/ \\"*

Проверь это!

-3 благодаря 8478 (Мартин Эндер)


Вы можете сэкономить 3 байта, избегая некоторых манипуляций со стеком:Sri,:)2%_S2**N@,"/ \\"*
Мартин Эндер,

@MartinEnder О, так вот почему я не мог это удалить +. И я клянусь, я действительно использовал ed! ... короче чем Пиф.
Эрик Outgolfer

3

Game Maker Language (GM 8.0), 97 байт

m=ceil(argument0/2)e=""for(i=1;i<2*m;i+=2)e+=" "+string(i)+" "return e+"#"+string_repeat("/ \",m)

Учитывая, что ввод не более 10, chr(48+i)будет работать вместо string(i), хотя количество байтов одинаково.

Удобочитаемый:

m = ceil(argument0/2)
e = ""
for (i = 1; i < 2*m; i += 2 )
  e += " " + string(i) + " "
return e + "#" + string_repeat("/ \", m)


3

> <> (Рыба) 52 63 62 байта

<v!?:-1:!?-1%2:
 >~la}}" "72.
v!?-2lno<o"  "
o
>:?!;"\ /"ooo1-

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

Для использования просто поместите nв стек и понеслось!

Многое из этого взято из ответа @ Teal-Pelican :).

Редактировать: выходные данные на самом деле не выровнены правильно ни в одной <> отправке! Крепление ...

Edit2: я должен был пожертвовать несколько байтов, но вывод на самом деле правильный сейчас.

Edit3: больше не весело с \ /зеркалами, и я экономлю 1 байт.

Выход:

 1  3  5  7  9
/ \/ \/ \/ \/ \

Спасибо за то, что обнаружили ошибку в печати, я сейчас редактирую свой ответ (довольно тривиально для меня), интересно, что базовый ответ такой же, но сохраняет много байтов.
Тил пеликан

Нет проблем, я был рад видеть> <> представление! Будет интересно посмотреть, какой из них станет меньше, так как эти изменения очень больно ударили по мне, ха-ха.
Redstarcoder

Похоже, я на 5 байтов меньше: с.
redstarcoder

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

1
Я вернулся домой и подумал, как по-новому это сделать. Мой новый ответ 55 байтов! : D - Спасибо, что заставили меня работать над этим, это было весело.
Чирок пеликан



2

Bash, 64, 59, 57, 51, 49, 4845 байтов

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

  • минус 3 байта (используйте $ 1 вместо STDIN)
  • еще один байт, заменив -s ""на-s\
  • минус 2 байта, заменив printf на seq -f (Спасибо @Adam!)
  • рефакторинг для сценария вместо функции (чтобы победить > <> )
  • убраны лишние пробелы
  • немного оптимизировал выражение sed

Golfed

Кусок (45 байт):

seq -f" %g " -s\  1 2 $1|sed 'p;s| . |/ \\|g'

Функция (оригинальная версия) (57 байт):

M() { printf " %s %.0s" `seq 1 $1`|sed 'p;s| . |/ \\|g';}

Тестовое задание

--- mountains.sh ----
#!/bin/bash
seq -f" %g " -s\  1 2 $1|sed 'p;s| . |/ \\|g'

>./mountains.sh 10
 1  3  5  7  9 
/ \/ \/ \/ \/ \

>M 10
 1  3  5  7  9 
/ \/ \/ \/ \/ \

2
Это sedвеликолепно. Не используя ни функцию, ни printf, вы сохраняете 10 байтов:seq -f" %g " -s "" 1 2 $1|sed 'p;s| . |/ \\|g'
Адам,

Это хороший совет! Спасибо ! Я до сих пор использую catдля чтения входные данные из STDIN, поскольку IMO не совсем справедливо использовать предопределенную переменную для передачи данных.
zeppelin

1
$1это просто первый параметр, передаваемый в программу. Я не думаю, что это обман, см. Meta.codegolf.stackexchange.com/questions/2447/…
Адам

Да, вы правы. Еще раз спасибо !
Цеппелин


2

Рубин 82 60 байт

Быстрое и грязное решение Ruby определенно могло бы быть лучше оптимизировано, если бы я был лучше с Ruby

puts "",1.step($*[0].to_i,2).map{|x|$><<" #{x} ";"/ \\"}*""

Использование: prog.rb 10
Вывод:

 1  3  5  7  9
/ \/ \/ \/ \/ \

редактировать: многочисленные правки и оптимизации от @Manatwork!


print$><<и использовать интерполяцию строк " #{x} ". Но лучше всего было бы уменьшить количество .eachвыводя на 1 - й линии непосредственно из обратного вызова и создания 2 - й линии в переменной: s="";(1..$*[0].to_i).step(2){|x|$><<" #{x} ";s+="/ \\"};puts"",s. Или даже puts"",(1..$*[0].to_i).step(2).map{|x|$><<" #{x} ";"/ \\"}*"".
manatwork

Numeric#stepпринимает 2 параметра, поэтому можно избежать синтаксиса длинного диапазона, который требует круглых скобок: (1..$*[0].to_i).step(2)1.step($*[0].to_i,2).
manatwork

@ Manatwork действительно хорошие предложения! Я вижу, как я использую много твоих советов в моих будущих постах о Codegolf, поэтому я очень ценю их вклад.
Бен Хили

1

JavaScript (ES6), 66 64 байта

n=>(f=n=>n?f(n-1)+(n%2?n+s:s):s=" ")(n)+`
`+"/ \\".repeat(++n/2)

Рекурсивно строит первую строку, затем добавляет вторую. Первая строка построена с наблюдением, что это просто диапазон [0 ... n] с каждым элементом n, преобразованным в пробел, если четный, или n, соединенным с пробелом, если нечетный.


1

Python 2, 60 байт

Сохранено 6 байтов благодаря @Kade!

lambda s:" "+"  ".join(`range(s+1)`[4::6])+"\n"+-~s/2*"/ \\"

Вам не нужно использовать list()актерский состав, удаление которого приводит к 60 :)
Kade

@Kade Бэкстик `` `` делает его строкой. Я не могу сделать это как, lambda s:" "+" ".join(range(s+1)[1::2])+"\n"+-~s/2*"/ \\"eпотому что тогда он даст список целых, и он умрет
Оливер Ни


@ Kade Ха Он не работает в Интернете ... Неважно, я не знаю, почему я думал, что это не работает ...
Оливер Ни

1

Пакет, 107 байт

@set s=
@set t=
@for /l %%i in (1,2,%1)do @call set s=%%s%%  %%i&call set t=%%t%%/ \
@echo%s%
@echo %t%

1

Scala, 99 95 байт

(? :Int)=>for(i<-0 to 1)println(1 to ?filter(c=>c%2>0)map(c=>if(i<1)s" $c "else"/ \\")mkString)

Ungolfed

(? :Int) => 
    for (i<-0 to 1)
        println(
            1 to ?filter(c=>c%2>0)
                  map(c=>if(i<1)s" $c "else"/ \\")
                  mkString
        )


1

Октава, 45 байт

f=@(n)reshape(sprintf(' /%d \',1:2:n),2,[]);

Тест:
F (8)

 1  3  5  7
/ \/ \/ \/ \

Когда input = 0, есть / слева :)
Sygmei

Не сказал, что ваш ответ не правильный! Просто заметил тот маленький смешной глюк :)
Sygmei

Я не могу предположить, n == 0 :(
rahnema1

1

QBIC , 35 байт

:[1,a,2|X=X+!b$+@ | Y=Y+@/ \|]?X ?Y

Объяснение:

:           gets a CMD line param as INT 'a'
[1,a,2|     FOR b = 1 to a STEP 2
X=X+!b$+@ | Add to X$ the counter of our FOR loop and a trailing space
            Leading space is provided by the cast-to-string function.
Y=Y+@/ \|   Add to Y$ the mountain.
]           Close the first possible language construct (IF, DO or FOR). In this case: NEXT
?X ?Y       Print X$, Print Y$. The space adds a newline in the resulting QBASIC.

0

Китанай , 140 байт

$0[0]$1[int(input":")]$2[""]$3[""]$0#?(mod@2)($2[add(add(@" ")(string($0@)))"  "]
$3[add@"/ \"])?(neq@($1@))([add@1]&1)print($2@)print($3@)%

0

Perl, 46 + 2 ( -plфлаг) = 48 байт

@_=map$_%2?$_:"",0..$_;$_="@_$/"."/ \\"x(@_/2)

С помощью:

perl -ple '@_=map$_%2?$_:"",0..$_;$_="@_$/"."/ \\"x(@_/2)' <<< 7    

Или 52 байта:

@_=map$_%2?$_:"",0..pop;print"@_$/","/ \\"x(@_/2),$/

С помощью:

perl -e '@_=map$_%2?$_:"",0..pop;print"@_$/","/ \\"x(@_/2),$/' 7
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.