Entrada:
Tomamos duas entradas:
- Uma entrada
b
com dois valores distintos:Left
eRight
. † - E um número inteiro positivo
n
.
Resultado:
Com base na entrada Esquerda / Direita, produzimos uma das duas sequências a seguir no intervalo de 1-n
(nas sequências abaixo, os primeiros 125 itens são exibidos):
Left:
1, 6, 7, 56, 57, 62, 63, 960, 961, 966, 967, 1016, 1017, 1022, 1023, 31744, 31745, 31750, 31751, 31800, 31801, 31806, 31807, 32704, 32705, 32710, 32711, 32760, 32761, 32766, 32767, 2064384, 2064385, 2064390, 2064391, 2064440, 2064441, 2064446, 2064447, 2065344, 2065345, 2065350, 2065351, 2065400, 2065401, 2065406, 2065407, 2096128, 2096129, 2096134, 2096135, 2096184, 2096185, 2096190, 2096191, 2097088, 2097089, 2097094, 2097095, 2097144, 2097145, 2097150, 2097151, 266338304, 266338305, 266338310, 266338311, 266338360, 266338361, 266338366, 266338367, 266339264, 266339265, 266339270, 266339271, 266339320, 266339321, 266339326, 266339327, 266370048, 266370049, 266370054, 266370055, 266370104, 266370105, 266370110, 266370111, 266371008, 266371009, 266371014, 266371015, 266371064, 266371065, 266371070, 266371071, 268402688, 268402689, 268402694, 268402695, 268402744, 268402745, 268402750, 268402751, 268403648, 268403649, 268403654, 268403655, 268403704, 268403705, 268403710, 268403711, 268434432, 268434433, 268434438, 268434439, 268434488, 268434489, 268434494, 268434495, 268435392, 268435393, 268435398, 268435399, 268435448, 268435449
Right:
1, 4, 7, 32, 39, 56, 63, 512, 527, 624, 639, 896, 911, 1008, 1023, 16384, 16415, 16864, 16895, 19968, 19999, 20448, 20479, 28672, 28703, 29152, 29183, 32256, 32287, 32736, 32767, 1048576, 1048639, 1050560, 1050623, 1079296, 1079359, 1081280, 1081343, 1277952, 1278015, 1279936, 1279999, 1308672, 1308735, 1310656, 1310719, 1835008, 1835071, 1836992, 1837055, 1865728, 1865791, 1867712, 1867775, 2064384, 2064447, 2066368, 2066431, 2095104, 2095167, 2097088, 2097151, 134217728, 134217855, 134225792, 134225919, 134471680, 134471807, 134479744, 134479871, 138149888, 138150015, 138157952, 138158079, 138403840, 138403967, 138411904, 138412031, 163577856, 163577983, 163585920, 163586047, 163831808, 163831935, 163839872, 163839999, 167510016, 167510143, 167518080, 167518207, 167763968, 167764095, 167772032, 167772159, 234881024, 234881151, 234889088, 234889215, 235134976, 235135103, 235143040, 235143167, 238813184, 238813311, 238821248, 238821375, 239067136, 239067263, 239075200, 239075327, 264241152, 264241279, 264249216, 264249343, 264495104, 264495231, 264503168, 264503295, 268173312, 268173439, 268181376, 268181503, 268427264, 268427391
Como essas seqüências são geradas, você pergunta?
Uma sequência padrão de 1 a n=10
seria:
As integer:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
As binary:
1 10 11 100 101 110 111 1000 1001 1010
Quando esticamos à esquerda, o binário se tornará o seguinte:
1, 110, 111, 111000, 111001, 111110, 111111, 1111000000, 1111000001, 1111000110
Por quê? O último bit é usado uma vez; o single-last é usado duas vezes; o segundo último é usado três vezes; etc.
So `1010` will become (spaces added as clarification): `1111 000 11 0`
E essas novas cadeias binárias esticadas à esquerda são convertidas novamente em números inteiros:
1, 6, 7, 56, 57, 62, 63, 960, 961, 966
Quanto à direita esticada, o primeiro bit é usado uma vez; segundo duas vezes; terceiro três vezes; etc. Assim:
As binary:
1, 100, 111, 100000, 100111, 111000, 111111, 1000000000, 1000001111, 1001110000
As integer:
1, 4, 7, 32, 39, 56, 63, 512, 527, 624
Regras do desafio:
- † Você pode pegar dois valores distintos, mas indicar qual deles você usa. Assim pode ser
1/0
,true/false
,null/undefined
,"left"/"right"
, etc. n
é sempre maior que 0.- Você deve suportar uma saída máxima de pelo menos o número inteiro padrão do seu idioma (que é de 32 bits para a maioria dos idiomas).
- O formato de saída é flexível. Pode ser impresso ou retornado como matriz / lista. Pode ser com um espaço, vírgula, tubo e semelhante como delimitador. Sua chamada. (Novamente, indique o que você usou.)
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
n < 128
, para que os resultados se encaixem em números inteiros de 32 bits?Respostas:
Geléia , 9 bytes
Experimente online!
-1
para a esquerda,1
para a direita.fonte
Python 2 ,
10296 bytes-1 para a esquerda, 1 para a direita
Experimente online!
fonte
05AB1E ,
1413 bytesGuardado 1 byte graças a Erik the Outgolfer
1
para a esquerda.0
(ou qualquer outra coisa) por direito.Experimente online!
Explicação
fonte
ε
para -1:LbεIiRƶRëƶ}JC
ë
. Obtém em torno da questão deif
numa aplica neste caso :)Casca , 13 bytes
São muitas letras pontilhadas ...
Toma primeiro
b
(0
para esquerda e1
para direita) e, em seguidan
. Experimente online!Explicação
fonte
b
diretamente H ou T, poupando-lhe três bytes :)b
e têm a minha solução ser apenasI
...Japt ,
191817 bytes0
para "esquerda",1
para "direita". (Ele pode, na verdade, assumir quaisquer valores falsey ou verdade no lugar daqueles 2.)Teste-o
Explicação
Entrada implícita de números inteiros
U
&V
.Crie uma matriz de números inteiros de 1 a
U
, inclusive.Passe cada um por uma função.
Converta o número inteiro atual em uma sequência de caracteres binária
Mapeie a string, passando cada caractere por uma função, onde
E
está o índice atual eF
a string completa.Repita o caractere atual
©
é lógico AND (&&
) eª
é lógico OR||
, então aqui estamos verificando seV
é verdade (diferente de zero) ou não.Se
V
é verdade, em seguida,X
obtémY+1
vezes repetidas .Se
V
for falsey,X
será repetidoY
subtraído de (n
) o comprimento (l
) deZ
vezes.Converta de volta para um número inteiro base 10.
Saída implícita da matriz resultante.
fonte
Gaia , 15 bytes
Usa
-1
para esquerda e1
para direita.Experimente online!
Explicação
fonte
Próton , 79 bytes
0
é esquerda,1
é direita.Experimente online!
Ungolfed
fonte
C # (.NET Core) ,
192187 + 23 bytes-5 bytes graças a TheLethalCoder
A contagem de bytes também inclui:
Experimente online!
Entrada:
left
istrue
,right
isfalse
Explicação:
fonte
using System.Linq;
mais curto quenamespace System.Linq{}
, ou estou faltando alguma coisa aqui? Há muito tempo atrás eu programado em .NET tbh ..Math
eConvert
ambos estão noSystem
espaço para nome, portanto,namespace System.Linq
é o mais curto - permite o uso de ambosSystem
eSystem.Linq
classes.Dyalog APL, 23 bytes
left is
1
right is0
(transmitido como argumento esquerdo da função)⍳
é gerador de índice{
...}¨
aplicar função entre chaves a cada item à direitab←2⊥⍣¯1⊢⍵
b é codificado como binário (usando o inverso da decodificação para obter o número mínimo de bits necessário para representar⍵
na base 2)⍳≢b
gerar índices para o vetor b (≢b
é o comprimento de b)⌽⍣⍺
⍺
Tempos reversos (usados condicionalmente aqui para alongamento esquerdo ou direito)b/⍨
b replicado por (replica os bits de acordo com o índice (reverso))2⊥
decodificar da base 2TryAPL online
fonte
JavaScript (ES6), 131 bytes
Isso é significativamente mais longo que a resposta de Shaggy , mas eu queria tentar uma abordagem puramente bit a bit.
Devido ao limite de 32 bits das operações JS bit a bit, isso funciona apenas para n <128 .
Recebe entrada na sintaxe de curry
(n)(r)
, em que r é falso para esquerda / verdade para direita.Formatado e comentado
Demo
Mostrar snippet de código
fonte
JavaScript (ES6), 113 bytes
Oh, isso é apenas muito tempo! É o que acontece quando você passa o dia escrevendo JavaScript "real", crianças; você esquece como jogar golfe corretamente!
Usa quaisquer valores de verdade ou falsey para
b
,false
sendo "esquerdo" etrue
"direito".Tente
fonte
Gelatina , 11 bytes
Experimente online!
Argumento # 1:
n
Argumento # 2:
1
para a esquerda,0
para a direita.fonte
Retina , 111 bytes
Experimente online! Pega o número e
L
ouR
como um sufixo (ou em uma linha separada). Explicação:Converta de decimal para unário e conte de 1 a
n
.Converter de unário em binário.
Coloque cada bit
R
e osL
caracteres de acordo com sua posição na linha.Substituir o relevante
R
ouL
caracteres com o dígito adjacente apropriado.Remova os caracteres restantes e converta de binário para decimal.
fonte
1
paran
. Não é apenas on
'número th.JavaScript (ES6),
130127 bytes3 bytes, obrigado Kevin
Certamente não conheço ES6 suficiente para este site, mas tentei! Faça um loop em cada número e faça um loop em cada representação binária desse número, repetindo cada caractere quantas vezes for necessário.
fonte
d=>n=>
), como as outras duas respostas do JS ES6. Além disso, acho que você pode salvar outros 2 bytes alterandok=-1,l=b.length;while(++k<l)s+=b[k].repeat(d?k+1:l-k);
parak=0,l=b.length;while(k<l)s+=b[k++].repeat(d?k:l+~k);
(iniciando emk=0
vez de-1
e ol-k-1
que é necessário é reduzido paral+~k
). Além disso, os parênteses são(i).toString(2)
necessários?+~k
parece que ele deve funcionar, mas eu não consigo entender, continua ficando louco. Obrigado pelas outras dicas!l+~k
é incorreto, uma vez que não él-k-1
, masl-k+1
.. Meu ruim. Você ainda pode golf um byte, iniciandok
em zero, no entanto:k=0,l=b.length;while(k<l)s+=b[k++].repeat(d?k:l-k+1);
.Ruby, 98 bytes
fonte
a{r ?a:a.reverse}
necessário??
,r?
teriam sido interpretados como um nome de método.Java 8, 136 bytes
Lambda (ao curry) de
Boolean
para um consumidor deInteger
. O parâmetro booleano indica se deve trecho esquerda (valorestrue
,false
). A saída é impressa na saída padrão, separada por novas linhas, com uma nova linha à direita.Lambda ungolfed
Experimente Online
Limites
Porque eles são acumulados em
int
s, as saídas são limitadas a 31 bits. Como resultado, as entradas são limitadas a 7 bits, portanto, a entrada máxima suportada pelo programa é 127.Explicação
Esta solução cria cada número estendido usando operações bit a bit. O loop externo itera
i
sobre os números a serem esticados, de 1 a n , e imprime o valor esticado após cada iteração.O
while
loop interno é incrementados
para o número de bitsi
e o subsequentefor
iterac
sobre cada posição de bit. Dentro desse loop,d
conta até o número de vezes para repetir o bit atual, que depende da entradal
. A cada passo,o
é deslocado para a esquerda e o bit apropriadoi
é mascarado e o OU é inserido.fonte