Interpretar intervalos soltos
ListSharp é uma linguagem de programação interpretada que possui muitos recursos, um deles é um criador de intervalo baseado em 1 índice que funciona assim:
Você define um intervalo como (INT) TO (INT)
ou apenas (INT)
onde ambos ou o int único podem ir do valor mínimo ao máximo int32
Em seguida, você pode usar esses intervalos para extrair elementos de uma matriz sem temer ultrapassar seus limites
Portanto:
1 TO 5
gera: {1,2,3,4,5}
3
gera: {3}
As faixas podem ser adicionadas usando o AND
operador
1 TO 5 AND 3 TO 6
gera: {1,2,3,4,5,3,4,5,6}
lembre-se de que também funciona com números negativos
3 TO -3
gera: {3,2,1,0,-1,-2,-3}
O desafio é o seguinte:
Entrada
Uma matriz de caracteres e a cláusula de intervalo definido anteriormente como uma sequência
Resultado
Os elementos nos 1 locais com base no índice (índices inexistentes / negativos são convertidos em um caractere vazio)
Como ganhar
Como um desafio de código-golfe , você deve criar o programa com a menor contagem de bytes para vencer
Foi apontado que caracteres vazios não existem; portanto, você deve ignorá-los (eu apenas os mostrei aqui para facilitar a compreensão e confundir as pessoas)
Casos de teste:
input array is:
{'H','e','l','l','o',' ','W','o','r','l','d'}
range clause:
"1 TO 3" => "Hel"
"5" => "o"
"-10 TO 10" => "Hello Worl"
"0 AND 2 AND 4" => "el"
"8 TO 3" => "oW oll"
"-300 AND 300" => ""
"1 TO 3 AND 3 TO 1" => "HelleH"
"-20 TO 0 AND 1 AND 4" => "Hl"
fonte
"0 TO 2"
=>{'H', 'e', 'l'}
?3 TO 3
sempre será uma entrada e qual é o resultado esperado?AND
vários intervalos. Além disso, você não respondeu se podemos usar a indexação com base em zero, o que é padrão na maioria dos idiomas.Respostas:
Python 2 -
239211210 bytesObrigado a @ mbomb007 e @Cyoce por continuar jogando esta solução!
Abordagem direta. Tentei geradores e uma versão recursiva, mas eles não conseguiram superar o simples para cada loop. Eu sou um noob de golfe, então isso provavelmente pode ser melhorado um pouco. Além disso, a principal falha desse snippet é que o intervalo como objeto de lista é calculado novamente sempre que um elemento é recuperado da matriz de caracteres (consulte a última linha, compreensão da lista). Isso significa que
r(s)
é executadolen(r(s)) + 1
vezes.Código não destruído:
Casos de teste:
Resultado:
fonte
if
a mesma linha e separá-los com ponto e vírgula. E remova o espaço[x] for
. Além disso,1if b else-1
pode ser substituído por umb and 1or-1
ou2*bool(b)-1
para salvar um byte.lambda
, já que não é recursivo.t+=[int(x)]
canbecomet+=int(x),
Groovy (
9997 bytes)Experimente aqui: https://groovyconsole.appspot.com/edit/5155820207603712
Explicação:
.replaceAll(" TO ","..")
- Substitua o para por um intervalo tradicional..replaceAll(" AND ", ",")
- Substitua todos os ands por uma vírgula."[${...}]"
- Coloque-o na notação "list" no Groovy.Eval.me(...)
- Avalie a string como código Groovy..flatten()
- Nivele a mistura da matriz 2D e da matriz 1D em uma matriz 1D..collect{v[it]}
- Colete os índices da matriz em uma única estrutura.Aqui está uma solução de
115113 bytes que remove nulos da saída: https://groovyconsole.appspot.com/edit/5185924841340928Aqui está uma solução de 117 bytes, se você disser que DEVE ser indexada em 1 em vez de 0: https://groovyconsole.appspot.com/edit/5205468955803648
Se você quiser que eu troque o original pelo de 113/117 bytes, informe-me.
fonte
Eval.me(...)
até agora; dado que usá-lo na prática seria ridiculamente inseguro, ainda é uma coisa interessante de se saber.C #, 342 bytes
Método não destruído:
Programa completo com casos de teste:
Uma solução ingênua, usando uma lista de caracteres, que usa
' '
como caractere vazio e faz o trabalho. Na esperança de melhorar em breve.fonte
Scala, 165 bytes
Explicação:
fonte
Python 2,
156155 bytesMinha resposta tem algumas idéias semelhantes, como de 1Darco1 resposta , mas usando uma abordagem diferente desde o início (corte corda ao invés de listas), acabou um pouco mais curto. Seria quatro bytes mais curto se a indexação 0 fosse permitida.
Experimente online
Felizmente, eu posso analisar cadeias contendo espaços em números inteiros. Indexação negativa em índices Python a partir do final da string, então eu uso
i[-1]
o mesmoi[0]
ou o segundo valor, se houver. Então eu tenho que ajustar qualquer valor de intervalo negativo para mais negativo, para que eles não mexam com a fatia. Multiplicando valores negativos por11**9
(2357947691
) considerará os intervalos usando o valor mínimo inteiro. Em seguida, basta cortar a corda, usando a fatia inversa, se o intervalo estiver invertido.Com indexação zero (151 bytes):
fonte
range
abordagem é basicamente apenas uma forma super detalhada de exatamente isso. E você até se livrou de toda aif"T"in x: else:
parte. +1R, 142 bytes
Supondo que entendi o desafio corretamente, aqui estou assumindo que essa
r
é a cláusula de intervalo predefinida no formato string e que a matriz de entrada ("Hello world", nos exemplos) é lida no stdin.Alguns casos de teste:
Ungolfed / explicou
Linha 1
R tem um bom operador de infix
:
que gera sequências.1:5
dá[1, 2, 3, 4, 5]
e0:-2
dá[0, -1, -2]
. Portanto, substituímos aTO
cláusula no intervalo amplo por:
.Interpretar
AND
é apenas concatenação. Podemos usar a funçãoc
para isso, que facilmente pode receber um número arbitrário de argumentos, separados por vírgula. Então substituímosAND
por,
e em seguida, enrole a coisa toda em
c(
,)
.Isso gera uma cadeia de caracteres que pode parecer
c( 1 : 5 , 7 )
. Chamamosparse
a conversão para digitar "expressão" e, em seguida,eval
para avaliar a expressão. A sequência resultante de números é então atribuída novamente à variávelr
.Linha 2
Agora, a parte mais feia - lidar com seqüências de caracteres em R, que fica confuso rapidamente. Primeiro, definimos
e
como uma string vazia (precisaremos disso mais tarde).Lemos do stdin e convertemos a cadeia de caracteres em uma matriz de caracteres individuais dividindo a cadeia vazia. (Por exemplo, passamos de "Oi" para ["H", "i"].) Isso retorna uma lista de comprimento 1, portanto, precisamos solicitar o primeiro elemento
[[1]]
para obter uma matriz com a qual possamos trabalhar. Ugh, eu avisei que isso era uma bagunça.Índices R começando em 1 e possui um bom recurso com números negativos. Suponha que
x
seja['a', 'b', 'c']
. Ligarx[1]
sem surpresa retorna'a'
. A chamadax[-1]
retorna todos,x
exceto o índice1
, ou seja['b', 'c']
. Esse é um recurso interessante, mas significa que precisamos ter cuidado com nossos índices negativos para esse problema. Então, por enquanto, retornamos os elementos da matriz de entrada com o índice>0
e atribuímos o resultado ao
.Linha 3
No entanto, há um problema! Para índices maiores que o comprimento da matriz, R apenas retorna
NA
valores. Precisamos que ele retorne cadeias vazias. Então, nós redefinir os elementoso
para os quaisis.na(o)
éTRUE
para ser uma string vazia.Linha 4
Finalmente, como lidamos com os índices negativos (e zero)? Todos eles precisam retornar a sequência vazia, portanto, repetimos a sequência vazia N vezes, em que N é o número de índices que são
<1
.Por fim, concatenamos as definições definidas anteriormente.
o
para esta lista (potencialmente vazia).fonte
JavaScript (ES6), 141
Função sem nome com 2 parâmetros, o primeiro sendo a matriz de caracteres (também pode ser uma sequência), o segundo a sequência que contém a definição de intervalo.
O valor de retorno é uma matriz em que cada elemento pode ser um único caractere ou o valor de js
undefined
. Quando especificado, este resultado em uma sequência de caracteres separados por vírgula é indefinido, mostrado como o caractere "vazio" - como os casos de teste na primeira versão da pergunta.Usando
.join
você pode obter um resultado de sequência semelhante ao resultado do caso de teste na versão atual da pergunta.Menos golfe
Teste
fonte
Perl - 110 bytes
Chamar o script na linha de comando com a sequência como o primeiro argumento e o intervalo como o segundo.
Desfocado:
fonte
Python 2, 146 bytes
Todos os testes estão no ideone
Divide a cláusula,
s
em "AND", divide cada uma das subcláusulas resultantes em "TO", converte as seqüências resultantes emint
usomap
. Os resultados terão cada um 1 ou 2 itens (1 se nenhum "TO" estiver presente na subcláusula).Constrói intervalos com base em 0 para cada um deles usando o parâmetro step do intervalo como 1 ou -1, inspecionando os valores nos índices 0 e -1 (uma lista com uma entrada possui essa entrada nos dois índices).
Percorre esses intervalos e constrói uma lista da saída, se os índices fornecidos estiverem dentro do intervalo (
if 0<=i<len(a)
).fonte
Geléia ,
28 2725 bytesTryItOnline (também funcionará com uma string em vez de uma matriz de caracteres)
Quão?
fonte
Clojure
232230229 bytesOh, que monstro eu criei ... Mas, na verdade, era 260 quando eu estava prestes a enviá-lo.
Editar: removido um espaço de
#(get r %_"")
,(if_(< f t)
e(take-nth 2_%)
(como indicado_
).Menos golfe:
Usa
clojure.string/split
para dividir por "AND" e "",take-nth
descarta "TO" entre números inteiros, a correspondência de argumentos de função lida com o caso de 1 ou 2 argumentos e é isso.Convenção de chamada:
(f "Hello World" "1 TO 3 AND 2 AND 8 TO 2")
fonte
#
caracteres.#
? Eu tentei sem sucesso, ele é "mesclado" com o token anterior. Ah, mais um espaço para remover antes de%
lá.