Introdução:
Um BSN holandês (BurgerServiceNummer) é válido quando cumpre as seguintes regras:
- Ele contém apenas dígitos.
- O comprimento deve ter 8 ou 9 de comprimento.
- Quando os dígitos são indexados como
A
completosI
, o resultado da seguinte soma:9xA + 8xB + 7xC + 6xD + 5xE + 4xF + 3xG + 2xH + -1xI
(NOTA -1 em vez de 1!) Deve ser divisível por 11 e não deve ser 0.
Desafio:
Entrada: uma sequência ou conjunto de caracteres representando o BSN.
Saída: Um resultado verdadeiro ou falso, se a entrada é um BSN válido.
Regras do Desafio:
- O formato de entrada deve ser uma string ou um conjunto de caracteres. Você não tem permissão para usar uma matriz int de dígitos ou um número (possivelmente octal). (Você tem permissão para convertê-lo em uma matriz int de dígitos, mas não diretamente como argumento.)
- Apesar da restrição na entrada acima, você pode assumir que todos os casos de teste conterão um ou mais dígitos (
[0-9]+
) - Com relação ao BSN com comprimento 8 em vez de 9, a Wikipedia holandesa declara o seguinte: " Para os onze testes e para outros usos práticos, um zero à esquerda é adicionado para fazer o número 9 " ( fonte )
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, programas completos. 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.
Casos de teste:
// Truthy test cases:
111222333
123456782
232262536
010464554
10464554
44016773
// Falsey test cases:
000000000
192837465
247594057
88888888
73
3112223342
000000012
code-golf
string
arithmetic
decision-problem
Kevin Cruijssen
fonte
fonte
A
a fórmula fornecida?A
a fórmula (ou basicamente adiciona um líder0
para torná-lo comprimento 9, resultando no mesmo resultado que omitirA
).Respostas:
05AB1E ,
2321 bytesExperimente online! ou como um conjunto de testes
Explicação
fonte
DgL
paraā
e0Ê
paraĀ
. Experimente online.JavaScript (ES6) 57
Entrada como uma matriz de caracteres.
reduceRight
salva o dia!Teste
fonte
reduceRight
resposta!map()
, apenas para perceber que a sua resposta é realmente 57 bytes de comprimento :-)R,
8667 bytesEdit: Obrigado a Jarko Dubbeldam por sugerir o produto escalar!
Lê a entrada de stdin e armazena como uma matriz / vetor de caracteres. Subseqüentemente, converta para numérico, multiplique pelo vetor
9...2,-1
e verifique todas as condições.fonte
x
como vetor.if(l<9)x=c(0,x);s=sum(as.double(x)*c(9:2,-1))
pode ser transformado ems=sum(as.double(x)*c(l:2,-1))
. Além disso, a soma do produto aos pares de dois vetores é igual à multiplicação de pontos%*%
.JavaScript (ES6),
61605958 bytesToma uma matriz de caracteres como entrada. Retorna
false
/true
.Casos de teste
Mostrar snippet de código
fonte
C,
1121019698104 bytesObrigado a @MartinEnder por salvar
53 bytesao corrigir meu código!Retorna 0 se inválido, 1 se válido. Experimente online!
fonte
61
mesmo que não seja do tamanho correto.R,
957993 bytesFunção sem nome que recebe uma string como argumento. No começo, eu excedi o requisito de ter uma string como entrada em vez de um número, mas isso é bom, porque economiza alguns bytes na conversão.
Não sei ao certo como interpretar a matriz de caracteres, mas se isso significa que você pode usar um vetor de dígitos
"1" "2" "3" "4" etc
em cadeia como entrada, ele se torna um pouco mais curto:Divide x em um vetor numérico, acrescenta um 0 se o comprimento for 8 e calcula o produto escalar do vetor y e
c(9,8,7,6,5,4,3,2,-1)
. Testa se o resultado é diferente de zero e divisível por 11.Salvou 16 bytes graças à lógica do @Enigma, anexando implicitamente o 0 na criação do vetor
c(length(x):2,-1)
.Esqueceu-se de adicionar a verificação do comprimento 8/9, então +14 bytes :(
fonte
Perl, 58 bytes (52 + 6)
Correr com
Entrada passada através de
STDIN
:Uso
Saídas
1
para o valor0
de verdade ou nada para valores de falsey.fonte
$r+=$_*(-1,2..9)[$i++]for reverse@F
. Além disso,-F -pe
(e a entrada fornecida sem a nova linha final,echo -n
por exemplo) é suficiente (a menos que o seu Perl seja muito antigo, caso em que você precisará-a
(mas no Perls recente, é implícito por-F
)) Finalmente, seu código tinha 70 bytes de comprimento , não 52;)C ++ 14,
107106 bytes-1 byte para em
int
vez deauto
in para loop.Como lambda sem nome, retornando via parâmetro de referência. Requer entrada para ser
std::string
ou um contêiner de char, comovector<char>
.Ungolfed e uso:
fonte
Befunge, 72 bytes
Experimente online!
Explicação
fonte
MATL, 36 bytes
Não é o programa MATL mais longo que eu já escrevi , mas eu gosto de como
if
/else
instruções ficam muito longas muito rapidamente em idiomas de golfe. Eu sinto que essa solução pode não ser ótima no MATL, mas ainda não posso otimizá-la mais. Estou pensando em usar o duplo 0 em algum lugar, e talvez reduzir o número em todos ost
lugares.Experimente online! Explicação:
fonte
!U
vez de48-
[a2:9]*
resulta em uma multiplicação não-elemento-sensitiva; portanto,!
seria necessária outra que compensasse o ganho inicial.MATL , 26 bytes
O resultado é um vetor de coluna não vazio, que é verdadeiro se todas as suas entradas forem diferentes de zero .
Experimente online!
Ou verifique todos os casos de teste com cada resultado em uma linha diferente.
Explicação
Isso testa as três condições na seguinte ordem:
Considere entrada
'8925'
para a explicação.;
é o separador de linhas para matrizes.fonte
?
provavelmente seria mais eficiente, mas não consegui descobrir como reduzir o comprimento de 8 ou 9. VocêGn8-tg=
é muito inteligente.!
?G
empurra um vetor coluna e eu preciso transpô-la para fazer a repetição comg*
Haskell,
116112102 bytesg
conta a soma usada no onze-proef deh
, enquantof
também verifica o comprimento correto e se o onze-proef não é 0. Especialmente, as verificações def
muitos bytes.EDIT: economizou 10 bytes graças a Lynn e
div
arredondando para baixo.fonte
f x=div(length x)2==4&&g x>0&&h x
?Gelatina , 21 bytes
TryItOnline! ou execute todos os casos de teste
Os valores de retorno verdade são diferentes de zero (e são, de fato, o múltiplo de 11).
Quão?
fonte
Python 2, 102 bytes
fonte
Python 2, 96 bytes
Toma uma string como entrada. A função adiciona
'0'
a à frente da string, precisa ou não, e usa os índices negativos do Python para adicionar elementos, começando no final da string e trabalhando de frente para frente.O
-1xI
é tratado separadamente, usando uma segunda chamada paraint()
. Eu não conseguia descobrir como evitar isso sem custar mais bytes do que salvei.def g(s):u=7<len(s)<10and sum(x*int(('0'+s)[-x])for x in range(10))-2*int(s[-1]);print(u%11<1)*u
funcionaria da mesma maneira, pois acrescentaria1
tempos,s[-1]
mas subtraí-lo-ia duas vezes e também acrescentaria0
tempos (algo) que, é claro, não afetariam a soma.fonte
Brain-Flak , 345 bytes
Inclui +3 para
-a
Verdade é 1, Falsy tem um 0 no topo da pilha.
Experimente Online!
Tenho certeza de que existe uma maneira mais curta de fazer a multiplicação em um loop, mas ainda não a encontrei.
fonte
PowerShell v2 +, 96 bytes
OK, eu admito, isso parece uma bagunça completa. E meio que é. Mas, tenha paciência comigo e nós passaremos por isso.
Pegamos a entrada
$n
(como umachar
matriz) e definimos$i
igual a8
menos um valor booleano para saber se há 8 itens$n
. Significado, se houver 8 itens,$i
seria7
.A próxima seção combina o cálculo com a nossa saída. Trabalhando a partir do interior, nós percorrer
$n
com$n|%{...}
. A cada iteração, usamos um pseudo-ternário para criar um dos dois resultados - ou-"$_"
ou(($i+1)*+"$_")
. O índice é baseado em se$i
é0
ou não (ou seja, chegamos ao-1xI
caso da equação de desafio), que é pós-decrementada para a próxima rodada. Tudo isso é reunido em parênteses e-join
editado junto+
. Por exemplo, com entrada111222333
neste momento, teríamos9+8+7+12+10+8+9+6+-3
. Isso é canalizado paraiex
(abreviadoInvoke-Expression
e semelhante aeval
) antes de ser armazenado$b
. Em seguida, pegamos isso%11
e executamos um Boolean-not!(...)
nisso (ou seja, se é divisível por 11, essa parte é$true
). Isso é associado-and$b
a garantir que$b
não seja zero. Esse resultado booleano é deixado no pipeline e a saída é implícita.Exemplos
fonte
PHP
139128 bytesNão foi possível obter a CLI apenas ecoando a verdade de falso. Tinha que fazer dessa maneira. Alguma ideia?
128 bytes: virou "true" e "false" para 1 e 0.
fonte
C #,
120115 bytesIsso percorre o
char[]
que recebe como entrada e retorna verdadeiro ou falso:Fiddle: https://dotnetfiddle.net/3Kaxrt
Tenho certeza de que posso raspar alguns bytes, especialmente no confuso
return
. Todas as idéias são bem-vindas!Editar: salvou 5 bytes graças a Kevin. Eu não tinha idéia que eu poderia usar em
&
vez de&&
!fonte
r>0&&r%11==0&&l<10&&l>7
pode ser jogado golfe parar>0&r%11<1&l<10&l>7
(&&
para&
er%11==0
parar%11<1
). E-'0'
pode ser jogado para-48
.PHP,
868584838279 bytesNota: usa o PHP 7.1 para índices negativos de string.
Execute assim:
Versão para PHP <7.1 (+10 bytes)
Explicação
Tweaks
"0"
, salvou um byte10000000
é inválido, não é necessário comparar comgreater than or equals
,greater than
basta salvar um byte-R
para$argn
disponibilizarfonte
Java 8,
11598 bytesEstou surpreso que ninguém tenha postado uma resposta Java ainda, então aqui está uma.
Explicação:
Experimente aqui.
fonte
Clojure, 114 bytes
Bem, isso é algo,
-
subtrai o restante dos argumentos do primeiro, para que lide com o caso especial de peso-1
. Esta função retornanil
para entradas de tamanho inválido, mas nasif
cláusulas elas operam da mesma forma quefalse
.(#{8 9}(count v))
retornanil
se o comprimento dev
não for 8 ou 9.Casos de teste:
fonte
Perl 5 , 63 + 2 (
-F
) = 65 bytesExperimente online!
fonte
Stax , 23 bytes
Execute e depure online!
Explicação
Usa a versão descompactada para explicar.
fonte