Послідовність стрибків


29

Усі кредити Аднану за те, що він вирішив цю проблему.

Моє останнє завдання, перш ніж я перейду на перерву .

Завдання

Враховуючи додатне ціле число n, якщо nце непарно, повторіть /це багато разів; якщо nце навіть, повторіть \це багато разів.

(Якщо серйозно, тестові корпуси були б набагато чіткішими, ніж цей опис, тому просто подивіться на тестові шафи.)

Технічні характеристики

Тестові шафи

n output
1 /
2 \\
3 ///
4 \\\\
5 /////
6 \\\\\\

Відповіді:


17

Javascript, 22 байти

n=>"\\/"[n%2].repeat(n)

Визначає анонімну функцію.

Якщо тільки *повторювані рядки в Javascript. зітхає


1
Нарешті ви знайшли потрібного оператора
Leaky Nun

@LeakyNun Про що ти говориш?
DanTheMan

Ви використовували потрійного оператора для вибору символу, ні?
Leaky Nun

@LeakyNun Спочатку так, але якщо ви подивитеся на чат, я також опублікував це приблизно через хвилину.
DanTheMan

2
@Jordumus Ви можете привласнити функцію змінної: f=n=>...ви можете відразу назвати його: (n=>...)(5). (Або якщо ви використовуєте NOD.js REPL, ви можете використовувати this._, що означає останнє введене)
DanTheMan



9

Perl, 20 байт

Включає +1 для -p

Запустити з введенням даних STDIN:

squigly.pl <<< 6

squigly.pl

#!/usr/bin/perl -p
$_=$_%2x$_;y;01;\\/

Це може бути просто моєю версією Perl (я все ще на 5.10), але це призводить до помилки, якщо я не додаю зайву; до кінця. Я думаю, що це тому, що ви використовуєте напівкрапку як роздільник для y, і вам потрібно ще один, щоб закінчити оператор (і знадобиться два, якщо після цього у вас було більше рядків коду)
theLambGoat

@theLambGoat Ви впевнені, що використовуєте цю -pопцію? Я використовую ;в транслітераті саме тому -p, що ;в кінці коду є неявна, тому я можу зберегти ще 1 байт. Це спрацювало з принаймні 5,6 (мабуть, поки -pопція існувала насправді)
Тон Євангелія,

@theLambGoat Мм, я знайшов старий Redhat з perl 5.10, де він справді не працює. Або це патч Redhat, або він справді не працював близько 5.10 (я впевнений, що він працював у старих перлах, і він також працює у нових перлах)
Тон Євангелія,

Я працюю на SUSE Enterprise Server 11, так що це не просто ред. Але я думаю, що поки це працює в деяких версіях, це все одно має бути вірною відповіддю. (Я також щойно перевірив 5.08. Єдина інша версія, до якої я маю доступ на даний момент, і вона там не працює)
theLambGoat

1
Цей трюк з ;додаванням -p- досить приголомшливий, молодець.
Дада


7

C #, 42 байти

string f(int n)=>new string("\\/"[n%2],n);

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


7

PHP, 38 байт

for(;$i++<$a=$argv[1];)echo'\/'[$a%2];

(варіант 38 байт)

while($i++<$a=$argv[1])echo'\/'[$a%2];

(варіант 38 байт)

<?=str_pad('',$a=$argv[1],'\/'[$a%2]);

(варіант 40 байт)

<?=str_repeat('\/'[($a=$argv[1])%2],$a);



6

J, 10 байт

#'\/'{~2|]

Це дієслово з шести потягом, що складається з:

# ('\/' {~ 2 | ])

Це гачок між #і ('\/' {~ 2 | ]); гак (f g) yрозширюється до y f (g y), так що це розширюється до y # (... y), що для одиночних символів дає список yсимволів.

Друга частина - це 5-поїзд, що складається з:

'\/' {~ 2 | ]

Це оцінюється до двох вил:

'\/' {~ (2 | ])

Внутрішня вилка,, 2 | ]є модулем два. Таким чином, зовнішня вилка:

'\/' {~ mod2

Який бере ( {~) індекс mod2 ( mod2) з рядка /.

Потім, використовуючи гачок зверху:

y # (apt char)

Це дає те, що ми хочемо, і ми робимо.


6

Haskell, 25 байт

f n=cycle"\\/"!!n<$[1..n]

-1 байт завдяки Деймієну с cycle.


1
f n=cycle"\\/"!!n<$[1..n]
Демієн

@Damien Wow, як я забув цикл.
xnor

Не знаю. Але я радий, що мав можливість колись тебе «побити» :)
Демієн

6

Математика, 34 32 28 байт

If[OddQ@#,"/","\\"]~Table~#&

Анонімна функція. Бере ціле число як вхідне і повертає список символів як вихід.


Можна використовувати ~Table~#.
Мартін Ендер

Я думаю, це було додано в 10.2.
Мартін Ендер

Крім того, я думаю, ви можете скинути <>""і повернути список символів.
Мартін Ендер

1
@MartinEnder Вони, мабуть, також додали ~Do~Infinityтаку й у 10.2+ ...
LegionMammal978

5

Powershell, 30 27 байт

Оновлення:

param($n)('\','/')[$n%2]*$n

Перехід на param, завдяки тимміду .


"$("\/"[$args[0]%2])"*$args[0]

або трохи читабельніший

("\","/")[$args[0]%2]*$args[0]

Тест:

> 1..10 | % { ./run.ps1 $_ }
/
\\
///
\\\\
/////
\\\\\\
///////
\\\\\\\\
/////////
\\\\\\\\\\

3
Ласкаво просимо до PPCG! Приємно бачити ще одного користувача PowerShell. Ви можете поголити кілька байтів, взявши введення param($n)замість $args, як, наприклад, для 27 байт -param($n)('\','/')[$n%2]*$n
AdmBorkBork

5

Математика, 29 байт

"\\"["/"][[#~Mod~2]]~Table~#&

Жорстоко використовує той факт, що [[1]]повертає перший аргумент функції, в той час як сам [[0]]повертає функцію (голову), застосовану до дивно допустимої функції, названої на "\\"яку оцінюється в "/".


Це трохи менш дивно, якщо ви вважаєте, що щось із форми a[b]є лише загальним виразом із головою a(індексом 0) та елементом b(індексом 1), а функції - це лише особливі види вираження (насправді, правильніше було б сказати, що функції не є ' t виразів взагалі, але це просто правила для перетворення виразів, які зазвичай мають форму f[x...]). :)
Мартін Ендер

2
Я бачив, як багато мов зловживаються на цьому веб-сайті, але я думаю, що це перше зловживання Mathematica, яке я бачив. Хороша робота!
DanTheMan





4

> <> (Риба), 30 байт

:2%?'/'o1-:?!;30.
30.  >'\'50p

Перший раз використовую цю мову, але я думаю, що я принаймні врятував маленьку кімнату, умовно використовуючи / як частину виводу або дзеркало для перенаправлення потоку. Напевно, все ще жахливо неефективно, хоча я відчуваю, що його, мабуть, можна було б скоротити трохи більше.

Вхід - початковий стек, вихід - stdout

Спробуйте в Інтернеті!


Ласкаво просимо до головоломки програмування та коду для гольфу!
Денніс

@Dennis Дякую! Я ціную прийом
Callum Kerr

4

Діалог APL , 11 байт

Потрібно, ⎕IO←0що для багатьох систем за замовчуванням.

⊢⍴'\/'⊃⍨2|⊢

аргумент

зміни (повтори)

'\/'⊃⍨ рядок "/", обраний

2|⊢ залишок ділення, коли аргумент ділиться на два

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


Класно! Дуже схожий на J.
Conor O'Brien

@ ConorO'Brien Так, різниця полягає лише в тому, що 2-поїзди в J - гачки, а в Діялогу - вершини, тому потрібна явна ліва зубчаста лінія.
Adám

Ах, мені було цікаво, чому аргумент був там.
Conor O'Brien

1
Нарешті відповідь APL з усіма персонажами, викладеними правильно для мене!
Cyoce

@Cyoce Так, я хотів би, щоб ми могли вказати (і вставити) шрифти на SE.
Adám

3

Java 7, 68 65 байт

void c(int i){for(int x=0;x++<i;)System.out.print(i%2<1?92:'/');}

3 байти збережено завдяки @ user902383 та @SeanBean .

Як і з цією відповіддю , найкоротший код-гольф, здається, циклічно та друкується. Обидва рекурсивні і,
void c(int i){System.out.print(new String(new char[i]).replace("\0",i%2<1?"\\":"/"));}
здається, довші.

Невикористаний і тестовий код:

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

class M{
  static void c(int i){
    for(int x = 0; x++ < i;){
      System.out.print(i % 2 < 1
                        ? 92
                        : '/');
    }
  }

  public static void main(String[] a){
    for(int i = 0; i < 10; i++){
      c(i);
      System.out.println();
    }
  }
}

Вихід:

/
\\
///
\\\\
/////
\\\\\\
///////
\\\\\\\\
/////////

Привіт Кевін. Чому б не лямбдаський вираз?
Вале

@Vale Привіт Вале. Тому що я старомодний програміст Java 7. :) Якщо у вас є відповідь на Java 8 або 9, яка дещо відрізняється від моєї відповіді, сміливо опублікуйте її.
Kevin Cruijssen

2
@ Vale (він дивний так: P)
Shaun Wild

1
я думаю, якщо ви перейдете x=-1;++x<iна x=0;x++<iвас, ви можете зменшити на один байт
user902383

1
Також ви можете замінити "\\" : "/"з 92:'/';)
Shaun Wild

3

R, 47 46 байт

n=scan();cat(rep(c("\\","/")[n%%2+1],n),sep="")

У R вам доведеться уникати зворотних нахилів. аргумент sepтакож повинен бути повністю визначений, оскільки він з'являється після .... Таким чином дратує мало можливостей зберегти символи :(

Завдяки bouncyball за те, що гольф відіграє байт.


1
Збережіть один байт за допомогою індексації:n=scan();cat(rep(c('\\','/')[n%%2+1],n),sep='')
bouncyball

3

T-SQL 50 байт

Звичайно, STDINтут немає , тож давайте припустимо тверду кодування INTзмінної на кшталт цієї: DECLARE @ INTтоді рішення:

PRINT IIF(@%2=0,REPLICATE('\',@),REPLICATE('/',@))

3

Піп , 8 байт

"\/"@aXa

Прямо. Використовує модульну індексацію для вибору символу та рядкового повторення для його примноження. Спробуйте в Інтернеті!


Це запитання представляє цікаве порівняння між Піпом, Пітом та Джеллі , два останніх набрали 5 байт. Усі три мови мають неявний вихід, з однорядними операторами для модульної індексації та повторення рядків, і немає необхідності уникати зворотних косих рядків у рядках. Однак є дві ключові відмінності:

  1. За певних обставин Pyth і Jelly потрібен лише один роздільник для визначення рядка;
  2. У Pyth і Jelly є такий синтаксис, що вхід не потребує явного представлення в коді (хоча з зовсім інших причин, як мені пояснив Малтісен ).

Жодна з цих особливостей, ймовірно, не з’явиться в Pip 1 (мені не подобається естетика незбалансованих роздільників, і без точкового синтаксису або неявних операндів здається, що вони були б занадто чужими моєму аналізатору вираження інфікування), але я ' я гаразд, граючи третю скрипку. Незважаючи на те, що "читабельність" є надзвичайно відносною при гольфі, я заперечую, що ці три додаткові байти значно спрощують програму "Піп" з першого погляду - і в моїй книзі це вартий компроміс.

1 Хоча в Pip 'односимвольні рядки використовують єдиний роздільник, натхненний CJam та цитуванням у Lisp.


Я не впевнений, що читальність - це плюс, в коді гольф? Не ціною байтів !
GreenAsJade

@GreenAsJade Я очікую, що багато людей відчують те саме. Я хотів би зробити одне відмінність code golf:! = golflang design. Тепер ви можете стверджувати, що той самий принцип (коротший завжди кращий) стосується і мовного дизайну. Я просто кажу, що для мене зручність і навіть естетика - це міркування.
DLosc

Порада щодо створення мови для гри в гольф: не використовуйте
інфікс


pyth не має неявного точкового синтаксису. він працює майже так само, як і в python, роблячи його читабельним, але коротким. ваш коментар про незбалансовані роздільники, з іншого боку, досить правдивий
Мальтісен




2

SpecBAS - 28 байт

1 INPUT n: ?"\/"(ODD(n)+1)*n

ODDповертає 1, якщо число непарне, то використовує це як індекс для друку правильного символу n кількість разів. Необхідно додати 1, оскільки рядки SpecBAS починаються з символу 1.


2

Java 8, 56 байт

(i,j)->{for(j=i;j-->0;)System.out.print(i%2<1?92:'/');};

Я хотів би подякувати @Kevin Cruijssen вдосконаленому за те, що далі я відповів гольфу.

Програма тестування без вогків

public static void main(String[] args) {
    BiConsumer<Integer, Integer> consumer = (i, j) -> {
        for (j = i; j-- > 0;) {
            System.out.print(i % 2 < 1 ? 92 : '/');
        }
    };

    consumer.accept(5, 0);
    consumer.accept(1, 0);
    consumer.accept(8, 0);
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.