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 \\\\\\

Odpowiedzi:


17

JavaScript, 22 bajty

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

Definiuje anonimową funkcję.

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


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



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;\\/

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

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.


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



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.


6

Haskell, 25 bajtów

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

-1 bajt dzięki Damienowi z cycle.


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.


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 $_ }
/
\\
///
\\\\
/////
\\\\\\
///////
\\\\\\\\
/////////
\\\\\\\\\\

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” "/".


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

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

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.

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!


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!


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ść:

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

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.


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('/',@))

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.


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

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.


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

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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.