Considere um pedaço de corda (como em "corda", não como em "um monte de caracteres"), que é dobrado para frente e para trás na linha real. Podemos descrever o formato da string com uma lista de pontos pelos quais ela passa (em ordem). Para simplificar, assumiremos que todos esses pontos são inteiros.
Tome como exemplo [-1, 3, 1, -2, 5, 2, 3, 4]
(observe que nem cada entrada implica em uma dobra):
A corda que se estende ao longo da direção vertical é apenas para fins de visualização. Imagine a corda toda achatada na linha real.
Agora, aqui está a pergunta: qual é o maior número de peças em que essa corda pode ser cortada com um único corte (que teria que ser vertical na figura acima). Nesse caso, a resposta é 6 com um corte em qualquer lugar entre 2
e 3
:
Para evitar ambiguidades, o corte deve ser realizado em uma posição não inteira.
O desafio
Dada uma lista de posições inteiras pelas quais uma string é dobrada, você deve determinar o maior número de partes em que a string pode ser cortada com um único corte em uma posição não inteira.
Você pode escrever um programa completo ou uma função. Você pode receber entradas via STDIN, argumento de linha de comando, prompt ou parâmetro de função. Você pode gravar a saída em STDOUT, exibi-la em uma caixa de diálogo ou retorná-la da função.
Você pode supor que a lista esteja em qualquer formato conveniente de lista ou string.
A lista conterá pelo menos 2 e não mais de 100 entradas. As entradas serão inteiras, cada uma no intervalo -2 31 ≤ p i <2 31 . Você pode assumir que não há duas entradas consecutivas iguais.
Seu código deve processar qualquer entrada (incluindo os casos de teste abaixo) em menos de 10 segundos em um PC de mesa razoável.
Casos de teste
Todos os casos de teste são simplesmente de entrada, seguidos de saída.
[0, 1]
2
[2147483647, -2147483648]
2
[0, 1, -1]
3
[1, 0, -1]
2
[-1, 3, 1, -2, 5, 2, 3, 4]
6
[-1122432493, -1297520062, 1893305528, 1165360246, -1888929223, 385040723, -80352673, 1372936505, 2115121074, -1856246962, 1501350808, -183583125, 2134014610, 720827868, -1915801069, -829434432, 444418495, -207928085, -764106377, -180766255, 429579526, -1887092002, -1139248992, -1967220622, -541417291, -1617463896, 517511661, -1781260846, -804604982, 834431625, 1800360467, 603678316, 557395424, -763031007, -1336769888, -1871888929, 1594598244, 1789292665, 962604079, -1185224024, 199953143, -1078097556, 1286821852, -1441858782, -1050367058, 956106641, -1792710927, -417329507, 1298074488, -2081642949, -1142130252, 2069006433, -889029611, 2083629927, 1621142867, -1340561463, 676558478, 78265900, -1317128172, 1763225513, 1783160195, 483383997, -1548533202, 2122113423, -1197641704, 319428736, -116274800, -888049925, -798148170, 1768740405, 473572890, -1931167061, -298056529, 1602950715, -412370479, -2044658831, -1165885212, -865307089, -969908936, 203868919, 278855174, -729662598, -1950547957, 679003141, 1423171080, 1870799802, 1978532600, 107162612, -1482878754, -1512232885, 1595639326, 1848766908, -321446009, -1491438272, 1619109855, 351277170, 1034981600, 421097157, 1072577364, -538901064]
53
[-2142140080, -2066313811, -2015945568, -2013211927, -1988504811, -1884073403, -1860777718, -1852780618, -1829202121, -1754543670, -1589422902, -1557970039, -1507704627, -1410033893, -1313864752, -1191655050, -1183729403, -1155076106, -1150685547, -1148162179, -1143013543, -1012615847, -914543424, -898063429, -831941836, -808337369, -807593292, -775755312, -682786953, -679343381, -657346098, -616936747, -545017823, -522339238, -501194053, -473081322, -376141541, -350526016, -344380659, -341195356, -303406389, -285611307, -282860017, -156809093, -127312384, -24161190, -420036, 50190256, 74000721, 84358785, 102958758, 124538981, 131053395, 280688418, 281444103, 303002802, 309255004, 360083648, 400920491, 429956579, 478710051, 500159683, 518335017, 559645553, 560041153, 638459051, 640161676, 643850364, 671996492, 733068514, 743285502, 1027514169, 1142193844, 1145750868, 1187862077, 1219366484, 1347996225, 1357239296, 1384342636, 1387532909, 1408330157, 1490584236, 1496234950, 1515355210, 1567464831, 1790076258, 1829519996, 1889752281, 1903484827, 1904323014, 1912488777, 1939200260, 2061174784, 2074677533, 2080731335, 2111876929, 2115658011, 2118089950, 2127342676, 2145430585]
2
fonte
a reasonable desktop PC
ambíguo?Respostas:
APL,
1614 bytesObrigado a @ngn por salvar 2 bytes.
Na
⎕
verdade, é um caractere de caixa, não um erro de fonte ausente. Você pode experimentar o programa em tryapl.org , mas como⎕
não é totalmente suportado por lá, substitua-o pelo valor de entrada:Explicação
O programa é melhor explicado com o exemplo de entrada
s = ¯1 3 1 ¯2 5 2 3 4
, retirado do STDIN por⎕
. Primeiro, calculamos o≤
produto -outers
usando ele mesmo∘.≤⍨
. Isso resulta em uma matriz booleana cujai
linha th indica quais elementoss
são menores ou iguais as[i]
:As ocorrências de
0 1
e1 0
na linhai
marcam os locais onde a sequência passa sobre o pontos[i] + 0.5
. Combinamos isso em todas as linhas usando2≠/
"reduzir 2 sublistas em≠
":O que resta é pegar as somas das linhas com
+/
e um mais o máximo destes com
1+⌈/
:O resultado é impresso automaticamente em STDOUT na maioria das implementações de APL.
fonte
×
multiplicação e regras de sintaxe muito simples. Google "dominando Dyalog APL" para um bom guia.Python,
887573 bytesApenas uma lambda direta
Apenas para mostrar outra abordagem:
Pitão,
2827 bytesEste é aproximadamente equivalente a
aplicado à lista de entrada do STDIN. Experimente no intérprete online .
fonte
def f(x):max(sum((a+.5-m)*(a+.5-n)<0for m,n in zip(x,x[1:]))for a in x)+1
+.5
s para salvar alguns caracteres. Eu percebi que eles eram inúteis nos meus.a = point + .5
e conta o número de intervalos que contêm estritamentea
. Sem o,.5
você terá problemas com casos como o[1, 0, -1]
exemplo.Pyth : caractere
313029282423 (caracteres Python 68)Experimente aqui: Pyth Compiler / Executor
Ele espera uma lista de números inteiros como entrada
[-1, 3, 1, -2, 5, 2, 3, 4]
É uma tradução direta do meu programa Python:
Solução antiga: Pyth 28 char
Apenas por razões de arquivamento.
Um código Python correspondente seria:
fonte
,QtQ
vez de[QtQ)
i
não é a linha de interseção,i - 0.5
é. E, portanto1
(na verdade1 - 0.5 = 0.5
) está dentro(-1, 1)
.min(a)<i<=max(a)
é equivalente amin(a) < i - 0.5 < max(a)
, resolvido em Pyth commin(a) < i < max(a)+1
(observe oh
inheSk
).g
, ou seja>=
, se você substituir<dheSk
porgeSkd
.CJam,
36 34 3330 bytesEu acredito que existe um algoritmo melhor por aí na natureza. Ainda assim, isso funciona abaixo do limite exigido para todos os casos de teste (mesmo no compilador online)
Entrada é como
A saída (para o caso acima) é
Como funciona
Agora, suponha que a matriz de entrada seja
[-1 3 1 -2 5 2 3 4]
, as etapas de zipagem se parecem com:A segunda matriz na última linha são as dobras da string.
Agora, iteramos
[-1 3 1 -2 5 2 3 4]
e calculamos o número de conjuntos em que cada um deles se encontra. Tire o máximo proveito desse número, aumente e tenha nossa resposta.Experimente online aqui
fonte
Matlab
(123) (97)(85)Finalmente, um uso para o XNOR =) Tenho certeza de que ele pode ser jogado muito mais.
Mas, honestamente, estou um pouco envergonhado por o MatLab estar se tornando o idioma que eu conheço melhor = /
O tempo de execução aproximado é
O(n^2)
.EDIT2:
EDIT: Nova versão mais golfe (incluindo dicas de @DennisJaheruddin, obrigado!)
Versão antiga:
@ MartinBüttner: Gosto muito dos seus pequenos e agradáveis desafios antes de ir para a cama!
fonte
c=sort(a)-.5
é claro que o primeiro ponto está fora do intervalo, mas certamente é mais fácil lidar com isso. No pior dos casos, você pode fazerc(1)=[];
. - Além disso, você pode remover o comando disp, apenas o cálculo de algo o escreverá em stdout. - Finalmente, neste caso,numel
pode ser substituído pornnz
conv
abordagem ... = D. Eu sempre esquecer onnz
, muito obrigado!disp
desde que alguém uma vez criticado que, com o método proposto, você também terá outros personagens (nome do var ouans
) escrito em stdout ...Mathematica
134 133104Divertido de resolver, apesar do tamanho do código. Ainda mais golfe pode ser alcançado, substituindo a idéia de
IntervalMemberQ[Interval[a,b],n]
coma<n<b
.Explicação
list1
é que a lista de pontos fornecidalist2
é uma lista abreviada que remove números que não estavam nas dobras; eles são irrelevantes. Não é necessário fazer isso, mas leva a uma solução mais clara e eficiente.Os intervalos
list1
elist2
são mostrados nos gráficos abaixo:Só precisamos testar uma única linha em cada intervalo determinado pelos pontos de dobra. As linhas de teste são as linhas verticais tracejadas no gráfico.
f
localiza o número de cortes ou cruzamentos de cada linha de teste. A linha em x = 2,5 faz 5 cruzamentos. Isso deixa 5 + 1 pedaços de barbante.fonte
Pitão, 21 bytes
Experimente aqui.
Dê entrada como lista no estilo Python, por exemplo
[-1, 3, 1, -2, 5, 2, 3, 4]
Basicamente baseado no programa do @ jakube, mas com um algoritmo central aprimorado. Em vez de fazer uma
>
verificação e uma>=
verificação, eu faço uma.index()
nos três números combinados e certifico-me de que o índice seja 1, o que significa que é maior que o mínimo e menor ou igual ao máximo.fonte
R,
8683Estava trabalhando nisso e percebi que eu tinha essencialmente encontrado a mesma solução que o Optimizer e outras que eu suspeito.
Enfim, aqui é como uma função que leva um vetor
fonte
R
. FWIW, você pode salvar 3 caracteres usandoT
"TRUE"GolfScript (43 bytes)
Em termos de eficiência, é O (n ^ 2) assumindo que as comparações levam tempo O (1). Ele divide a entrada em segmentos de linha e, para cada ponto inicial, conta os segmentos de linha semi-abertos que a atravessam.
Demonstração online
fonte
Python - 161
Provavelmente isso pode ser jogado mais. gnibbler ajudou muito a jogar golfe.
fonte
Ruby, 63
Semelhante às soluções Python em conceito.
Adicione 2 caracteres antes do código, por exemplo,
f=
se você deseja uma função nomeada. Thx para MarkReed .fonte
C #,
7365 bytesLendo as regras, pensei que um lambda C # deveria se sair muito bem.
Edit: recém encontrado
Count
tem uma sobrecarga útil para filtrar!Você pode testar isso definindo o
delegate
tipo apropriado :E depois
fonte
Matlab (
6343)A entrada é fornecida como um vetor de linha passado para a função
f
. Então, por exemplo,f([-1, 3, 1, -2, 5, 2, 3, 4])
retorna6
.Versão mais curta:
Oitava (31)
No Octave
bsxfun
pode ser removido graças à transmissão automática:fonte
JavaScript (ES6) 80
82Ver comentários - a contagem de bytes não inclui a atribuição a F (ainda é necessário testar)
Teste no console do FireFox / FireBug
Resultado
fonte
lambda
soluções Python , você não precisa atribuir o valor da função a uma variável real, para poder digitar dois caracteres.Gelatina , 10 bytes
Experimente online!
Como funciona
fonte
05AB1E , 6 bytes
Experimente online!
Explicação:
fonte
JavaScript (Node.js) , 71 bytes
Experimente online!
fonte
Adicionar ++ , 27 bytes
Experimente online!
Abordagem graças a Zgarb por sua resposta APL
A parte principal desse desafio é implementar um comando externo do produto. Infelizmente, o Add ++ não possui um built-in para isso, não possui nenhuma maneira de definir funções que usam outras funções como argumentos. No entanto, ainda podemos fazer com que um produto externo generalizado funcione. Como a única maneira de acessar uma função dentro de outra função é através da referência a uma função existente, definida pelo usuário ou embutida, precisamos criar um 'embutido' que faça referência a essa função.
Uma função "tabela" generalizada ficaria assim:
Experimente online!
onde
func
é uma função diádica que contém nosso operando. Você pode ver pequenas semelhanças dessa estrutura na submissão original, no início da função w , mas aqui queremos, principalmente, uma função de produto externo monádico - uma função de produto externo que adota o mesmo argumento dos dois lados.A função geral da tabela tira proveito de como o
€
ach quick aborda as funções diádicas. Se a pilha parecerquando
€{func}
é encontrado, o€
pop aparecee
, vincula esse argumento à esquerda à díade e mapeia essa função parciala, b, c, d
. No entanto, os€
mapas rápidos sobre toda a pilha, em vez de sobre as listas. Portanto, precisamos achatar as matrizes passadas como argumentos primeiro.A função de tabela funciona de maneira geral assim
No entanto, podemos reduzi-lo bastante devido ao fato de que precisamos que nossa tabela externa seja monádica e que apenas seja aplicável ao argumento passado. O
A
comando envia cada argumento para a pilha individualmente, portanto, não precisamos mexer com nenhuma manipulação de pilha. Em resumo, se nosso argumento é a matriz[a b c d]
, precisamos transformar a pilha emO valor superior é, obviamente, o argumento. Você pode ter notado no exemplo geral que
bU
é o comando unpack, ou seja, ele divide a matriz superior na pilha. Então, para fazer a configuração acima, podemos usar o códigoExperimente online!
No entanto, isso pode ser reduzido por um byte. Como um alias para
L,bU
, podemos usar a~
flag, para dividir os argumentos na pilha de antemão, transformando nosso exemplo de configuração emExperimente online!
que é o início da segunda linha do programa. Agora que implementamos o produto externo monádico, precisamos apenas implementar o restante do algoritmo. Depois de recuperar o resultado da tabela com
<
(menor que) e conte o número de[0 1]
e[1 0]
pares em cada linha. Finalmente, pegamos o máximo dessas contagens e incrementamos.O passo completo para o passo a passo é
fonte