A sequência Squiggly


29

Todos os créditos para Adnan por ter vindo com esse desafio.

Meu último desafio, antes que eu pare .

Tarefa

Dado inteiro positivo n, se nfor ímpar, repita /isso muitas vezes; se nfor par, repita \isso várias vezes.

(Sério, os casos de teste seriam muito mais claros do que esta descrição, basta olhar para os casos de teste.)

Especificações

  • Qualquer formato de entrada / saída razoável.
  • Aplicam-se brechas padrão .

Casos de teste

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

Respostas:


17

Javascript, 22 bytes

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

Define uma função anônima.

Se apenas *strings repetidas em Javascript. suspiros


11
Finalmente você encontrou o operador de direito
Leaky Nun

@LeakyNun Do que você está falando?
DanTheMan

Você estava usando o operador ternário para escolher o personagem, não?
Freira vazada

@LeakyNun Inicialmente, sim, mas se você olhar para o bate-papo, eu também postei isso cerca de um minuto depois.
DanTheMan

2
@Jordumus Você poderia atribuir a função a uma variável: f=n=>..., você poderia chamá-lo diretamente: (n=>...)(5). (Ou, se você estiver usando o Node.js REPL, então você poderia usar this._, que significa a última coisa que entrou)
DanTheMan



9

Perl, 20 bytes

Inclui +1 para -p

Execute com entrada no STDIN:

squigly.pl <<< 6

squigly.pl

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

Pode ser apenas a minha versão do Perl (ainda estou na 5.10), mas isso gera um erro, a menos que eu adicione um extra; até o fim. Eu acho que é porque você está usando o ponto e vírgula como um separador para y e você precisa de mais um para terminar a declaração (e precisaria de dois, se você tivesse mais linhas de código após este)
theLambGoat

@theLambGoat Tem certeza de que está usando a -popção? Eu uso ;no transliterado exatamente porque -ptem um implícito ;no final do código para que eu possa salvar mais 1 byte. Isso tem funcionado, pelo menos desde perl 5,6 (provavelmente enquanto a -popção existia de fato)
Ton Hospel

@theLambGoat Mm, eu encontrei um redhat antigo com o perl 5.10 onde de fato ele não funciona. Ou este é um patch redhat ou ele realmente não funcionou por cerca de 5,10 (estou certo que trabalhou em perls mais velhos e também funciona em perls mais recentes)
Ton Hospel

Estou executando no SUSE Enterprise Server 11, portanto, não é apenas uma coisa de redhat. Mas acho que, desde que funcione em algumas versões, ainda deve ser uma resposta válida. (Eu também verifiquei apenas em 5,08, a única outra versão que tenho acesso a no momento e ele não funciona lá também)
theLambGoat

11
Esse truque com o ;acréscimo de -pé bastante impressionante, bem feito.
Dada


7

C #, 42 bytes

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

Seleciona o caractere correto e cria uma nova sequência que consiste nesse caractere repetidas nvezes.


7

PHP, 38 bytes

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

(variante 38 bytes)

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

(variante 38 bytes)

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

(variante 40 bytes)

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



6

J, 10 bytes

#'\/'{~2|]

Este é um verbo de seis trens, composto por:

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

Este é um gancho entre #e ('\/' {~ 2 | ]); um gancho se (f g) yexpande para y f (g y), então isso se expande para y # (... y), o qual, para caracteres únicos, gera uma lista de ycaracteres.

A segunda parte é um trem de 5 trens, consistindo em:

'\/' {~ 2 | ]

Isso avalia dois garfos:

'\/' {~ (2 | ])

O garfo interno,, 2 | ]é o módulo dois. O garfo externo, portanto, é:

'\/' {~ mod2

Que pega ( {~) o índice mod2 ( mod2) da string /.

Em seguida, usando o gancho de cima:

y # (apt char)

Isso produz o que queremos e terminamos.


6

Haskell, 25 bytes

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

-1 byte graças a Damien com cycle.


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

@ Damien Wow, como eu esqueci o ciclo.
xnor

Eu não sei. Mas estou feliz por ter tido a oportunidade de "batida" você uma vez :)
Damien

6

Mathematica, 34 32 28 bytes

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

Função anônima. Pega um número inteiro como entrada e retorna uma lista de caracteres como saída.


Você pode usar ~Table~#.
Martin Ender

Eu acho que foi adicionado na 10.2.
Martin Ender

Além disso, acho que você pode abandonar <>""e retornar uma lista de caracteres.
Martin Ender

11
@MartinEnder Eles devem também ter adicionado ~Do~Infinitye tal 10.2+ bem ...
LegionMammal978

5

Powershell, 30 27 bytes

Atualizar:

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

Mudando para param, graças a timmyd .


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

ou um pouco mais legível

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

Teste:

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

3
Bem-vindo ao PPCG! É bom ver outro usuário do PowerShell por aqui. Você pode raspar alguns bytes usando a entrada como em param($n)vez de $args, como segue para 27 bytesparam($n)('\','/')[$n%2]*$n
#

5

Mathematica, 29 bytes

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

Cruelmente explora o fato de que [[1]]retorna o primeiro argumento de uma função enquanto [[0]]retorna a própria função (cabeça), aplicada à função estranhamente válida chamada na "\\"qual está sendo "avaliada" em "/".


É um pouco menos estranho quando você considera que algo do formulário a[b]é apenas uma expressão genérica com head a(index 0) e elemento b(index 1), e funções são apenas tipos especiais de expressão (na verdade, seria mais correto dizer que funções não são ' expressões, mas são simplesmente regras para transformar expressões que geralmente têm forma f[x...]). :)
Martin Ender

2
Vi muitos idiomas abusados ​​neste site, mas acho que esse é o primeiro abuso do Mathematica que vi. Bom trabalho!
31516 DanTheMan



4

Braquilog , 15 bytes

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

Experimente online!

Explicação

: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 bytes

ri_"\/"=*

Experimente online!

Explicação

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

> <> (Peixe), 30 bytes

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

Primeira vez usando esse idioma, mas acho que pelo menos economizei um pouco de espaço usando condicionalmente o / como parte da saída ou um espelho para redirecionar o fluxo. Provavelmente ainda terrivelmente ineficiente, eu sinto que provavelmente poderia ser reduzido um pouco mais, pelo menos.

Entrada é a pilha inicial, saída é stdout

Experimente online!


Bem-vindo à programação de quebra-cabeças e código de golfe!
Dennis

@Dennis Thanks! Agradeço as boas vindas.
Callum Kerr #

4

Dyalog APL , 11 bytes

Requer ⎕IO←0qual é o padrão em muitos sistemas.

⊢⍴'\/'⊃⍨2|⊢

o argumento

remodelar (repetições)

'\/'⊃⍨ a sequência "/" selecionada por

2|⊢ a divisão restante quando o argumento é dividido por dois

TryAPL online!


Legal! Muito parecido com J.
Conor O'Brien

@ ConorO'Brien Sim, a única diferença é que os trens de 2 em J são ganchos, enquanto estão no topo de Dyalog, então é necessário um dente esquerdo explícito.
Adám 31/08/16

Ah, eu queria saber por que o argumento estava lá.
Conor O'Brien

11
Finalmente, uma resposta da APL com todos os caracteres renderizados corretamente para mim!
Cyoce 31/08/16

@ Cyoce Sim, eu gostaria que pudéssemos especificar (e incorporar) fontes no SE.
Adám 31/08/16

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 salvos graças a @ user902383 e @SeanBean .

Assim como nesta resposta , o código de golfe mais curto parece circular e imprimir. Recursivo e
void c(int i){System.out.print(new String(new char[i]).replace("\0",i%2<1?"\\":"/"));}
parece ser mais longo.

Ungolfed & código de teste:

Experimente aqui.

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

Saída:

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

Oi Kevin. Por que não uma expressão lambda?
Vale

@Vale Hi Vale. Porque eu sou um programador Java 7 à moda antiga. :) Se você tiver uma resposta Java 8 ou 9 ligeiramente diferente da minha resposta, sinta-se à vontade para publicá-la.
Kevin Cruijssen

2
@Vale (ele é estranho assim: P) #
Shaun Wild

11
Acho que se você mudar x=-1;++x<ipara x=0;x++<ique você pode reduzir em um byte
user902383

11
Também você pode substituir "\\" : "/"com 92:'/';)
Shaun Wild

3

R, 47 46 bytes

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

Em R, você precisa escapar de barras invertidas. o argumento septambém precisa ser totalmente especificado, pois vem depois .... Assim, irritantemente poucas oportunidades para salvar caracteres :(

Graças ao bouncyball por jogar fora um byte.


11
Salve um byte usando a indexação:n=scan();cat(rep(c('\\','/')[n%%2+1],n),sep='')
bouncyball 31/08/16

3

T-SQL 50 bytes

Claro que não STDINaqui, então vamos assumir uma INTvariável codificada como esta: DECLARE @ INTentão a solução é:

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

3

Pip , 8 bytes

"\/"@aXa

Direto. Utiliza indexação modular para selecionar a repetição de caracteres e seqüências para multiplicá-lo. Experimente online!


Esta pergunta apresenta uma comparação interessante entre Pip, Pyth e Jelly , os dois últimos com 5 bytes. Todos os três idiomas têm saída implícita, com operadores de caractere único para indexação modular e repetição de cadeias, e nenhum requisito para escapar de barras invertidas nas cadeias. Existem duas diferenças principais, no entanto:

  1. Sob certas circunstâncias, Pyth e Jelly precisam de apenas um delimitador para definir uma string;
  2. Pyth e Jelly têm uma sintaxe tal que a entrada não precisa ser explicitamente representada no código (embora por razões muito diferentes, como Maltysen me explicou ).

É provável que nenhum desses recursos apareça no Pip 1 (não gosto da estética de delimitadores desequilibrados, e sintaxe sem pontos ou operandos implícitos parecem que seriam muito estranhos ao meu analisador de expressões infix), mas eu ' estou bem em tocar terceiro violino. Mesmo que a "legibilidade" seja extremamente relativa no golfe, eu argumentaria que esses três bytes extras tornam o programa Pip muito mais fácil de entender de relance - e, no meu livro, essa é uma troca interessante.

1 Embora, cadeias de caracteres únicos no Pip usem um único 'delimitador, inspirado no CJam e citando no Lisp.


Não tenho certeza de que a legibilidade seja uma vantagem, no código golf? Não à custa de bytes !
GreenAsJade 31/08

@GreenAsJade Espero que muitas pessoas sintam o mesmo. Eu apenas faria uma distinção code golf:! = golflang design. Agora você pode argumentar que o mesmo princípio (menor é sempre melhor) também se aplica ao design da linguagem. Só estou dizendo que, para mim, usabilidade e até estética são considerações.
DLosc 31/08/16

Pro dica para fazer uma linguagem de golfe: não use infix
Cyoce


pyth não possui sintaxe implícita de pontos livres. funciona da mesma maneira que em python, tornando-o legível e curto. seu comentário sobre os delimitadores desequilibradas, por outro lado é muito verdadeiro
Maltysen




2

SpecBAS - 28 bytes

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

ODDretorna 1 se o número for ímpar e o usa como índice para imprimir o caractere correto n número de vezes. É necessário adicionar 1, pois as cadeias SpecBAS começam no caractere 1.


2

Java 8, 56 bytes

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

Gostaria de agradecer a @Kevin Cruijssen em avançado por jogar minha resposta ainda mais.

Programa de Teste Ungolfed

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

Na verdade, 10 bytes

Sugestões de golfe são bem-vindas. Experimente online!

;'\'/2(%I*

Como funciona

       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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.