Este é o segundo de uma série, o terceiro é Duas estradas divergindo em uma madeira amarela (parte 3)
Isso é baseado em duas estradas divergindo em uma madeira amarela (parte 1) , um desafio anterior da minha. Foi bastante bem recebido, mas também foi bastante trivial (uma resposta Java em 52 bytes!) Então, fiz algo mais complexo ...
A inspiração
Este desafio é inspirado no famoso poema de Robert Frost, "The Road Not Taken":
Duas estradas divergiam em um bosque amarelo.
E , desculpe, eu não podia viajar pelas duas.
E ser um viajante, por muito tempo eu fiquei.
E olhei para uma delas o mais longe que pude
.... 2 parágrafos aparados ...
Vou contar isso com um suspiro
Em algum lugar, eras e eras daqui em diante :
duas estradas divergiam em um bosque, e eu -
eu peguei a menos percorrida,
e isso fez toda a diferença.
Observe a penúltima linha I took the one less traveled by,
,. Seu objetivo é encontrar a estrada menos percorrida em sua entrada de string. Você deve emitir um dos 2 valores que são distintos um do outro que sinalizam em que direção você deve virar para pegar a estrada menos percorrida. Uma vez que a estrada bifurca (a trilha dos hexágonos muda para números), você está no cruzamento. A partir daí, haverá 2 caminhos compostos por dígitos. O caminho cujos dígitos têm a menor soma será o caminho não percorrido. Observe que a estrada não percorrida pode ter um caminho maior, mas uma soma menor. Aqui estão alguns exemplos / casos de teste de um programa que imprime "left" ou "right" para o caminho não percorrido:
1 2
1 2
1 2
#
#
#
left (3 < 6)
1 2
2 2
1 1
#
#
#
left (4 < 5)
12 2
11 2
1 1
#
#
#
right (6 > 5)
99 989
99 89
99 99
99 99
#
#
#
#
left (72 < 79)
1111 1110
001 111
11 11
11 11
#
##
##
##
left (9 < 10) (Note: 1111 is interpreted as 1+1+1+1=4, not 1111=1111)
1 1
0 1
1 1
1 1
1 1
1 1
1 1
#
#
#
#
#
left (6 < 7)
1 1
0 1
1 1
1 1
1 1
1 1
1 1
#
#
#
#
#
left (6 < 7)
Coisas para assumir e lembrar
- Sempre haverá 2 caminhos. Nem mais nem menos.
- Você pode obter a entrada do STDIN uma linha de cada vez, uma sequência contendo caracteres LF ou uma sequência contendo uma barra invertida literal e um n. Se você precisar de alguma outra forma, peça aprovação nos comentários.
- Você não precisa se preocupar com entradas inválidas ou caminhos vinculados. Esses nunca serão inseridos no seu programa / função.
- A entrada pode ter qualquer comprimento em largura ou altura, menor que o limite de caracteres do seu idioma.
- Nunca haverá um
#
e um número na mesma linha. - Todos os dígitos no caminho são números inteiros positivos de 0 a 9.
- Entrada ou saída com uma nova linha à direita é permitida.
- Veja minha resposta JS ES6 abaixo para um exemplo.
- Sempre haverá pelo menos 1 espaço entre os 2 caminhos.
- Os 2 caminhos sempre terão a mesma altura para cada mapa, mas podem ser diferentes em outros mapas.
- Se você está confuso sobre um caso de teste específico, por favor me diga.
- 1111 é interpretado como 1 + 1 + 1 + 1 = 4, não 1111 = 1111. O mapa é uma série de números de um dígito, não números de comprimento arbitrário.
- Isso é código-golfe , então a resposta mais curta em bytes vence!
- Lacunas padrão proibidas
Se você tiver alguma dúvida sobre esse desafio, pergunte-me nos comentários e boa sorte!
fonte
$("div > h1").map(function(){return $(this).text()}).get().join("\n");
no seu console!let answers = $('div > h1').map(function(){return $(this).clone().children(':not(a)').remove().end().text().replace(/\s+/g,' ').trim()}).get();answers.splice(0, 1);answers.join('\n');
Respostas:
05AB1E ,
2115 bytesSaídas 0 para esquerda e 1 para direita.
Experimente online!
Explicação
fonte
Retina , 28 bytes
Experimente online!
Impressões
0
para a esquerda e1
para a direita. Assume que não há espaços à direita em nenhuma linha.Explicação
Converta cada dígito
N
em uma sequência deN
unidades.Uma em cada linha (
%
), combine as consecutivas (\G
) a partir do final (r
) e substitua cada uma por-
(por exemplo, transforme o ramo direito em-
s).Classifique todos os caracteres, para que todos os
-
s estejam diretamente na frente de todos os1
s.Cancele repetidamente um par de
-
e1
.Tente combinar pelo menos um
1
(se houver, havia mais pesos no caminho esquerdo).fonte
Python 2 ,
95898887 bytesAqui está minha primeira tentativa nisso em python. Definitivamente não é o ideal, mas um começo decente.
Experimente online!
fonte
"#"!=y
com"#"<y
Chip , 216 bytes
Experimente online!
Um pouco maior que a resposta para a parte 1 ...
visão global
O chip é uma linguagem 2D inspirada nos circuitos reais e lida com os bits componentes de cada byte em um fluxo de bytes.
Esta solução mantém uma soma contínua dos dígitos que vê, invertendo o sinal da entrada cada vez que encontra um trecho de espaço em branco e terminando no primeiro
#
. Então, para entradaNós recebemos
1 + 1 - 1 - 2 + 2 - 2 + 1 - 1 = -1
. O sinal do resultado é dado como saída, um número negativo produz o resultado1
e positivo é0
.Portanto, saída de
1
significa que o caminho esquerdo é menos usado e0
significa direito.Explicação
Em um nível alto, é assim que funciona:
A diagonal principal com os
@
elementos é o acumulador, a saída é decidida peloa
na parte inferior. (Oito pares de@
médias de oito bits, mas o bit mais alto é o sinal, portanto, esta solução pode lidar com uma diferença máxima de +127 ou -128. Transbordar parcialmente é bom, desde que voltemos antes de terminar.)As quatro linhas que começam como
Ax]}#--
... estão lendo a entrada e, no caso de um dígito, negando-a (se necessário) e passando o valor para os somadores.As três primeiras linhas decidem se estamos olhando para um dígito ou uma sequência de espaço em branco e controlamos se os dígitos precisam ser negados.
Os elementos restantes inseridos sob as entradas e os elementos à direita tratam da condição de terminação e mapeiam a saída para ASCII (para que obtenhamos caracteres
'0'
ou em'1'
vez de valores0x0
ou0x1
. Esse mapeamento ASCII não exigia bytes extras, caso contrário eu não incluí-lo.)fonte
JavaScript (ES6), 55 bytes
Assume que não há espaços à direita em cada linha e saídas
true
pararight
,false
paraleft
. O truque é combinar cada dígito na entrada e, se houver um espaço depois na mesma linha, subtraí-o do total; caso contrário, adicione-o ao total. Se o total final for menor que 0, o caminho certo será o menos percorrido e vice-versa.Experimente:
fonte
x=
no início, porque expressões não são permitidas, apenas funções armazenadas como uma variável e programas inteiros.Python 3 ,
8594 bytesExperimente online!
Maldições! Não leu o problema perto o suficiente. Adicionada a correção (
''.join()
), mas ao custo de 9 bytes.fonte
Python 2, 78 bytes
-1 byte graças a @math_junkie
Experimente online
Imprime
False
para o caminho esquerdo eTrue
para o direitofonte
r=-r
em vez der*=-1
deve salvar um byteRetina , 180 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Eu pensei em tentar também uma solução somente regex (o acima é um regex .NET simples que corresponde apenas às entradas onde o caminho correto deve ser seguido, exceto pelo uso
¶
como abreviação de\n
).É irritantemente repetitivo, mas é o que acontece quando você precisa tratar cada dígito possível individualmente.
A solução é uma aplicação bastante direta de grupos de balanceamento : primeiro somamos os dígitos no ramo esquerdo pressionando
N
capturas na pilha3
para cada dígitoN
. Em seguida, tentamos alcançar o#
, enquanto popping dos3
N
tempos da pilha para cada dígitoN
no ramo direito. Isso só é possível se a soma dos dígitos no ramo esquerdo for maior que a soma no ramo direito (já que você não pode sair de uma pilha vazia).fonte
[0-9]
para corresponder a todos os dígitos ou\d
?JavaScript (ES6),
106104 bytess
é uma função que retornatrue
se a estrada não percorrida estiver à esquerda. Ungolfed:fonte
PowerShell , 80 bytes
Experimente online!
(Apenas chiando nas respostas do Python.: D)
Saídas
True
para o caminho esquerdo eFalse
para o caminho direito.Recebe a entrada como uma string delineada com
`n
, que é o equivalente do PowerShell de "uma string contendo uma barra invertida literal e um n" ou como uma string multilinha literal. Em seguida,-split
inserimos essa entrada\s
(espaço em branco, incluindo novas linhas) ou#
filtramos todos os resultados vazios-ne''
, deixando apenas uma matriz de dígitos. Aqueles são alimentados em um loop|%{...}
.A cada iteração, primeiro pegamos o elemento atual
$_
, o convertemos como umachar
matriz,-join
juntamente com um sinal de mais+
e o canalizamosiex
(abreviado paraInvoke-Expression
e semelhante aeval
). Está armazenado em,$i
para que possamos resumir corretamente os dígitos nesse pedaço específico do caminho. Em seguida, usamos isso e seu negativo como os dois elementos de uma matriz($i, -$i)
, indexados ao inverter um valor booleano para frente e para trás. Ou seja, a primeira iteração nesse loop, o primeiro bloco de caminho esquerdo, indexaremos-$i
; da próxima vez, vamos levar$i
; e assim por diante. Aqueles são acumulados$a
com+=
.Por fim, avaliamos se
$a
há-g
reatert
han0
. Se for, o caminho certo possui uma soma maior, caso contrário, o caminho esquerdo possui uma soma maior. Esse resultado booleano é deixado no pipeline e a saída é implícita.fonte
CJam ,
1918 bytesExperimente online!
Imprime
0
para esquerda e1
para a direita.Explicação
fonte
Mathematica,
8077 bytesAgradecemos a Martin Ender por economizar 3 bytes!
Função pura pegando uma string delimitada por nova linha como entrada e retornando
True
para pegar o caminho esquerdo,False
para pegar o caminho certo. Malditos nomes de comandos longos do Mathematica; isso é como 10 fichas.fonte
Pip ,
1918 bytesRecebe a entrada como uma única string na linha de comando (que precisará de aspas e escape de novas linhas se executada em uma linha de comando real). Saídas
-1
para esquerda,1
para direita. Experimente online!Explicação
Faz um loop sobre execuções de dígitos, adicionando somas de dígitos a uma contagem. O sinal da contagem é trocado a cada vez, com o resultado final de que os valores à esquerda são negativos e os valores à direita são positivos. Em seguida, imprimimos o sinal da contagem final (
-1
ou1
).fonte
Haskell , 64 bytes
Experimente online! Uso: A função anônima
(>0).f.words
usa como argumento uma string separada por nova linha e retornaFalse
para a esquerda eTrue
para a direita.Explicação:
Dada uma entrada
que é a cadeia
" 99 989\n 99 89\n 99 99\n #\n #\n #"
, em seguida,words
retira todas as novas linhas e espaços e retorna uma lista dos restantes strings:["99","989","99","89","99","99","#","#","#"]
. A funçãof
pega os dois primeiros elementosa
eb
nessa lista e verifica sea
há uma sequência de dígitos comparando-a com a sequência "#". (Como o caractere'#'
é menor que todos os caracteres de dígito'0'
, será negativo e, caso contrário, positivo para o caminho certo, portanto'1'
, ... cada string que começa com um dígito será lexicographically maior do que"#"
.) A funçãog
mapeia cada caractere em uma string de seu código de caracteres ASCII e retorna sua soma. Emf
aplicamosg
aa
eb
e computaçãog a - g b
, que é o valor do caminho da esquerda, deduzido o valor do direito, e adicioná-lo a uma chamada recursiva paraf
para lidar com as seguintes linhas. Se o caminho esquerdo for mais percorrido, o resultadof
(>0)
verifica se o resultado é maior que zero.fonte
Python 3 , 84 bytes
Como todos os envios atuais de Python são funções, pensei em contribuir com um programa completo.
Imprime
True
se o caminho esquerdo for menos percorrido,False
caso contrário. Experimente online!Para cada linha de entrada, isso divide-se em espaço em branco, soma os dígitos de cada elemento resultante e o adiciona a uma contagem enquanto inverte o sinal da contagem a cada etapa. Ele continua lendo as linhas de entrada até atingir uma com a
#
, quando nesse pontomap(int,n)
gera uma exceção e saímos do loop, imprimindoTrue
se a contagem é positiva ouFalse
não.fonte
Lote, 169 bytes
Imprime
0
para a esquerda e os dígitos esquerdo e direito adicionam os dígitos direitos e subtraem os dígitos esquerdos. Finalmente, o resultado é deslocado para extrair o sinal.-1
para a direita. Nota: lê as linhas até encontrar uma com a#
e depois para de ler. A diferença nas somas do caminho é limitada a 511 (adicione 1 byte para suportar diferenças maiores). Não mais que 9 dígitos em cada linha de cada caminho (suporta qualquer número de linhas). Explicação: Ad
sub-rotina utiliza dois parâmetros: adicionar ou subtrair e o (s) dígito (s). Ele extrai o último dígito por módulo por 10 e os dígitos restantes dividindo por 10 e se chama recursivamente enquanto ainda existem dígitos restantes. Ac
sub-rotina usa três parâmetros: se deseja adicionar ou subtrair, os dígitos a serem adicionados ou subtraídos e outros dígitos a serem adicionados. Isso chama od
sub-rotina para manipular os dígitos a serem adicionados e, em seguida, passa a tratar dos dois primeiros parâmetros. Isso significa que chamar ac
sub-rotina com os parâmetros-
fonte
Oitava, 46 bytes
Experimente online! Uma função que recebe uma matriz de caracteres 2D
a
como entrada.Explicação:
fonte
Java 7,
219216 bytesPouco mais de 52 bytes neste momento. ;)
E novamente retorna
false
para a direita etrue
para a esquerda.Explicação:
Código do teste:
Experimente aqui.
Saída:
fonte