ลำดับไก่เขี่ย


29

เครดิตทั้งหมดให้กับ Adnan สำหรับความท้าทายนี้

ความท้าทายครั้งล่าสุดของฉันก่อนที่ฉันจะไปในช่วงพัก

งาน

รับจำนวนเต็มบวกnถ้าnเป็นเลขคี่ให้ทำซ้ำ/หลายครั้ง; ถ้าnเป็นเช่นนั้นให้ทำซ้ำ\หลายครั้ง

(อย่างจริงจังการทดสอบจะชัดเจนกว่าคำอธิบายนี้มากดังนั้นให้ดูที่การทดสอบ)

รายละเอียด

Testcases

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

คำตอบ:


17

Javascript, 22 ไบต์

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

กำหนดฟังก์ชั่นที่ไม่ระบุชื่อ

ถ้ามีเพียง*สตริงซ้ำ ๆ ใน Javascript ถอนหายใจ


1
ในที่สุดคุณก็พบผู้ให้บริการที่ถูกต้อง
Leaky Nun

@LeakyNun คุณกำลังพูดถึงอะไร
DanTheMan

คุณกำลังใช้ผู้ประกอบการที่สามในการเลือกตัวละครไม่?
Leun Nun

@LeakyNun ในขั้นต้นใช่ แต่ถ้าคุณดูการแชทฉันก็โพสต์สิ่งนี้ในอีกประมาณหนึ่งนาทีต่อมา
DanTheMan

2
@Jordumus คุณจะสามารถกำหนดฟังก์ชั่นให้กับตัวแปร: คุณโดยตรงสามารถเรียกมันว่า:f=n=>... (n=>...)(5)(หรือถ้าคุณใช้ Node.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 ไบต์ สิ่งนี้ได้ผลตั้งแต่อย่างน้อย perl 5.6 (อาจตราบเท่าที่มี-pตัวเลือกอยู่จริง)
Ton Hospel

@ theLambGoat อืมฉันพบสิ่งที่แก่กว่าด้วย perl 5.10 ซึ่งแน่นอนว่ามันใช้งานไม่ได้ ไม่ว่าจะเป็นแพทช์ redhat หรือไม่ได้ผลจริง ๆ ประมาณ 5.10 (ฉันแน่ใจว่ามันทำงานใน perls รุ่นเก่าและมันยังทำงานใน perls ที่ใหม่กว่า)
Ton Hospel

ฉันกำลังทำงานบน SUSE Enterprise Server 11 ดังนั้นมันจึงไม่ใช่เรื่องใหม่ แต่ฉันคิดว่าตราบใดที่มันใช้ได้ในบางรุ่นมันก็ควรจะเป็นคำตอบที่ถูกต้อง (ฉันเพิ่งตรวจสอบใน 5.08 รุ่นอื่นเท่านั้นที่ฉันสามารถเข้าถึงได้ในขณะนี้และมันไม่ทำงานที่นั่น)
theLambGoat

1
เคล็ดลับที่;เพิ่มโดย-pค่อนข้างน่ากลัวทำได้ดี
Dada


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

เยลลี่ 5 ไบต์

ị⁾/\x

ลองออนไลน์! หรือตรวจสอบผลการทดสอบทั้งหมด

ị⁾/\x

ị⁾/\    modular-indexing into the string "/\"
    x   repeat

ถึงแม้ว่าผมจะสงสัยว่าความท้าทายนี้อาจจะมีสิ่งที่จะทำอย่างไรกับมันที่มีอยู่ก็น่าสังเกตว่าเป็นไบต์สั้นกว่าØ^ ⁾/\
สตริงที่ไม่เกี่ยวข้อง

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

Mathematica, 34 32 28 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อ รับจำนวนเต็มเป็นอินพุตและส่งคืนรายการอักขระเป็นเอาต์พุต


~Table~#คุณสามารถใช้
Martin Ender

ฉันคิดว่ามันถูกเพิ่มเข้ามาใน 10.2
Martin Ender

นอกจากนี้ฉันคิดว่าคุณสามารถทิ้ง<>""และส่งคืนรายการอักขระได้
Martin Ender

1
@MartinEnder พวกเขาจะต้องเพิ่ม~Do~Infinityและเช่นใน 10.2+ เช่นกัน ...
LegionMammal978

5

Powershell, 30 27 ไบต์

ปรับปรุง:

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

สลับไปparamขอบคุณtimmyd


"$("\/"[$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

Mathematica, 29 ไบต์

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

อย่างโหดร้ายใช้ประโยชน์จากความจริงที่ว่า[[1]]ผลตอบแทนอาร์กิวเมนต์แรกของการทำงานในขณะที่[[0]]ผลตอบแทนที่ฟังก์ชั่น (หัว) ตัวเองนำไปใช้กับการทำงานที่ถูกต้องแปลกชื่อ"\\"ที่จะถูก "ประเมิน" "/"ที่


มันแปลกน้อยลงเล็กน้อยเมื่อคุณพิจารณาว่าบางสิ่งบางอย่างของฟอร์มa[b]เป็นเพียงนิพจน์ทั่วไปที่มี head a(index 0) และ element b(index 1) และฟังก์ชั่นเป็นเพียงการแสดงออกชนิดพิเศษ (อันที่จริงแล้วมันจะถูกต้องมากขึ้น ไม่แสดงนิพจน์ แต่เป็นเพียงกฎสำหรับการแปลงนิพจน์ซึ่งมักจะมีรูปแบบf[x...]) :)
Martin Ender

2
ฉันเคยเห็นหลายภาษาถูกทารุณกรรมในเว็บไซต์นี้ แต่ฉันคิดว่านี่เป็นการละเมิดครั้งแรกของ Mathematica ที่ฉันเคยเห็น เยี่ยมมาก!
DanTheMan





4

> <> (ปลา), 30 ไบต์

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

ครั้งแรกที่ใช้ภาษานี้ แต่ฉันคิดว่าอย่างน้อยฉันก็ประหยัดห้องเล็ก ๆ โดยใช้เงื่อนไข / เป็นส่วนหนึ่งของผลลัพธ์หรือมิเรอร์เพื่อเปลี่ยนเส้นทางการไหล แม้ว่าอาจจะไม่มีประสิทธิภาพอย่างน่ากลัว แต่ฉันรู้สึกว่ามันน่าจะลดน้อยลงไปได้อีกเล็กน้อย

อินพุตเป็นสแต็กเริ่มต้นเอาต์พุตคือ stdout

ลองออนไลน์!


ยินดีต้อนรับสู่ Programming Puzzles & Code Golf!
เดนนิส

@ เดนนิสขอบคุณ! ฉันขอขอบคุณการต้อนรับ
Callum Kerr

4

Dyalog APL , 11ขนาดไบต์

ต้องใช้⎕IO←0ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ

⊢⍴'\/'⊃⍨2|⊢

อาร์กิวเมนต์

ปรับรูปร่าง (ซ้ำ)

'\/'⊃⍨ สตริง "/" ที่เลือกโดย

2|⊢ ส่วนที่เหลือเมื่ออาร์กิวเมนต์ถูกหารด้วยสอง

ลองใช้ออนไลน์!


เย็น! คล้ายกันมากกับ J.
Conor O'Brien

@ ConorO'Brien ใช่ความแตกต่างเพียงอย่างเดียวคือรถไฟ 2 ขบวนใน J เป็นตะขอขณะที่พวกเขาอยู่บนยอดเขาใน Dyalog ดังนั้นจึงจำเป็นต้องมีฟันซี่ซ้ายที่ชัดเจน
อดัม

อ่าฉันสงสัยว่าทำไมการโต้แย้งจึงอยู่ที่นั่น
Conor O'Brien

1
ในที่สุดคำตอบ APL พร้อมตัวละครทุกตัวที่แสดงถูกต้องสำหรับฉัน!
Cyoce

@Cyoce ใช่ฉันหวังว่าเราจะสามารถระบุแบบอักษร (และฝัง) บน SE
อดัม

3

Java 7, 68 65 bytes

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

3 bytes saved thanks to @user902383 and @SeanBean.

Just like with this answer, the shortest code-golf seems to loop and print. Both recursive and
void c(int i){System.out.print(new String(new char[i]).replace("\0",i%2<1?"\\":"/"));}
seems to be longer.

Ungolfed & test code:

Try it here.

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

Output:

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

Hi Kevin. Why not a Lambda Expression?
Vale

@Vale Hi Vale. Because I'm an old-fashion Java 7 programmer. :) If you have a Java 8 or 9 answer that is slightly different than my answer, feel free to post it.
Kevin Cruijssen

2
@Vale (he's odd like that :P)
Shaun Wild

1
i think if you change x=-1;++x<i to x=0;x++<i you can reduce by one byte
user902383

1
Also you can replace "\\" : "/" with 92:'/' ;)
Shaun Wild

3

R, 47 46 bytes

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

In R, you have to escape backslashes. the argument sep also has to be fully specified since it comes after .... Thus annoyingly few opportunities to save chars :(

Thanks to bouncyball for golfing away a byte.


1
Save one byte by using indexing: n=scan();cat(rep(c('\\','/')[n%%2+1],n),sep='')
bouncyball

3

T-SQL 50 bytes

Of course no STDIN here, so let's assume a hardcoded INT variable like this: DECLARE @ INT then the solution is:

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

3

Pip, 8 bytes

"\/"@aXa

Straightforward. Uses modular indexing to select the character and string repetition to multiply it. Try it online!


This question presents an interesting comparison between Pip, Pyth, and Jelly, the latter two each having scored 5 bytes. All three languages have implicit output, with single-char operators for modular indexing and string repetition, and no requirement to escape backslashes in strings. There are two key differences, though:

  1. Under certain circumstances, Pyth and Jelly need only one delimiter to define a string;
  2. Pyth and Jelly have syntax such that the input doesn't need to be explicitly represented in the code (though for very different reasons, as Maltysen explained to me).

Neither one of these features is likely to show up in Pip1 (I don't like the aesthetics of unbalanced delimiters, and point-free syntax or implicit operands seem like they would be too alien to my infix expression parser), but I'm okay with playing third fiddle. Even though "readability" is extremely relative when golfing, I'd argue that those three extra bytes make the Pip program a lot easier to understand at a glance--and in my book, that's a worthwhile tradeoff.

1 Although, single-character strings in Pip use a single ' delimiter, inspired by CJam and by quoting in Lisp.


I'm not sure that readability is a plus, in code golf? Not at the cost of bytes !
GreenAsJade

@GreenAsJade I expect a lot of people feel the same. I would just make one distinction: code golf != golflang design. Now you may well argue that the same principle (shorter is always better) applies to language design too. I'm just saying that for me, usability and even aesthetics are considerations.
DLosc

Pro tip for making a golfing language: don't use infix
Cyoce


pyth doesn't have implicit point free syntax. it works pretty much the same way it does in python, making it readable yet short. your comment about the unbalanced delimiters on the other hand is pretty true
Maltysen




2

SpecBAS - 28 bytes

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

ODD returns 1 if number is odd, then uses that as an index to print the correct character n number of times. Have to add 1 as SpecBAS strings start at character 1.


2

Java 8, 56 bytes

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

I'd like to thank @Kevin Cruijssen in advanced for golfing my answer further.

Ungolfed Test Program

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

2

Actually, 10 bytes

Golfing suggestions welcome. Try it online!

;'\'/2(%I*

How it works

       Implicit input of n
;      Duplicate n
'\'/   The strings "/" and "\"
2(%    n mod 2
I      If n mod 2, then "/", else "\"
*      Multiply by n. Implicit print at the end.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.