Você receberá uma string. Ele conterá 9 números inteiros exclusivos de 0 a 9. Você deve retornar o número inteiro ausente. A string ficará assim:
123456789
> 0
134567890
> 2
867953120
> 4
Você receberá uma string. Ele conterá 9 números inteiros exclusivos de 0 a 9. Você deve retornar o número inteiro ausente. A string ficará assim:
123456789
> 0
134567890
> 2
867953120
> 4
Respostas:
+ beleza graças a @Sarge Borsch
`99066**2`.strip
99066**2
é apenas uma maneira mais curta de gerar uma string que contém 0 ~ 9
764**4
poderá salvar dois bytes.
764**4
está faltando 5
, 8
e9
763**4
=338920744561
lambda s:-int(s,16)%15
Uma solução aritmética. Interpreta a sequência de entrada como hexadecimal, a nega e pega o módulo de resultado 15.
⎕D∘~
⎕D
D igits
∘
(vincula um argumento esquerdo à seguinte função diádica para criar uma função monádica)
~
exceto [o argumento]
⎕D~⊢
⎕D
D igits
~
exceto
⊢
o argumento certo
⎕D~⍞
⎕D
D igits
~
exceto
⍞
entrada de caracteres
10 bytes salvos graças ao DJMcMayhem!
((([]())[]{}){()()({}[()])}{}[{{}}])
A soma de todos os dígitos do Ascii é 525. Este programa resume a entrada e a subtrai de 525 para obter o dígito ausente.
((([]())[]{}){()()({}[()])}{} )
Pressionará 525. Isso tira vantagem do fato de que sabemos que haverá 9 elementos de entrada para começar. Isso significa que é []
avaliado como 9, o que nos permite obter grandes números como 525 rapidamente.
Em seguida, temos o pouco:
[{{}}]
que somará as entradas e subtrairá do total.
negative(sum(input()))
para o final, poderá abusar do nilad de altura da pilha para empurrar 525 mais facilmente. (([][][]()()()){()()({}[()])}{}[{{}}])
deve economizar 10 bytes
(477-).sum.map fromEnum
Experimente online! Uso: (477-).sum.map fromEnum $ "123456890"
. 477 é a soma dos códigos de caracteres dos dígitos 1 a 9, excluindo 0. Esta função anônima calcula 477 menos a soma de todos os códigos de caracteres para encontrar o que está faltando.
Transformar os dígitos dos caracteres em ints é um byte a mais:
(45-).sum.map(read.pure)
foldl(\a b->a-read[b])45
ḟ
.
Ø
= ⎕
, D
= D
, ḟ
= ~
, como em ⎕D~'867953120'
.
Soma os códigos ascii e subtrai de 48 * 9 + 45
->s{477-s.sum}
Use assim
f=->s{477-s.sum}
puts f["123456789"]
Edite 1 byte de salvar thx @Neil, com um truque muito mais inteligente
Xoring todos os valores de 1 a 9 fornece 1. Xor 1 mais uma vez e o resultado é 0. Portanto, se algum valor único estiver ausente, o resultado será o valor ausente.
s=>eval([1,...s].join`^`)
Teste
f=s=>eval([1,...s].join`^`)
function go() {
var i=I.value;
O.textContent = f(i)
}
go()
<input oninput='go()' value='012987653' id=I>
<pre id=O></pre>
s=>eval([1,...s].join`^`)
salva um byte.
-6 Agradecimentos ao pôr do sol básico
-2 Agradecimentos a Martin Ender
.
$*_5$*
+`_1|1_
1
Substitua todos os dígitos por tantos se _
5 1
s:
.
$*_5$*
Remover todas as _
s e uma 1
para cada um:
+`_1|1_
Conte o número de 1
s restantes:
1
.
.
^
5
^.
$*9¶
.
$*_
+`_¶_
¶
_
_
para 1
salvar um byte.)
s=>(15-`0x${s}`%15)%15
Porta da resposta Python do @ xnor, exceto que o JavaScript tem apenas um operador restante em vez de um módulo, portanto, não posso fazê-lo em uma única etapa. Editar: salvou 6 bytes graças a @Arnauld.
s=>[...s].map(c=>r-=c,r=45)|r
;-)
reduce
. +1 de qualquer maneira
s[0]!='0'
, mas já existe uma resposta que usa eval
.
s=>(15-`0x${s}`%15)%15
?
-[-[->-<],]>++.
Experimente aqui . Esta solução funciona apenas no Brainfuck padrão (células de 8 bits), pois depende da embalagem.
É um dia raro em que Brainfuck pode realmente competir, mas esse desafio acabou de se alinhar com as especificações do BF muito bem!
Em vez de detalhar essa resposta, eu gostaria de passar pelas iterações que fiz, porque acho que seria mais compreensível (e mais interessante).
Nota: esta solução é inspirada principalmente pela resposta Brain-Flak do Wheat Wizard .
Em sua resposta, Wheat Wizard apontou que a soma dos valores ASCII de 0-9 soma a 525. E como o Brainfuck padrão tem apenas uma noção de [0,255], isso torna o valor 525% 256 = 13 . Ou seja, subtrair os valores ASCII da entrada de 13 fornece o dígito ausente.
A primeira versão deste programa foi:
1. Coloque 13 na primeira célula
2. Insira entradas na segunda célula
3. Subtraia a segunda célula da primeira célula
4. Salte para 2 se houver entradas restantes
5. Imprima a primeira célula
E aqui está o código para a solução simples:
+++++++++++++ #Set the first cell to 13
>, #Take inputs into the second cell
[[<->-],] #Subtract the second cell from the first cell and repeat until inputs are over
<. #Print the first cell
Como apontado em sua resposta, como sabemos que a entrada terá exatamente o comprimento 9, podemos usar esse valor como uma constante e eliminar essa longa sequência de + no início.
Também não importa em que ponto adicionamos 13 (obrigado, propriedade comutativa!), Portanto, misturamos isso com as etapas de subtração e impressão.
, #Take input to enter the loop
[[->-<], #Subtract the first cell from the second cell
>+<] #Add 1 for each input; totaling 9
>++++ #Add the missing 4 to make 13
. #And print
Esta foi a minha resposta original para esse problema, mas podemos fazer melhor.
Curiosamente, a resposta anterior funciona mesmo se começarmos com um + em vez de um,
+[[->-<],>+<]>++++.
Brainfuck exigiu algo em uma célula para iniciar um loop. Ingenuamente, adicionamos mais 4 no final, quando poderia ter sido em outros lugares.
-[[->-<],>+<]>++.
Com alguns truques de loop totalmente intencionais (leia-se: tentativa e erro), iniciar o programa com a - leva a dois resultados interessantes:
1 + 10 + 2 = 13, e terminamos com a resposta original.
Olhando para trás, é provavelmente uma redação excessiva para um programa tão simples do Brainfuck.
Depois de pensar um pouco mais nessa solução, consegui cortar 2 bytes.
Eu queria esclarecer algo sobre a etapa anterior:
o sinal de menos para inserir o loop efetivamente adiciona 1, mas o que realmente está fazendo é subtrair 255 da segunda célula (resultando em 1).
É óbvio em retrospecto, mas subtrair 1 da primeira célula é o mesmo que adicionar 1 à segunda célula (porque tudo na primeira célula é subtraído da segunda célula).
-[-[->-<],]>++.
Consegui remover o "> + <" adicionando um "-" no início do primeiro loop. Ele precisa ir até lá, e não onde estava o "> + <", porque o programa repetirá infinitamente.
477-Tr@ToCharacterCode@#&
Função pura pegando uma string como entrada e retornando um número inteiro. O Mathematica tem nomes longos de comando e reluta em converter entre seqüências de caracteres e números inteiros, o que o torna particularmente ruim nesse desafio. O melhor que pude encontrar foi o algoritmo da resposta Ruby da Level River St , que calcula com base no total dos códigos ASCII da string de entrada; no Mathematica, isso usa apenas um nome de comando longo.
<?=trim(32043**2,$argv[1]);
usa o truque da resposta de Rod para gerar uma string contendo todos os dígitos e remove todos os dígitos, exceto o que está faltando.
PHP, 41
for($b=1;$i<9;$b^=$argv[1][$i++]);echo$b;
Este usa xor porque ainda não o vi.
32043,32286,33144,35172,35337,35757,35853,37176,37905,38772,39147,39336,40545,42744,43902,44016,45567,45624,46587,48852,49314,49353,50706,53976,54918,55446,55524,55581,55626,56532,57321,58413,58455,58554,59403,60984,61575,61866,62679,62961,63051,63129,65634,65637,66105,66276,67677,68763,68781,69513,71433,72621,75759,76047,76182,77346,78072,78453,80361,80445,81222,81945,83919,84648,85353,85743,85803,86073,87639,88623,89079,89145,89355,89523,90144,90153,90198,91248,91605,92214,94695,95154,96702,97779,98055,98802,99066
Encontrei uma solução bash mais curta , que usa uma abordagem interessante de soma de verificação:
sum -s|dc -e524?--P
Explicação:
O sum
comando imprime uma soma de verificação e uma contagem de blocos. Não conheço muitos detalhes, mas o uso da opção -s
(algoritmo System V) tornará a soma de verificação igual à soma ASCII de cada código de caractere de entrada. Como tal, a soma de verificação permanece constante quando a ordem dos mesmos caracteres de entrada é alterada.
Dado 867953120
como caso de teste (último exemplo), eis como o script funciona:
sum -s
saídas 473 1
. Se nenhum número inteiro estivesse faltando, a soma de verificação teria sido 525.dc -e524?
empurra 524 e depois a entrada do tubo. A pilha é: 1 473 524
. A idéia é subtrair a soma de verificação de 525, mas como a soma gera 1 também, preciso trabalhar com ela.--P
. Após a aplicação dos dois subtracções (524- (473-1)), a pilha é: 52
. Com 'P', imprimo o caractere com esse código ASCII:, 4
o dígito ausente.function m(s)
character(len=10)::s,t
t='0123456789'
do j=1,10
k=0
do i=1,9
if(s(i:i)==t(j:j))k=1
end do
if(k==0)m=j-1
end do
end
Receio que não seja muito curto.
Ungolfed:
integer function m(s)
implicit none
character(len=9)::s
character(len=10)::t
integer:: i, j, k
t='0123456789'
do j=1,10
k=0
do i=1,9
if (s(i:i) == t(j:j)) k=1
end do
if (k==0) m=j-1
end do
end function m
A,sq-
A, e# The range from 0 to 9: [0 1 2 3 4 5 6 7 8 9]
s e# Cast to a string: "0123456789"
q e# The input
- e# Remove all characters from the range that are in the input
e# Implicit output
Inclui +1 para -r
s/$/0123456789/
:
s/(.)(.*)\1/\2/
t
s/$/0123456789/ # Append 0123456789
: # Start loop
s/(.)(.*)\1/\2/ # remove a duplicate character
t # loop if something changed
ẹ:Ị↔x
Provavelmente deve ser mais curto (ainda estou confuso sobre o porquê disso ẹ
ser necessário), mas é o melhor que posso fazer.
ẹ:Ị↔x
ẹ Split the input into a list of characters
:Ị Pair that list with the string "0123456789"
↔x Remove all elements of the list from the string
x
A implementação é antiga e bastante complicada, e é por isso que você precisa ẹ
.
¬∋ℕ
deveria funcionar em apenas três caracteres - foi o que tentei primeiro - mas há várias razões para isso não acontecer, e não acho que exista uma maneira plausível de mudar o Brachylog para que funcione.
¬∋ℕ
trabalho como esse nem é possível no Prolog, a menos que você esteja programando especificamente o que você quer dizer com não not in
. ¬
em Brachylog é equivalente a \+
Prolog, e seu significado é "não provável sob a suposição do mundo fechado", em vez de "me dê pontos de escolha para tudo que não verifica isso" (que é quase sempre um número infinito de coisas )
(lambda(s)(- 45(reduce'+ s :key'digit-char-p)))
Ungolfed:
(lambda (s) (- 45 (reduce '+ s :key 'digit-char-p)))
Explicação:
(reduce '+ s :key 'digit-char-p)
Isso percorre os caracteres s
, converte-os em dígitos e os adiciona. O dígito-char-p, convenientemente, retorna o número do caractere como seu valor "verdadeiro", para que possa ser usado como teste ou conversão.
(- 45 ...)
Subtrair de 45 devolve o dígito que estava faltando na entrada.
5v&;52/ni?@.>!&oW+
Expandido
5 v
& ;
5 2 / n i ? @ .
> ! & o W + . .
. .
. .
Usa o mesmo tipo de método que essa resposta à prova de balas .
Crie o valor -525 na pilha pressionando 5, 2, concatenar, pressionar 5, concatenar e negar.
Em seguida, obtenha repetidamente a entrada e adicione até o final da entrada ser atingido.
Remova a última entrada, negue (faça positivo) o último resultado da adição, produza o caractere e interrompa.
O motivo para trabalhar de -525 em diante é que a saída de caracteres é atingida para cada iteração de entrada. Como o valor é negativo, nada é produzido até que o loop seja encerrado e o valor negativo seja positivo.
A entrada é inserida na célula
A1
.
Código:
=REGEXEXTRACT(4&2^29,"[^"&A1&"]")
Economizou 6 bytes graças a Steve Kass.
Código anterior:
=REGEXEXTRACT("0123456789","[^"&A1&"]")
Resultado:
=REGEXEXTRACT(0&49^9,"[^"&A1&"]")
também é uma solução válida, dada lógica semelhante. Resposta atualizada.
Salvei 1 byte, movendo o programa para 1 linha e 1 byte, fazendo um cálculo melhor
~+;@.%a--7;#
A soma dos valores ASCII varia de 477 a 468, dependendo do número que está faltando. Subtraindo isso de 7, obtemos o intervalo -470 a -461. Ao modificar esse número por 10, obtemos o intervalo de 0 a 9, que podemos imprimir.
~+; ;# Sums the ASCII values of all characters to stdIn
~ # The # doesn't skip over the ~ because it's on the end of a line
~ Once EOF is hit, the ~ reverses the IP's direction
;# Jump the ; that was used before
--7 Subtract the sum from 7 (really just 0 - (sum - 7))
%a Mod it by 10
@. Print and exit
A razão pela qual eu uso os valores ASCII em vez de receber uma entrada inteira é porque o &
comando no Try it Online é interrompido no EOF (mesmo que ele deva reverter o IP). Mas ~
funciona corretamente.
#v~+
@>'i5*--,
A soma dos valores ASCII de todos os 10 dígitos é 525. Subtraindo a soma dos dígitos fornecidos de 525, obtemos o valor ASCII do caractere ausente.
#v~+ Sums the ASCII values of all characters on stdIn
Moves to the next line when this is done
>'i5* Pushes 525 (105 * 5)
-- Subtracts the sum from 525
@ , Prints and exits
param($n)0..9|?{$n-notmatch$_}
Recebe entrada $n
, constrói um intervalo 0..9
(ou seja, 0, 1, 2 ... 9
) e usa uma Where-Object
cláusula (the |?{...}
) para extrair o número que regex -notmatch
. Isso é deixado no pipeline, a produção está implícita.
-jkUT
-jkUT
T # 10
U # The unary range of ten: [0,1,..,9]
jk # join that on the empty string
- # set minus
"-jUT" também funciona, mas produz novas linhas para cada int.
žhISK
Explicação
žh # from the string "0123456789"
K # remove
IS # each digit of the input