The Squiggly Sequence

29

Wszystkie podziękowania dla Adnana za wymyślenie tego wyzwania.

Moje ostatnie wyzwanie, zanim pójdę na przerwę .

Zadanie

Biorąc pod uwagę dodatnią liczbę całkowitą n, jeśli njest nieparzysta, powtórz /to wiele razy; jeśli njest parzysty, powtórz \to wiele razy.

(Poważnie, przypadki testowe byłyby o wiele jaśniejsze niż ten opis, więc spójrz tylko na przypadki testowe.)

Okular

Przypadki testowe

n output
1 /
2 \\
3 ///
4 \\\\
5 /////
6 \\\\\\
Leaky Nun
źródło

Odpowiedzi:

17

JavaScript, 22 bajty

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

Definiuje anonimową funkcję.

Jeśli tylko *powtarzane ciągi w JavaScript. wzdycha

DanTheMan
źródło
1
Wreszcie znalazłeś właściwego operatora
Leaky Nun
@LeakyNun O czym ty mówisz?
DanTheMan
Używałeś operatora trójskładnikowego, aby wybrać postać, prawda?
Leaky Nun
@LeakyNun Początkowo tak, ale jeśli spojrzysz na czat, opublikowałem to również około minuty później.
DanTheMan
2
@Jordumus Można też przypisać funkcję do zmiennej: f=n=>..., można bezpośrednio nazwać: (n=>...)(5). (Lub jeśli używasz REPL Node.js, możesz użyć this._, co oznacza ostatnią wprowadzoną rzecz)
DanTheMan
16

Python, 20 bajtów

lambda n:'\/'[n%2]*n
xnor
źródło
Świetny, prosty i elegancki ^ _ ^
ABcDexter
9

Perl, 20 bajtów

Obejmuje +1 dla -p

Uruchom z wejściem na STDIN:

squigly.pl <<< 6

squigly.pl

#!/usr/bin/perl -p
$_=$_%2x$_;y;01;\\/
Ton Hospel
źródło
To może być po prostu moja wersja Perla (wciąż jestem na 5.10), ale generuje błąd, chyba że dodam dodatkową; do końca. Myślę, że dzieje się tak, ponieważ używasz średnika jako separatora dla y i potrzebujesz jeszcze jednego, aby zakończyć instrukcję (i potrzebowałbyś dwóch, gdybyś miał więcej linii kodu po tym)
theLambGoat
@theLambGoat Czy na pewno używasz tej -popcji? Używam ;w transliteracji właśnie dlatego, że -pma niejawne miejsce ;na końcu kodu, dzięki czemu mogę zapisać jeszcze 1 bajt. -p
Działa to
@ theLambGoat Mm, znalazłem stary redhat z perlem 5.10, gdzie rzeczywiście nie działa. Albo jest to łatka redhat, albo rzeczywiście nie działała przez około 5.10 (jestem pewien, że działała na starszych perlach i działa również na nowszych
perlach
Korzystam z SUSE Enterprise Server 11, więc nie jest to tylko przeróbka. Myślę jednak, że tak długo, jak działa w niektórych wersjach, powinna być poprawną odpowiedzią. (Właśnie sprawdziłem 5.08, jedyną inną wersję, do której mam obecnie dostęp i też tam nie działa)
theLambGoat 31.08.16
1
Ta sztuczka z ;dodanym przez -pjest dość świetna, dobrze zrobiona.
Dada
7

Retina , 21 lat

.+
$*/
T`/`\\`^(..)+$

Wypróbuj online (dodano pierwszą linię, aby umożliwić uruchomienie wielu przypadków testowych).

Cyfrowa trauma
źródło
7

C #, 42 bajty

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

Wybiera poprawny znak, a następnie tworzy nowy ciąg znaków składający się z tego znaku powtarzanego nrazy.

Scepheo
źródło
7

PHP, 38 bajtów

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

(wariant 38 bajtów)

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

(wariant 38 bajtów)

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

(wariant 40 bajtów)

<?=str_repeat('\/'[($a=$argv[1])%2],$a);
Crypto
źródło
6

C, 40 bajtów

i;f(n){for(i=n;i--;)putchar(n%2?47:92);}

Wypróbuj na Ideone

betseg
źródło
2
putchar(92-n%2*45)jest tej samej długości.
mbomb007
6

J, 10 bajtów

#'\/'{~2|]

Jest to czasownik składający się z sześciu pociągów, składający się z:

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

To jest haczyk pomiędzy #i ('\/' {~ 2 | ]); hak (f g) yrozszerza się do y f (g y), więc to rozwija się do y # (... y), co dla pojedynczych znaków daje listę yznaków.

Druga część to 5-pociąg składający się z:

'\/' {~ 2 | ]

To ocenia na dwa widelce:

'\/' {~ (2 | ])

Wewnętrzny widelec 2 | ]ma moduł drugi. Zewnętrzny widelec jest zatem:

'\/' {~ mod2

Który pobiera ( {~) indeks mod2 ( mod2) z ciągu /.

Następnie za pomocą haka z góry:

y # (apt char)

Daje to, co chcemy i gotowe.

Conor O'Brien
źródło
6

Haskell, 25 bajtów

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

-1 bajt dzięki Damienowi z cycle.

xnor
źródło
1
f n=cycle"\\/"!!n<$[1..n]
Damien
@Damien Wow, jak zapomniałem o cyklu.
xnor
Nie wiem Ale cieszę się, że mogłem raz cię „pokonać” :)
Damien
6

Mathematica, 34 32 28 bajtów

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

Funkcja anonimowa. Bierze liczbę całkowitą jako dane wejściowe i zwraca listę znaków jako dane wyjściowe.

LegionMammal978
źródło
Możesz użyć ~Table~#.
Martin Ender,
Myślę, że został dodany w 10.2.
Martin Ender,
Myślę też, że możesz porzucić <>""i zwrócić listę znaków.
Martin Ender,
1
@MartinEnder Musieli także dodać, ~Do~Infinityi tak w 10.2+, a także ...
LegionMammal978 31.08.16
5

PowerShell, 30 27 bajtów

Aktualizacja:

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

Przejście na param, dzięki timmyd .


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

lub nieco bardziej czytelny

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

Test:

> 1..10 | % { ./run.ps1 $_ }
/
\\
///
\\\\
/////
\\\\\\
///////
\\\\\\\\
/////////
\\\\\\\\\\
krontogiannis
źródło
3
Witamy w PPCG! Miło widzieć tutaj innego użytkownika PowerShell. Możesz ogolić kilka bajtów, przyjmując dane wejściowe param($n)zamiast $args, na przykład dla 27 bajtów -param($n)('\','/')[$n%2]*$n
AdmBorkBork
5

Mathematica, 29 bajtów

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

Okrutnie wykorzystuje fakt, że [[1]]zwraca pierwszy argument funkcji, podczas gdy [[0]]zwraca samą funkcję (head), zastosowaną do dziwnie poprawnej funkcji o nazwie, dla "\\"której jest „oceniany” "/".

Greg Martin
źródło
To trochę mniej dziwne, gdy weźmie się pod uwagę, że coś w formie a[b]jest po prostu wyrażeniem ogólnym z głową a(indeks 0) i elementem b(indeks 1), a funkcje są tylko szczególnymi rodzajami wyrażeń (w rzeczywistości bardziej poprawne byłoby stwierdzenie, że funkcje nie są ' t wyrażeń w ogóle, ale są to po prostu reguły przekształcania wyrażeń, które zwykle mają formę f[x...]). :)
Martin Ender
2
Widziałem wiele języków nadużywanych na tej stronie, ale myślę, że to pierwsze nadużycie Mathematiki, jakie widziałem. Dobra robota!
DanTheMan
4

Fouriera, 27 bajtów

92~SI~N%2{1}{47~S}N(Sai^~i)

Wypróbuj online!

Rozpad beta
źródło
4

Brachylog , 15 bajtów

:2%:"\/"rm:?jbw

Wypróbuj online!

Wyjaśnienie

:2%                Input mod 2…
   :"\/"rm         …is the index of the element in string "\/",…
          :?j      …element that we juxtapose Input times to itself…
             bw    …and print to STDOUT after removing one slash/backslash
Fatalizować
źródło
4

CJam , 9 bajtów

ri_"\/"=*

Wypróbuj online!

Wyjaśnienie

ri     e# Read input and convert to integer N.
_      e# Duplicate N.
"\/"=  e# Use N as cyclic index into "\/", giving '\ for even and '/ for odd inputs.
*      e# Repeat N times.
Martin Ender
źródło
4

> <> (Ryba), 30 bajtów

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

Pierwszy raz używam tego języka, ale myślę, że przynajmniej zaoszczędziłem trochę miejsca, warunkowo używając / jako części danych wyjściowych lub lustra do przekierowania przepływu. Prawdopodobnie wciąż okropnie nieefektywna, ale wydaje mi się, że można by to przynajmniej trochę zmniejszyć.

Dane wejściowe to stos początkowy, dane wyjściowe to stdout

Wypróbuj online!

Callum Kerr
źródło
Witamy w Programowaniu Puzzle i Code Golf!
Dennis
@Dennis Thanks! Doceniam powitanie.
Callum Kerr
4

Dyalog APL , 11 bajtów

Wymaga ⎕IO←0ustawienia domyślnego w wielu systemach.

⊢⍴'\/'⊃⍨2|⊢

argument

przekształca (powtarza)

'\/'⊃⍨ ciąg „/” wybrany przez

2|⊢ pozostała część podziału, gdy argument jest podzielony na dwa

Wypróbuj APL online!

Adám
źródło
Fajne! Bardzo podobny do J.
Conor O'Brien
@ ConorO'Brien Tak, jedyną różnicą jest to, że 2-pociągi w J są hakami, podczas gdy są na szczycie w Dyalogu, więc potrzebny jest wyraźny lewy ząb.
Adám
Ach, zastanawiałem się, po co ten argument.
Conor O'Brien
1
Wreszcie odpowiedź APL ze wszystkimi znakami poprawnie renderowanymi dla mnie!
Cyoce,
@Cyoce Tak, chciałbym móc określić (i osadzić) czcionki w SE.
Adám
3

Java 7, 68 65 bajtów

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

3 bajty zapisane dzięki @ user902383 i @SeanBean .

Podobnie jak w przypadku tej odpowiedzi , najkrótszy kod-golf wydaje się zapętlać i drukować. Zarówno rekurencyjne, jak i
void c(int i){System.out.print(new String(new char[i]).replace("\0",i%2<1?"\\":"/"));}
wydaje się być dłuższe.

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wydajność:

/
\\
///
\\\\
/////
\\\\\\
///////
\\\\\\\\
/////////
Kevin Cruijssen
źródło
Cześć Kevin. Dlaczego nie wyrażenie Lambda?
Vale
@Vale Hi Vale. Ponieważ jestem staromodnym programistą Java 7. :) Jeśli masz odpowiedź w języku Java 8 lub 9, która różni się nieco od mojej odpowiedzi, możesz ją opublikować.
Kevin Cruijssen
2
@Vale (jest taki dziwny: P)
Shaun Wild
1
Myślę, że jeśli zmieni x=-1;++x<isię x=0;x++<imożna zmniejszyć o jeden bajt
user902383
1
Ponadto można wymienić "\\" : "/"z 92:'/';)
Shaun dziki
3

R, 47 46 bajtów

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

W R musisz uciec przed ukośnikiem. argument seprównież musi zostać w pełni sprecyzowany, ponieważ jest późniejszy .... Zatem irytująco mało okazji do zapisywania znaków :(

Dzięki bouncyball za grę w golfa w bajt.

JDL
źródło
1
Zaoszczędź jeden bajt, używając indeksowania:n=scan();cat(rep(c('\\','/')[n%%2+1],n),sep='')
bouncyball
3

T-SQL 50 bajtów

Oczywiście, że nie STDINtutaj, więc załóżmy taką zakodowaną INTzmienną jak ta: DECLARE @ INTwtedy rozwiązaniem jest:

PRINT IIF(@%2=0,REPLICATE('\',@),REPLICATE('/',@))
S.Karras
źródło
3

Pip , 8 bajtów

"\/"@aXa

Bezpośredni. Używa indeksowania modułowego, aby wybrać powtarzanie znaku i łańcucha, aby je pomnożyć. Wypróbuj online!


To pytanie przedstawia interesujące porównanie między Pip, Pyth i Jelly , przy czym dwa ostatnie mają po 5 bajtów. Wszystkie trzy języki mają dorozumiane dane wyjściowe, z operatorami jednokolumnowymi do indeksowania modułowego i powtarzania ciągów, i nie wymagają ucieczki odwrotnych ukośników w ciągach. Istnieją jednak dwie kluczowe różnice:

  1. W pewnych okolicznościach Pyth i Jelly potrzebują tylko jednego separatora, aby zdefiniować ciąg;
  2. Pyth i Jelly mają taką składnię, że dane wejściowe nie muszą być jawnie reprezentowane w kodzie (choć z bardzo różnych powodów, jak wyjaśnił mi Maltysen ).

Żadna z tych funkcji prawdopodobnie nie pojawi się w Pip 1 (nie podoba mi się estetyka niezrównoważonych separatorów, a bezcelowa składnia lub ukryte argumenty wydają się być zbyt obce mojemu parserowi wyrażeń infiksowych), ale „ w porządku z graniem na trzecim skrzypcach. Chociaż „czytelność” jest niezwykle względna podczas gry w golfa, twierdzę, że te trzy dodatkowe bajty sprawiają, że program Pip jest znacznie łatwiejszy do zrozumienia na pierwszy rzut oka - i w mojej książce jest to opłacalny kompromis.

1 Chociaż ciągi 'jednoznakowe w Pip używają pojedynczego separatora, zainspirowanego przez CJam i cytowanie w Lisp.

DLosc
źródło
Nie jestem pewien, czy czytelność jest plusem w golfowym kodzie? Nie kosztem bajtów !
GreenAsJade
@GreenAsJade Oczekuję, że wiele osób czuje to samo. Zrobiłbym tylko jedno rozróżnienie code golf:! = golflang design. Teraz możesz argumentować, że ta sama zasada (krótsza jest zawsze lepsza) dotyczy również projektowania języka. Mówię tylko, że dla mnie użyteczność, a nawet estetyka rozważaniami.
DLosc
Pro wskazówka dotycząca tworzenia języka golfowego: nie używaj
infix
pyth nie ma niejawnej składni bez punktów. działa prawie tak samo jak w Pythonie, dzięki czemu jest czytelny, a jednocześnie krótki. z drugiej strony twój komentarz na temat niezrównoważonych ograniczników jest całkiem prawdziwy
Maltysen
2

Pyth , 5 bajtów

*@"\/

Zestaw testowy.

Indeksowanie modułowe w ciągu, \/a następnie powtórzenie.

Leaky Nun
źródło
14
Jesteś cholernym wyzwaniem?
xnor
1
@ xnor to nie jest dokładnie moje wyzwanie.
Leaky Nun
2

Perl 6 , 16 bajtów

{<\ />[$_%2]x$_}

Stosowanie:

for 1..6 {
  say $_, {<\ />[$_%2]x$_}( $_ )
}
1/
2\\
3///
4\\\\
5/////
6\\\\\\
Brad Gilbert b2gills
źródło
2

Julia, 20 bajtów

!x="$("/\\"[x%2])"^x
Mama Fun Roll
źródło
2

SpecBAS - 28 bajtów

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

ODDzwraca 1, jeśli liczba jest nieparzysta, a następnie używa tego jako indeksu do wydrukowania poprawnego znaku n razy. Muszę dodać 1, ponieważ ciągi SpecBAS zaczynają się od znaku 1.

Brian
źródło
2

Java 8, 56 bajtów

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

Chciałbym podziękować @Kevin Cruijssen w zaawansowanym trybie za dalszą grę w golfa.

Program testów bez golfa

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);
}
Shaun Wild
źródło
2

Właściwie 10 bajtów

Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!

;'\'/2(%I*

Jak to działa

       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.
Sherlock9
źródło