Dada uma trava de combinação padrão como a da foto. A maneira de desbloqueá-lo é alinhar os 4 números no código na linha de combinação. Depois de anos de serviço leal, você foi demitido da fábrica de fechaduras e decidiu se vingar não estragando as fechaduras antes de enviá-las, deixando assim cada fechadura com a combinação para desbloqueá-la na linha de combinação.
Você também sabe que, observando a ordem dos números nas outras linhas, é possível determinar quais números devem estar na linha de combinação (e, portanto, a combinação para desbloqueá-lo).
Se cada linha do bloqueio receber um número começando da linha 0 da linha de combinação (a linha que desbloqueia o bloqueio) até a linha 9. Por exemplo, se os números da linha 4 forem 5336
, então a combinação para desbloqueá-lo seria 1992
.
Infelizmente, os bloqueios já foram empacotados e sua visão de cada bloqueio é obscurecida, portanto, você só pode ver números em diferentes linhas do bloqueio.
O desafio
Dados 4 pares de dígitos, em que o primeiro dígito do número inteiro representa o número da linha e o segundo dígito representa o número que aparece nessa linha, calcule a combinação da fechadura. Por exemplo, se você digitar:
57 23 99 45
Então ele deve gerar:
2101
Ou
25 78 63 15
e
3174
Suponha que a entrada sempre terá 4 números inteiros positivos na forma `25 64 72 18.
Isso é código-golfe , então os programas mais curtos em número de bytes vencem.
Além disso, esta é minha primeira pergunta, portanto qualquer feedback é apreciado.
57 23 99 45
. Não são quatro pares de números inteiros: são quatro números inteiros. E algumas respostas estão assumindo que elas entendem isso como uma string, enquanto outras estão assumindo que ela vem pronta como 4 ints.0
).Respostas:
CJam,
98 bytesLê os pares de dígitos como argumentos da linha de comando. Para experimentar o código online , mude
ea
paralS/
para ler a partir de STDIN simulado.Exemplo de execução
Como funciona
O código de caractere do dígito d é 48 + d . Assim, considerando a sequência de dois dígitos xy, um número base 9 produz 9 * (48 + x) + (48 + y) = 10 * (48 + x) + y - x ≡ y - x (mod 10) .
fonte
"99"
é realmente interpretada como a matriz[57 57]
porb
;"xy"9b
é implementado como9 * ord(x) + ord(y)
. Devo acrescentar isso à minha resposta.CJam,
131211 caracteresGraças ao user23013, agora ele tem 11 caracteres :)
Explicações:
Experimente online
Eu sei que pode ser jogado mais. Mas esta é a minha primeira tentativa real no CJam e estou limitado pela experiência :)
Como alternativa, os outros métodos para fazer a mesma coisa em 1 caractere extra:
ou
ou
fonte
l~]
. Eu me sinto como analisar a entrada deve ser possível com menos de três anos, mas eu nunca usei CJam antes: /4{ri_A/-A%}*
é um byte mais curto.4{Ar:--A%}*
.Golfe (14
13)Experimente online aqui
É praticamente o mesmo que a solução Optimizer , mas em um idioma diferente. É difícil abordá-lo de uma maneira diferente, porque o problema é bastante simples
, então o empate definitivamente vai para o Optimizer, cuja entrada era anterior de qualquer maneira.Para o mesmo número de bytes, você pode fazer
fonte
- 10
.GNU dc , 14 bytes
Usando o truque inteligente da base 9 de Dennis :
Inteiros de entrada lidos em STDIN, um por linha.
Explicação:
Saída:
Resposta anterior, 18 bytes:
Porque eu pensei que poderia me aproximar dos idiomas "golfe" com isso (mas não o fiz):
fonte
9i[?A%nd]dxxxx
C
646356 ou 61Se a entrada puder ser canalizada do arquivo
Se a entrada deve ser digitada como stdin
Lê os quatro números em um loop e depois processa cada um subtraindo o primeiro dígito do valor e imprimindo o módulo de resultado 10.
Economia graças a vários comentários abaixo e também usando putchar em vez de printf
fonte
scanf
lado de fora ofor()
seguinte:a,i;main(){for(;i++-4;printf("%d",(a-a/10)%10))scanf("%d",&a);}
a*.9
vez dea-a/10
while
loop e declarandoa
como argumentomain
:main(a){while(scanf("%d",&a)>0)printf("%d",(a-a/10)%10);}
Python 3, 64
Direto.
Pode ser mais curto se eu puder imprimir, por exemplo
[2, 1, 0, 1]
( 46 ):fonte
str((i-i//10)%10)
diretamente, em vez de usar um segundomap()
. Comecei com geradores também para os meus, mas descobri que umfor
loop real acabou sendo mais curto.print(''.join((i-i//10)%10for i in map(int,input().split())))
. Além disso, se os espaços são allowd na saída você pode evitarjoin
e uso tupla-desembalar:print(*((i-i//10)%10for i in map(int,input().split())))
.C, 92
Entrada da linha de comando. Subtrai o primeiro código ASCII de cada argumento do segundo, adiciona 10 e pega o módulo 10.
Acho que é a primeira vez que escrevo um
printf
com quatro se%
nenhuma vírgula (a vírgula está na#define.
)fonte
#define f scanf("%c%c ",&a,&b);putchar(48+(9*a+b)%10)
seguido pora,b;main(){f;f;f;f;}
seria 18 bytes mais curto.scanf
é necessário, considerando que elescanf
deve analisar o espaço em branco apenas como um separador. Alquimista tem uma idéia ainda melhor em C. Mas parece que você já ganhou com a sua resposta Cjam.a(n)
pode ser omitido, então notei que colocarprintf("%d%,...)
sua macro economizaria alguns bytes e, finalmente, me empolguei um pouco ... - O espaço é necessário, pois%c
lê um caractere, qualquer caractere, portanto, na segunda execução, ele armazenaria 32 pola
. - Bater CJam com C deve ser difícil.printf()
já é tão longa como a minha resposta ...Java - 203 bytes
Só porque tem que haver uma entrada Java, eu vi uma boa oportunidade para dar a esse código a chance de jogar golfe (a primeira submissão de todos os tempos).
Se houver espaço para algumas melhorias, eu ficaria feliz em saber sobre elas ;-)
fonte
Lua - 46 caracteres
Lê três caracteres por vez (conceda-me a pequena misericórdia de inserir um espaço no final), e mesmo que aeb sejam string y ... ba MAGICALUALY permite que eles concebam um bebê inteiro saudável. O wrap-around verifica durante a impressão.
fonte
JavaScript ES6 -
5343 bytesFunção bastante direta, usa regex para obter os números. Experimente em http://jsfiddle.net/efc93986/1/ . Se funções não forem permitidas, um programa independente de 52 bytes:
Como o ES6 atualmente funciona apenas no Firefox, o código a seguir funciona em qualquer navegador moderno, com 70 bytes:
fonte
1+
....?
vez de/\d+ ?
. O espaço após o retorno pode ser omitido. Além disso, como nenhuma E / S específica foi especificada, você poderá usar uma função.a-a[0]
em vez de1+a[1]-a[0]
deve funcionar também.Python 2 - 33 bytes
Aceita entrada de usuário delimitada por vírgula. Por exemplo, Entrada:
Saída:
Se a saída for necessária para corresponder exatamente ao exemplo, será muito mais longo. 47 bytes:
fonte
input()
não funciona no meu intérprete Python 2.APL, 14
A explicação
⎕
recebe as informações da tela. Valores separados por espaço são analisados como uma matriz.{...}¨
para cada número, alimente-o na função.⍎¨⍕⍵
pega o argumento, cria uma matriz de seus dígitos.--/
calcula unidades menos dezenas.10|
mod 10.fonte
J -
2015A forma não-verbal (como instrução em vez de definição de função) é 5 caracteres mais curta:
A forma verbal que é um bom trem :
Este verbo usado nas entradas de exemplo:
fonte
Haskell
6058Dígitos de caracteres únicos, um verdadeiro inimigo no golfe Haskell.
fonte
Perl:
3840Saída:
fonte
abs
não é necessário;x - x/10
não pode ser negativo. 3. Se você usar os sinalizadores-040pe
(normalmente contados como 5 bytes) para iterar sobre a entrada delimitada por espaço, poderá reduzir o seu código para$_=($_-int$_/10)%10
. 4. Se você preferir evitar os sinalizadores da linha de comando, ainda poderá salvar alguns bytes configurando$/=$;
e removendo a chamada parasplit
.Ruby, 35 bytes
Explicação
A entrada é aceita como argumentos de linha de comando.
String#bytes
retorna uma matriz de números inteiros (códigos de caracteres ASCII). Somente a diferença entre o código do último e do primeiro caractere é importante, não os números inteiros.fonte
C # e LinqPad: 104
fonte
C ++ 118
fonte
#include<iostream>
estd::
antescin
ecout
. 2. Você não precisa do condicional se omitira=a%10
. 3. Você não precisa das variáveisb
ec
dos feeds de linha e (com algumas modificações) dos colchetes ao redor do loop for.#include<iostream>
eusing namespace std;
PHP - 90 caracteres
Pensei em tentar o código de golfe, então aqui está, minha primeira tentativa - provavelmente pode ser mais um jogo de golfe.
58 caracteres (cortesia de Ismael Miguel)
Acesse o arquivo usando
fonte
<? for($i=0;$i<4;)echo abs($_GET[n][$i]%10);
que tem 44 caracteres. Acesse a partir de um navegador usandofile.php?n[]=xx&n[]=yy&n[]=xy&n[]=yx
. (código não testado)$_GET
mas exibe 57% 10 e eu preciso (5-7)% 10 #<? for($i=0,$a=$_GET[n];$i<4;++$i)echo abs($a[$i][0]-$a[$i++][1]%10);
. Infelizmente, tem 65 bytes de comprimento. (esqueceu o$i
incremento no último) Ou você pode tentar<? for($i=0;$i<8;)echo abs($_GET[n][$i++]-$_GET[n][$i++]%10);
acessar o navegador usandofile.php?n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y
, com 61 bytes de comprimento.$_GET['n']
tho. Editei minha resposta.<? for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);
. O%10
é inútil e este simplesmente parece melhor. Além disso, você pode acessá-lo usandofile.php?n[]=xyxyxyxy
. Esta solução tem 58 bytes.Python 3, 60
Entrada e saída exatamente como especificado, embora não imprima uma nova linha à direita. Dois truques interessantes aqui: 1) substituindo duas chamadas
int()
por uma chamada paraeval()
e 2) usandojoin()
para obter ea-b
, em seguida, negando-ob-a
conforme necessário. Felizmente, o operador de módulo do Python fornece valores positivos, mesmo que o primeiro argumento seja negativo!fonte
eval('-'.join(x))
truque é brilhante.)