Dada uma cadeia N de comprimento menor que e maior que sinais ( <
, >
), insira os números inteiros de 0 a N no início e no final e entre cada par de sinais, para que todas as desigualdades sejam atendidas. Saída da string resultante. Se houver várias saídas válidas, produza qualquer uma (e apenas uma) delas.
Por exemplo
<<><><<
possui 7 caracteres, portanto, todos os números de 0 a 7 inclusive devem ser inseridos. Uma saída válida é
2<3<4>1<5>0<6<7
porque todas as desigualdades tomadas uma de cada vez
2<3
3<4
4>1
1<5
5>0
0<6
6<7
são verdadeiras.
Se desejado, a saída pode ter espaços ao redor dos sinais, por exemplo 2 < 3 < 4 > 1 < 5 > 0 < 6 < 7
.
O código mais curto em bytes vence.
Casos de teste
A primeira linha após uma linha vazia é a entrada e as próximas linhas são exemplos de saída válidos.
[empty string]
0
<
0<1
>
1>0
<<
0<1<2
<>
1<2>0
><
1>0<2
2>0<1
>>
2>1>0
<<<
0<1<2<3
><>
1>0<3>2
>><
3>2>0<1
3>1>0<2
2>1>0<3
>>>
3>2>1>0
>>><<<
3>2>1>0<4<5<6
6>3>1>0<2<4<5
4>2>1>0<3<5<6
4>3>1>0<2<5<6
<<><><<
2<3<4>1<5>0<6<7
>><><>>
7>6>0<5>1<4>3>2
<<<<<<<<<<<<<<
0<1<2<3<4<5<6<7<8<9<10<11<12<13<14
>><<<<><>><><<
6>5>4<7<8<9<10>3<11>2>1<12>0<13<14
14>5>4<7<8<9<10>3<11>2>1<12>0<13<6
code-golf
math
arithmetic
permutations
integer
Hobbies de Calvin
fonte
fonte
Respostas:
Retina , 20 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online! (A primeira linha permite um conjunto de testes separado por avanço de linha.)
Explicação
Uma maneira simples de encontrar uma permutação válida é começar inserindo os números de
0
paraN
em ordem e, em seguida, reverter os números ao redor de cada substring de>
s. Tome<><<>>><<
como exemplo:Ambas as tarefas são bastante simples na Retina, mesmo com as quais podemos realmente trabalhar com strings. Podemos salvar um byte adicional inserindo os números de
N
baixo para cima0
e revertendo as seções ao redor<
, mas o princípio é o mesmo.Etapa 1: Substituição
Começamos inserindo o comprimento de
$'
(o sufixo, ou seja, tudo após a partida) em todas as posições possíveis na entrada. Isso insere os números deN
baixo para0
.Etapa 2: Divisão
Dividimos a entrada
>
em linhas separadas, para que cada linha seja um número individual ou uma lista de números unidos<
.Etapa 3: classificação
Dentro de cada linha (
%
), ordenamos (O
) os números (\d#
) pelo seu valor numérico (#
). Como inserimos o número na ordem numérica reversa, isso os reverte.Etapa 4: Substituição
Transformamos os feeds de linha
>
novamente para juntar tudo de volta em uma única linha. É isso aí.Como uma observação lateral, pretendo adicionar uma maneira de aplicar
%
a outros delimitadores que não sejam feeds de linha. Se eu já tivesse feito isso, esse envio teria sido de 14 bytes, porque os três últimos estágios seriam reduzidos a um único:fonte
> <> ,
464335 + 4 para-s=
= 39 bytesEsta é uma implementação do algoritmo do xnor em> <>.
Ele pega a sequência de entrada na pilha (
-s
sinalize com o intérprete padrão).Você pode experimentá-lo no intérprete online .
fonte
> <> , 26 + 4 = 30 bytes
Experimente online! +4 bytes para o
-s=
sinalizador - se-s
estiver tudo bem (isso significaria que o sinalizador precisaria ser descartado inteiramente para entrada vazia), então seria +3.Supõe que a entrada STDIN esteja vazia e
i
produz -1 (o que ocorre no EOF). O programa erro ao tentar imprimir este -1 como um caractere.Usa a abordagem max-de-nums-até-longe-para
>
-min-de-nums-até-longe<
.Um programa que sai corretamente e não assume o STDIN é de 4 bytes extras:
fonte
CJam , 16 bytes
Experimente online!
Um porto da minha resposta Retina .
Explicação
fonte
Perl, 29 bytes
Inclui +2 para
-lp
Execute com entrada no STDIN, por exemplo
Resultado:
order.pl
:Explicação
Tenha dois contadores, max começando com o comprimento da string, min começando com 0. Então, em cada limite (incluindo o início e o fim da string), se for um pouco antes de
<
colocar o mínimo lá e aumentar em 1, caso contrário, coloque o máximo lá e diminua por 1 (no final da sequência, não importa qual contador você tome, pois ambos são iguais)fonte
s{}{/\G/...}
Eu nunca vi isso antes, é brilhante.Python 2, 67 bytes
Uma função recursiva. Satisfaz cada operador, por sua vez, colocando o menor valor não utilizado
x
para ax<
maior e mais parax>
. O menor valor não utilizado é armazenadoi
e atualizado, e o maior valor não utilizado é deduzidoi
e o comprimento restante.fonte
(s>'=')
vez de(s>='>')
salvar um byte?<
e>
não são pontos de código consecutivos.=
entre<
e>
.Python 2,
163137 bytesEmbaralha os números até que a instrução avance para
True
.Tente.
fonte
APL, 33 bytes
⍋⍋
é extraordinariamente útil.Explicação
fonte
⍋⍋
) fazem?⍋
é grau, que retorna as indicações na ordem classificada. Ao fazer isso duas vezes, você obtém1
onde estava o menor número,2
onde estava o próximo número menor, etc.JavaScript (ES6),
7456 bytesComeça com o conjunto de números
0...N
. Em cada estágio, basta pegar o maior (l
) ou o mínimo (j
) dos números restantes; o próximo número deve, por definição, ser menor ou maior que isso. Edit: salvou um enorme 18 bytes graças a @Arnauld.fonte
replace
? Talvezs=>s.replace(/./g,c=>(c<'>'?j++:l--)+c,j=0,l=s.length)+j
replace
) até 74 bytes ...Pitão - 19 bytes
Viva a comparação!
Não funciona on-line, por segurança de avaliação.
fonte
2sable , 20 bytes
Explicação
Experimente online!
Para N <10, isso poderia ter sido 14 bytes:
fonte
C #,
10299 bytesUngolfed:
fonte
r = r +
peça para uma tarefa composta economizaria alguns bytes?r+
parte do lado direito informa ao compilador que a coisa toda é uma string, portanto a representação de stringc
é usada. Se eu usasser+=
, a?:
parte seria avaliada como anint
, o valor ordinal dec
seria adicionado a isso e só então seria convertido em sua representação de string.Java 8,
126125 bytesEu acho que isso nem funciona hehe
Programa de teste ungolfed
fonte
.replaceAll
para.replace
e remover os parênteses(c+"")
para economizar 5 bytes.Geléia ,
27 1412 bytesPorto da solução CJam @Martin Enders
-2 bytes graças a @Dennis
Teste em TryItOnline
Quão?
O método anterior era interessante matematicamente, mas não tão ...
Isto usa o sistema de base fatorial para encontrar um índice das permutações de [0, N] que satisfarão a equação.
fonte
U
vetoriza, assim você não precisa€
.żJ0;
salva outro byte.Clojure,
152132126 bytesEconomizei um número razoável de bytes, eliminando o máximo de espaço em branco possível. Percebi que espaço em branco não é necessário para separar um parêntese de outro caractere.
Basicamente, uma porta Clojure da resposta do @ Scepheo. Funciona de forma idêntica.
Essas
recur
chamadas são assassinas!Suponho que poderia ter usado átomos para limpá-lo.Asswap!
chamadas necessárias para usar átomos adicionados à contagem: /Agradeço a @amalloy por me salvar alguns bytes.
Ungolfed:
fonte
loop
ligação, antess
e depoisa
. Você também pode raspar um pouco, substituindo aif
árvore com umcase
:(case c \< (recur ...) nil (str ...) (recur ...))
. E, claro,cr
poderia ser um nome mais curto.Haskell, 162 bytes
Isso é muito longo.
fonte
Perl (107 + 1 para -p) 108
Algoritmo roubado da resposta de Martin Ender ♦
fonte
Ruby, 135 bytes
Nota: A complexidade do tempo é grande (O (n!)).
fonte
Python 2,
176172 bytesNão é muito curto comparado aos outros, mas estou feliz por ter resolvido isso tão rapidamente.
Experimente online
Ungolfed:
Experimente online
fonte
zip
pop
), mas é um pouco menor. SeN<10
eu pudesse reduzir a rigidez.PHP, 190 bytes
aleatória até que exista uma solução válida
381 bytes, obtenha todas as soluções e escolha uma
fonte