Usando o menor número de caracteres Unicode, escreva uma função que aceite três parâmetros:
- Número total de dominós
n
th dominó afetado- Derrubar a direção do dominó afetado (
0
ouL
para a esquerda1
ouR
para a direita)
Depois que um dominó é derrubado, ele também deve derrubar os dominós restantes na mesma direção.
Você deve exibir os dominós |
representando um dominó em pé \
e /
representando um dominó tombado para a esquerda e direita, respectivamente.
Exemplos
10, 5, 1
deve retornar ||||//////
6, 3, 0
deve retornar\\\|||
if(third_parameter)
vez deif(third_paramter=='l')
Respostas:
Ruby, 38 (46) caracteres
Esta função assume a direção como um número inteiro (
1
para a direita,0
para a esquerda). Uma função que usa uma string tem 8 caracteres a mais:Exemplos de uso:
fonte
Haskell, 70
assumindo que há um tipo de direcção , o qual tem construtores R e L .
fonte
J -
3226 carJ não pode lidar com mais de dois argumentos sem usar uma lista e não pode lidar com listas não homogêneas sem boxe. Portanto, ter a entrada como uma lista de três números inteiros é ideal. A ordem dos parâmetros é o inverso do padrão: 0 para a esquerda ou 1 para a direita e, em seguida, posição e número total de dominós. A razão para isso é que J acabará passando por eles da direita para a esquerda.
Aqui está o que está acontecendo.
F`G/
aplicado a uma listax,y,z
avaliaráx F (y G z)
.y G z
constrói as duas maneiras possíveis que os dominós poderiam ter derrubado e, em seguida,F
usax
para selecionar qual dos dois usar.A seguir, é apresentado um J-REPL que explica como a função é construída em conjunto: linhas recuadas são inseridas no REPL e as respostas são alinhadas com a margem esquerda. Lembre-se de que J avalia estritamente da direita para a esquerda, a menos que haja parênteses:
À custa de alguns caracteres, podemos fazer da ordem a ordem padrão: basta acrescentar
@|.
ao final da função:Adaptar isso para trabalhar com um argumento de string para direção seria muito mais caro, no entanto.
fonte
/
também a maneira de criar duas saídas e selecionar a desejada. Acho que sinto que isso não tem o reconhecimento que merece.PowerShell, 66
Provavelmente a mesma ideia que todo mundo tinha.
fonte
Golfe (44
53)Meu primeiro programa de golfe. Demorei muito mais do que deveria e provavelmente pode ser feito de maneira mais inteligente e concisa (tenho certeza de que alguém provará isso :)):
Uma entrada de amostra é
10 5 0
.Ungolfed:
fonte
d
por ser0
/ em1
vez de'l'
/ o'r'
que fornece um código mais curto. Caso contrário, se você armazenard'l'=
em uma variável oyu, use-a em vez da segunda comparação comd
. No termo,x i j
você pode salvar os dois espaços em branco se usar um nome de variável não alfanumérico em vez dei
.'l'
/'r'
porque na época ainda não vi que somos livres para usar números inteiros. O truque não alfanumérico é liso, obrigado! Talvez eu atualize a resposta mais tarde.GolfScript,
2823 caracteresArgumentos no topo da pilha, tente online :
fonte
Python - 45
52Isso requer
1
para a direita e0
para a esquerda.Aqui está uma versão que leva
r
el
corretamente, em 58 :Alguns exemplos de uso ...
fonte
JS (ES6) -
7974726562graças a @nderscore!
O terceiro parâmetro é um booleano (0: esquerda / 1: direita)
fonte
d=(a,b,c)=>"\\"[r="repeat"](!c&&a-b+1)+"|"[r](--b)+"/"[r](c&&a-b)
[r='repeat'][r]
15 caracteres..repeat.repeat
14 charsPython2 / 3-54
Essa última regra adicionada foi bastante agradável (0/1 em vez de 'l' / 'r'). Tornou o meu realmente menor que a solução python existente. 0 é deixado, 1 é certo
fonte
Haskell , 42 bytes
Experimente online!
Toma entrada como
(%) n k b
nosn
dominós, comk
o dominó derrubado, na direçãob
.Localiza o caractere em cada posição,
c
variando de1
atén
usando uma expressão aritmética para calcular o índice de caracteres 0, 1 ou 2.Casos de teste retirados daqui .
Haskell , 44 bytes
Experimente online!
Uma estratégia interessante que acabou um pouco mais. Gera a sequência
"\\|/"<*[1..n]
comn
cópias consecutivas de cada símbolo e pega uma fatia den
caracteres contíguos com a posição inicial determinada aritmeticamente.fonte
Python 2.7,
68 65 61 5958 caracteresUse
d=1
para esquerda ed=0
direitaNota: Agradecemos a @TheRare por jogar mais.
fonte
d and'\\'...or'/'...
?('\\'...,'/'...)[d]
f=lambda a,p,d:('|'*(p-1)+'/'*(a-p+1),'\\'*p+'|'*(a-p))[d]
Also, I don't think your code works when falling left.
Você poderia dar um caso de teste para provar?Javascript, 46 caracteres
Parece trapaça fazer 0 = le 1 = r, mas existe. Encolheu-o com um pouco de recursão.
editar: perdeu um personagem óbvio
fonte
JavaScript (ES6) 61
63Editar Foi um buggy - vergonha para mim.
Não é tão diferente do @xem, mas o achei por mim mesmo e é mais curto. O parâmetro d é 0/1 para esquerda / direita
Teste no console do Firefox
Saída
fonte
--p
?Perl,
6765 caracteresAtribua os três primeiros parâmetros (total, posição, direção como um número inteiro [0 à esquerda, 1 à direita]). Os extras vão para o éter. Subtraia 1 da posição se estivermos indo para a direita, para que o dominó na posição X também seja invertido.
fonte
$p--if$d
com$p-=$d
a perder dois personagens :)Haskell , 57 bytes
4 bytes salvos graças a esta dica
Experimente online!
Haskell ,
69616058 bytesExperimente online!
Não é uma resposta muito complexa, mas supera as duas respostas existentes de Haskell.
fonte
R ,
75686157 bytesUma função anônima. Vou postar uma explicação mais completa, se houver interesse.
Experimente online!
fonte
Haskell , 51 bytes
a
= número de dominós,b
= índice baseado em 1 do tocado,c
= direção (à0
esquerda e à1
direita).Experimente online!
fonte
(a#b)c= ...
.PHP - 64
Um loop simples e ecoando o personagem.
Gera um
Notice: Undefined variable: i
, aqui está outra versão que silencia o erro (65 caracteres):E uma versão sem erros (69 caracteres):
Outras funções no PHP:
sprintf
/printf
paddingpreenchimento via
str_pad
/str_repeat
funçõesusando as funções
printf
estr_repeat
fonte
Scala 75 caracteres
fonte
CJam - 20
O código principal está na segunda linha, a primeira linha é apenas para obter os parâmetros da entrada padrão (caso contrário, você precisa colocar os parâmetros no código).
Experimente em http://cjam.aditsu.net/
Exemplos:
Explicação:
:X
armazena o último parâmetro (0/1 direção) na variável X-
subtrai X do bate-over posição, obtendo o comprimento da primeira sequência de caracteres (vamos chamá-lo L)_
faz uma cópia de L"\|"X=
recebe o personagem para usar em primeiro lugar:\
para X = 0 e|
para X = 1*
repete esse caractere L vezeso
imprime a string, removendo-a da pilha-
subtrai L do número de dominós, obtendo o comprimento da segunda sequência de caracteres (vamos chamá-lo de R)"|/"X=
obtém o caractere use next:|
para X = 0 e/
para X = 1*
repete esse caractere R vezesfonte
Lisp comum
Isso não ganha em um código de golfe, mas destaca a diretiva de formato de justificação do Common Lisp:
A aritmética não é ruim:
n
é o número total de dominós;p
é a posição do primeiro dominó tombado;d
é um0
ou ou1
representa esquerda e direita (conforme permitido nos comentários) e é usado como um índice parax
;x
é uma cadeia de\
,|
e/
. A cadeia de formato usa duas diretivas de justificação (aninhadas), cada uma das quais permite um caractere de preenchimento. Portanto:fonte
PHP, 89 caracteres
Só porque eu amo PHP.
EDIT: O código a seguir faz o mesmo.
fonte
($i+1>$p)
. 2) Reescrevendo sua expressão ternária para$d?($i+1<$p?'|':'/'):$i+1>$p?'|':'\\'
salvar outros 3 bytes. Ou apenas remova==0
e inverta as direções. 3) Com$i++<$a
você pode remover$i++
da condição de postagem e usar em$i
vez de$i+1
(-6 bytes). 4)$i=0
não é necessário; mas você teria que suprimir avisos (opção--n
) se você removê-lo (-4 bytes).J ,
23 2119 bytesExperimente online!
Entrada é uma lista de números inteiros na ordem padrão.
fonte
05AB1E , 19 bytes
Ainda tenho a sensação de que é um pouco longo, mas funciona .. E melhor do que a solução inicial de 23 bytes que tive com a construção if-else, que eu larguei rapidamente ..
A ordem de entrada é a mesma do desafio: comprimento total, índice,
1
/0
para esquerda / direita, respectivamente.Experimente online ou verifique os dois casos de teste .
Explicação:
fonte
C ++ 181
fonte
return 0
demain
.C(n)>>k>>p
seria curto-circuito doC(n)C(k)C(p)
que não? E se a definição para P () pudesse especificar o argumento, isso não salvaria caracteres para todas as aspas? E quando você compara p com 'l' e 'r': 0 e 1 seriam menores - especificamente> 0 em vez de == 'r' e <1 em vez de == 'l' (assumindo que você está bem usando números em vez de r / l - se não <'r' ainda for menor que == 'l' e> 'l' ainda for menor que == 'r')PHP -
105,97, 96Resultados de exemplo:
fonte
Javascript,
8185 caracteresPrimeira vez tentando codegolf, foi divertido obrigado :)
fonte
JavaScript - 85 caracteres
1 = Esquerda, 0 = Direita
fonte
Clojure, 81 caracteres
fonte
vb.net (~ 75c)
fonte