Introdução
Neste desafio, você deve dividir um número inteiro em duas partes. Como ninguém gosta de comer o pedaço menor de bolo, seu objetivo é ser o mais justo possível. Por exemplo, se você deseja dividir o número inteiro 7129
em duas partes, existem três maneiras possíveis de fazer isso.
7,129
, 71,29
e 712,9
são todas as possibilidades, mas 71,29
é a maneira mais justa de dividi-lo em duas partes, porque minimiza a diferença entre as duas:
7 129 -> |7-129| = 122
71 29 -> |71-29| = 42
712 9 -> |712-9| = 703
Desafio
Dado um número inteiro, determine a melhor maneira possível de particioná-lo, conforme descrito acima, e relate a diferença resultante.
Regras
- A divisão só faz sentido para números inteiros de comprimento pelo menos dois, a entrada sempre será ≥ 10
- A entrada pode ser um número inteiro, lista de dígitos ou uma sequência
- Você não precisa lidar com entradas inválidas
Casos de teste
Você só precisa relatar a diferença resultante, o particionamento está aqui apenas para ilustração:
10 -> 1,0 -> 1
11 -> 1,1 -> 0
12 -> 1,2 -> 1
13 -> 1,3 -> 2
101 -> 1,01 -> 0
128 -> 12,8 -> 4
313 -> 3,13 -> 10
1003 -> 1,003 -> 2
7129 -> 71,29 -> 42
81128 -> 81,128 -> 47
999999 -> 999,999 -> 0
9999999 -> 999,9999 or 9999,999 -> 9000
fonte
05AB1E , 9 bytes
Código:
Usa a codificação 05AB1E . Experimente online!
Explicação
fonte
£
por°‰
não precisará¤â
mais.Python 2 , 64 bytes
Experimente online!
fonte
Perl 6 , 40 bytes
Teste-o
Expandido:
fonte
C, 94 bytes
Experimente online!
fonte
Python 2 , 51 bytes
Experimente online!
fonte
Prolog (SWI) ,
195189154117112 bytes35 bytes economizados graças ao Eminga
Experimente online!
Esta é a minha primeira tentativa no golfe de prólogo, por isso pode ser um pouco horrendo. Aqui está como isso funciona.
No nível mais alto que temos
*
.*
levaA
eH
, e determina seH
é a menor maneira de dividirA
.A primeira linha aqui usa uma técnica desta postagem do SO , para executar essencialmente um mapa do predicado
r(A)
sobre os números inteiros de0
atéA
. Comor
confirma os valores de cada partição, isso nos fornecerá os valores de todas as partições possíveis, além de uma carga completa de lixo adicional. Todas essas partições serão armazenadasL
em nenhuma ordem específica. Feito isso, classificamos a lista para encontrar o menor elemento. Em seguida, usamos um corte para impedir o rastreamento.Em seguida, temos a definição de
r
. Primeiror
calcula os dois resultados da divisão nomeando-osX
eY
.Então afirmamos que essa
C
é a diferença deles e é positiva.fonte
X is div(A,10**B),Y is div(A,10**B)
sempre daráC=0
(o significadoH
sempre será 0 também). Devo serY is mod(A,10**B)
eu presumo.r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).
economizando 32 bytes (se você estiver usando o prólogo SWI, pelo menos, não tenha certeza de outras versões).A*H
vez del(A,H)
salvar outra 3. E se você estiver usando SWI, poderá adicionar um link TIO,!
? Não deve haver nenhum retrocesso nesse ponto.,!
que não seria necessário, mas quando eu testo o programa, ele retorna. Parece tentar todas as ordens possíveisL
e depois classifica todas elas. Isso significa que dará os mesmosA!
tempos de resposta .Haskell ,
6865 bytesExperimente online!
Explicação
fonte
Carvão , 14 bytes
Experimente online! Link é a versão detalhada do código. Convenientemente, uso a variante 2-arg de
Slice
. Explicação:fonte
Geléia ,
98 bytesExperimente online!
-1 byte graças a Dennis. Entrada é uma lista de dígitos.
Explicação
fonte
Funky ,
15913499 bytesNa verdade, o ajuste das especificações é mais curto, parece.
Experimente online!
fonte
Retina , 36 bytes
Experimente online!
Explicação
Isso gera todas as partições possíveis em linhas separadas, bem como uma linha final com a entrada original.
Converta cada número em cada partição em unário.
Remova uma quantidade máxima e igual de
1
s de ambas as partes de cada partição (ou seja, remova o mínimo e subtraia do máximo, o que indica a diferença absoluta).Classifique as linhas.
Conte os
1
s na primeira linha, o que fornece a diferença absoluta mínima.fonte
J ,
32, 2723 bytes-5 bytes graças ao FrownyFrog! -4 bytes se a entrada for uma sequência.
Experimente online!
Original: tira um número como entrada
Como funciona:
Experimente online!
fonte
JavaScript (ES6), 64 bytes
Recebe a entrada como uma sequência.
Casos de teste
Mostrar snippet de código
Comentado
Não recursivo (ES7), 65 bytes
Recebe a entrada como uma sequência.
Casos de teste
Mostrar snippet de código
Comentado
Nota : Nas duas versões,
l
é coagido a uma sequência na primeira iteração. Normalmente, devemos ter cuidado com zeros à esquerda em um literal numérico:0123 - 10 === 73
porque0123
é analisado como um valor octal (agora está obsoleto, mas ainda é válido no modo não estrito). Mas'0123' - '10' === 113
, o zero principal sendo desta vez ignorado. Então, é bom fazê-lo.A partir da especificação da operação abstrata
ToNumber
aplicada a uma sequência:fonte
APL (Dyalog) , 27 bytes
Experimente online!
Quão?
¯1+≢⍵
- comprimento den
menos 1∘.=⍨⍳
- matriz de identidade1,
- preceder1
para cada linha↓
- dividido por linhas⊂∘⍵¨
- para cada um, particione a string por ele↑
- achatar-/
- reduza cada par com subtração|
- tomar valores absolutos⌊/
- mínimoAPL (Dyalog) , 35 bytes
Experimente online!
fonte
Gelatina , 11 bytes
Experimente online!
-3 bytes graças a dylnan
Como funciona
fonte
L=2$$Ðf
paraṖLÐṂ
neste casoPython 2 , 58 bytes
Experimente online!
fonte
Pitão , 15 bytes
Experimente online!
fonte
MATL , 15 bytes
Entrada é uma sequência que representa o número inteiro.
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Wolfram Language (Mathematica) , 66 bytes
Leva uma lista de dígitos.
Experimente online!
fonte
Limpo ,
10683 bytesDefine a função
@
, usando uma string.Principalmente evidente, a única parte complicada é
f=toInt o(%)n
: Isso pega atoInt
classe de funções e a compõe (o
) com a classe de operador de fatia com curry (%
) já fornecida com o primeiro argumento (n
). Como existe apenas um tipo (String
equivalente a{#Char}
) que possui sobrecargas para ambos%
etoInt
a linha realmente compila, enquanto normalmente é difícil compor funções durante o golfe devido à falta de informações contextuais fornecidas ao compilador.Experimente online!
fonte
Gelatina , 12 bytes
Um link monádico que obtém uma lista de dígitos e retorna o número inteiro.
Experimente online!
Quão?
fonte
Pitão, 10 bytes
Suíte de teste
Recebe a entrada como uma sequência.
Isso usa um dos recursos mais recentes do Pyth, que é aplicar a função a uma lista como padrão para mapear a função na lista, se nenhum outro comportamento for definido. Isso significa que o
v
aplicado a uma lista de lista de cadeias avalia todas as cadeias.Observe que a lista de divisões permite a divisão em 1 parte, mas o valor disso sempre será maior que o mínimo, portanto é ignorado com segurança.
fonte
Tcl , 116 bytes
Experimente online!
Explicação
Ele funciona usando um truque de regex, permitindo um caso final degenerado que sempre será computado para maior que a diferença mínima. Para "12345", os valores são:
fonte
lmap
vez deforeach
: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/…Ruby , 44 bytes
Experimente online!
fonte
APL + WIN, 31 bytes
Solicita a entrada na tela do número inteiro como uma sequência.
Explicação:
fonte
Perl 5 ,
5141 + 1 (-p
) = 42 bytesExperimente online!
inspirado no comentário de @ Nahuel-Fouilleul
fonte
$\--;$d=abs$``-$',$\=$\<0|$d<$\?$d:$\while//g}{
C # (.NET Core) ,
112107 + 18 = 125 bytesExperimente online!
A contagem inclui os 18 bytes em
using System.Linq;
. Recebe entrada como astring
.fonte
string.Remove
pode economizar alguns bytesLisp comum, 131 bytes
Minha primeira vez participando de código de golfe e decidi usar o Lisp, já que eu gosto.
Aqui está a minha solução:
A entrada precisa ser uma sequência, não um número inteiro ou lista.
fonte