Покажіть ланцюжок маленьких гір з непарним номером на вершині!


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
Ласкаво просимо на сайт! За замовчуванням для коду-гольфу - рахувати в байтах, а не символах. Якщо ви хочете це перекрити, це ваш вибір. Також я б рекомендував пісочницю наступного разу :)
Erik the 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 Довгий час: p
Аднан

2
LDÉÏте саме, що ÅÉі „ ýðìможе бути замінено ðì)»:).
Аднан

2
Ви можете видалити ), чи не так?
Чарівний восьминіг Урна

3
ÅÉðìDg…/ \×»використовує Dgзамість ¹;îіншого байтового збереження.
Чарівний восьминіг Урна

11

Пайк, 16 байт

S2%idm+dJil*"/ \

Спробуйте тут!

17 байт і більше дивовижних

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

Спробуйте тут!

При цьому використовується IMHO алгоритм AWESOME для забезпечення правильного вирівнювання першого рядка.

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 і всіх, правда?
Ерік Аутгольфер

Я спробував желе; це, безумовно, буде набагато довше.
Ерік Аутгольфер

"Я використовував набір 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

Пітон 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*'/ \\'

Дякуємо Rod за збереження 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 дякую купу! :)
Каде

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>

Зверніть увагу на пробіл в кінці другого рядка.


Dangit, я думав, що .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

Вим, 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>

Приємно, я завжди підтримую vim! Однак недруковані символи також вважаються байтами, тому це рішення дійсно становить 73 байти. Вибач за це!
DJMcMayhem

Однак у мене є кілька порад. 1) Якщо ви використовуєте інший відокремлювач для команди заміщення, вам не потрібно буде уникати нахильної косої риси, щоб ви могли це зробити :s;.;/ \\;g. 2) у вашій другій команді заміни ви можете залишити пошук порожнім, і він буде використовувати ваш останній пошук (що так само відбувається). Крім того, &еквівалентний \0і на один байт коротший. Отож ви отримаєте:s// & /g
DJMcMayhem

Спасибі! Я сподівався побачити від вас відповідь V, щоб побачити, чи використовуєте ви інший підхід для меншої кількості байтів, але це добре! Я вважаю, що перший коментар - це функція, яку я забув оновити посилання "Спробуйте в Інтернеті". Другий дістав мені 3 байти, тож дякую!
nmjcman101

4

Математика, 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

Java, 118 112 байт

Редагувати: Збережено 6 байт завдяки @peech

Гольф:

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

Безголівки:

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(; i < n; i++). За допомогою цієї зміни ви можете ще більше пограти в гольф: o += i + " ";зміни в o += i++ + " ";цикл перетворюються на нього for(; i < n; ). Тобто, якщо ви хочете зберегти цю заяву. Ви можете змінити свій приріст i на i += 2 та видалити ціле, якщо твердження, але в такому випадку моя друга пропозиція не застосовується :) (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 by i += 2, вам це не потрібно, якщо перевірка твердження на паритет. Це також економить ще 3 байта :) спробувати тут: ideone.com/ekaUUH
Peech

@peech Якщо хтось досить впевнений, щоб виправити мій код, я припускаю, що він повинен бути правильним, тому, коли він не працює, я намагаюся знову і знову, думаючи, що "це я повинен бути ..." :) Не хвилюйтесь! Дякую за підказки - я floorкілька днів тому відкрив для себе дивізію на підрозділи, граючи з якоюсь явою :)
Піт Арден

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! ... коротший за Піта.
Ерік Аутгольфер

3

Мова виробника ігор (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 байт менший: p.
redstarcoder

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

1
Я повернувся додому і мав ідею для нового шляху, щоб пройти його. Моя нова відповідь - 55 байт! : D - Дякую, що змусили мене працювати над цим, це було весело.
Тілі пелікан



2

Bash, 64, 59, 57, 51, 49, 48, 45 байт

Редагувати:

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

Гольф

Шматок (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
The 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} ";"/ \\"}*"".
манатура

Numeric#stepприймає 2 параметри, тому може уникнути синтаксису тривалого діапазону, який вимагає дужок навколо: (1..$*[0].to_i).step(2)1.step($*[0].to_i,2).
манатура

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

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 Huh. Це не працює в Інтернеті ... Неважливо, я не знаю, чому я думав, що це не працює ...
Олівер Ні

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

Скала, 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)

Безумовно

(? :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
/ \/ \/ \/ \

При введенні = 0, є a / left :)
Сигмей

Не сказав, що ваша відповідь не вірна! Щойно помітив той маленький кумедний глюк :)
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

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.