Jogo de números anexados
Escreva uma função / programa que utilize 2 parâmetros inteiros, parâmetros inteiros ou variáveis inteiras , um número inicial e uma contagem máxima de iterações. O código deve executar o exemplo de jogo a seguir para construir um novo número e repetir até que o número fique com um único dígito. por exemplo.
3 7 2 = (3 + 7) & (7 + 2) = 10 9
1 0 9 = (1 + 0) & (0 + 9) = 1 9
1 9 = (1 + 9) = 10
1 0 = (1 + 0) = 1
Basicamente, pegue cada dígito individual e adicione-o ao seu vizinho, acrescentando também o resultado da próxima adição.
A contagem máxima de iterações é para proteger loops infinitos e, quando o máximo for atingido, o código deverá despejar as últimas 5 etapas numéricas. A mesma saída deve ocorrer ao terminar, atingindo um único dígito. Se ocorrerem menos de 5 etapas, apenas produza os números válidos.
A saída deve aparecer como ( Step: Number
) incluindo as últimas 5 etapas das etapas concluídas ou finalizadas:
func(3541, 50)
produziria esse formato exato de saída:
6: 1411
7: 552
8: 107
9: 17
10: 8
func(3541, 5)
produziria:
1: 895
2: 1714
3: 885
4: 1613
5: 774
Todo o cálculo é:
1: 895
2: 1714
3: 885
4: 1613
5: 774
6: 1411
7: 552
8: 107
9: 17
10: 8
Se houver menos de 5 etapas, imprima essas etapas.
Use apenas bibliotecas integradas, os parâmetros podem ser de qualquer lugar (o que for mais fácil para o seu idioma preferido). Não há limite para o tamanho máximo inteiro e, se houver estouros, deixe travar.
Dado que isso não é muito difícil do ponto de vista de um quebra-cabeça, darei até 25 de domingo, 20:00 (UTC + 8), para que as submissões sejam consideradas para a resposta aceita, quando o menor de qualquer idioma será o vencedor.
EDITAR:
Parabéns a Howard por vencer com uma resposta de 48 GolfScript .
Menção especial ao 2º lugar marinus com uma resposta de 66 APL .
Meu favorito pessoal (sendo influenciado pelo JavaScript) foi a resposta do core1024 .
func(3541, 5)
suposto imprimir 5 etapas ou 10?Respostas:
GolfScript,
4846 caracteresObrigado a Peter Taylor por uma melhoria de dois caracteres.
Espera os dois números na pilha. Experimente online .
Exemplos:
fonte
.,,
e transformando o mapa final em apenas{': '*}%
.APL (66)
O argumento da esquerda é a contagem máxima de iterações e o argumento da direita é o número inicial.
Explicação:
∆←⍺{
...}⍕⍵
: passe o argumento esquerdo como um número e o argumento certo como uma sequência para a função que calcula a lista de números e armazene-a em∆
:(1<⍴⍵)∧⍺>0:
: se a quantidade de dígitos for maior que 1 e a quantidade de iterações restantes for maior que0
:⍎¨⍵
: avalie cada dígito2+/
: soma cada par⍕¨
: formate cada número como uma sequência∆←,/
: concatenar as cordas e armazenar em∆
∆,(⍺-1)∇⊃∆
: return∆
, seguido pelo resultado da aplicação dessa função∆
com menos uma iteração permitida⋄⍬
: caso contrário, retorne a lista vazia∆,⍪⍳⍴∆
: emparelhe cada elemento∆
com seu índice em∆
{
...}/
: para cada par:(⍕⍵),': ',⍺
: retorna uma string com o índice, seguido por:
, seguido pelo número↑¯5↑
: transforme a lista de strings em uma matriz para que sejam exibidas em linhas separadas e pegue os últimos 5 itensTeste:
fonte
3 {...} 3541
.:
primeiro)Mathematica, 172 caracteres
Isso é longo demais, graças aos nomes das funções do Mathematica e ao feio manuseio de cordas (o "jogo" real é apenas 76 desses personagens), mas aqui está assim:
Ele espera o número de entrada na variável
n
e o número máximo de iterações emm
.Com menos golfe:
fonte
Ruby, 106 caracteres
Não sou 100% claro sobre as regras de entrada, mas se
n
posso usar como uma sequência, posso salvar 5 caracteres e, se posso usar variáveis predefinidas e escrever um programa em vez de uma função, posso salvar outras 9.Cria uma função
f
que pode ser chamada da seguinte maneira:f[3541, 6]
f[372, 50]
f[9999, 10]
fonte
J -
9692 charEu resolvi isso primeiro, assumindo que todos os jogos terminavam, e isso voltou a me morder durante os testes. Argumento à esquerda é o número de etapas, argumento à direita é a posição inicial, que pode ser fornecida como um número ou uma string.
Isso é um pouco demais e complicado para degolfar satisfatoriamente, então vou dizer o seguinte:
(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)
Esta parte executa o jogo pelo número especificado de etapas.2+/\
é responsável por adicionar cada par de dígitos e<@>:@[
em conjunto com os^:
controles que capturam as etapas intermediárias do jogo.(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".
Esta parte formata todos os resultados comostep: result
.({.~,i.0:)
é garantir que não tomemos muitos passos,#\
sejam os números dos passos e o(,': '&,)&":"0
bit adicione dois pontos e espaço.(-@(<.5<.#){.])
Essa parte corta as etapas relevantes de cinco ou menos da lista completa.<.
significa 'mínimo de'.Funciona, mas se você começar com um número grande o suficiente, os resultados do jogo começam a crescer rapidamente, o que faz com que J mude de números inteiros para duplos imprecisos. aqui estão alguns exemplos:
fonte
Javascript 139
144 150Ungolfed
fonte
Perl,
8684Com novas linhas para facilitar a leitura:
+ Editar: Não há desculpa para não usar a
-n
opção de linha de comando e a pontuação é 82 = 81 + 1 :E, como possível excesso de número inteiro está bom, é 81 = 80 + 1
fonte
Javascript, 247
278288307CharactersFormatado
Editar 1 : ternário removido
Editar 2 : lógica invertida para "pular" 0 índice
Editar 3 : Retrocedendo chamadas recursivas.
Violino
fonte
Bash + coreutils, 115 bytes
Resultado:
fonte
JavaScript (Rascunho do ECMAScript 6) - 134 caracteres
Exemplos:
fonte
Javascript, 182 bytes
fonte
Perl,
166147138129 bytesUngolfed:
Espero que esteja tudo bem que imprima algumas linhas vazias extras se a coisa toda demorar menos de 5 etapas.
fonte
(('')x5, @o, "$i: $s")
por(@o, "$i: $s")
ejoin"\n", @o[-5..0]
comjoin"\n", @o[-5..-1]
. Então você estará com 3 bytes à frente;) #CaracteresJava524405365 [414 bytes]Versão Golfed:
class A{static int n=0;List<String> s=new ArrayList<>();void c(int b,int r){String d=b+"";if(r==0||b <= 9){int m=s.size();for(int i= m>=5?m-5:0;i<m;i++)System.out.println(s.get(i));return;}String l="";for(int i=0;i<d.length()-1;i++)l+=d.charAt(i)+d.charAt(i+1)-96;s.add(++n+":"+l);c(Integer.valueOf(l),--r);}public static void main(String[] a){new A().c(3541,50);}}
Versão legível:
fonte
chatAt
métodoInteger.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");
você poderia fazer(digits[i] + digits[i+1] - 96)
JavaScript 133 bytes
Ungolfed:
fonte
Java, 341 caracteres
371 caracteresFormatado:
Graças a user902383, consegui reduzir o código em 30 caracteres, não dividindo a String em uma matriz usando -96 em vez de "Integer.valueOf ()
fonte
class a{public static void main(String[] a) {p(3541, 50);}static void p(int n,int k){Queue<String> q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}
Dardo,
602588 bytesO dardo é provavelmente um dos piores idiomas para fazer isso ... Preciso encontrar uma maneira melhor de fazer isso.
Enfim, aqui está a minha entrada:
Entrada através do console
E a versão ungolfed, um pouco unminified:
fonte
PERL
135 129/125125/121 bytesTem o mesmo bug que a resposta de Tal
Edite 129 bytes como uma função:125 bytes como uma função:125 bytes como um script de console (sem o hashbang):121 bytes como um script de console (sem o hashbang):
Expandido:
Teste com
c(372,4);
:Teste com
c(3541,50);
:fonte
C # - 269
Legível:
Uso:
Resultado:
fonte
Cobra - 363
Um resultado bastante deprimente ... mas ei, eu ainda venci o Java.
Ele deve ser imune a estouros de inteiros para casos de teste práticos.
fonte
Python 2.7,
174173158 caracteresUsando muitas strings para executar a tarefa.
Python 2.7, 155 caracteres
Versão que define uma função
Versão ligeiramente não destruída:
fonte
Haskell, 154
exemplo de uso:
Para torná-lo mais legível, use
putStr
:fonte
putStr $ 3541#50
e compare com o exemplo do OP. Caso contrário, fico feliz que tenha um sujeito Haskell aqui.Groovy -
191182 caracteresCom base na solução de Thomas Rüping , portada para o Groovy 2.2.1:
Execução e saída:
Ungolfed:
fonte
** C
186179174 **Um pouco menos golfe (minigolfe?)
Apenas aloque memória suficiente para armazenar cinco resultados ciclicamente. O loop externo continua até atingirmos o limite ou atingirmos um único dígito. O loop interno adiciona o último dígito do número ao último dígito de 1/10 do número e adiciona isso, multiplicado pela potência relevante de 10 ao resultado. Divida o número que você primeiro pensou por 10 e repita para obter o total. Em seguida, imprima até os últimos cinco resultados.
O próximo desafio é ver se consigo me barbear o suficiente para vencer algumas linguagens de script no golfe.
Edit: Agora compila com aviso, mas cinco caracteres são removidos removendo a declaração "void"
fonte
C # -
309330320306 bytesVersão Golfed:
Uso: F (3541,50);
Versão ungolfed para legibilidade:
Sugestões para melhoria são sempre bem-vindas! ;)
Edit: Removido String.Empty e substituiu-o por "" para economizar 10 bytes.
Edit 2: Graças a malik pela dica com as cordas!
fonte
.ToCharArray()
. Uma string = matriz de caracteres.ToString()
, faça+""