A maneira mais criativa de reverter um número inteiro positivo [fechado]


40

Forneceu uma entrada como um número inteiro não assinado:

13457

Sua função / sub-rotina deve retornar:

75431

Como este é um concurso de popularidade, seja criativo. Soluções criativas usam técnicas incomuns ou inteligentes para realizar determinada tarefa.

Restrições:

  • Você não pode usar matrizes.
  • Você não pode usar strings.
  • Nenhuma substituição de RTL ( &#8238)

Brownie aponta para o uso de aritmética criativa.

Como este é um concurso de popularidade, sugiro não usar o %operador modulo ( ) no seu código.

Sobre zeros à esquerda:

Se a entrada for:

12340

Então a saída:

4321

seria aceitável.



3
@microbian Não, esse era código de golfe. Este é um concurso de popularidade.
21320 Victor Stafusa

2
As pessoas serão marcadas se você começar a alterar as regras agora. Ele parece estar indo bem para mim, basta executar o seu próximo desafio através do sandbox primeiro: meta.codegolf.stackexchange.com/questions/1117/...
Hosch250

2
E se 1230for a entrada? Estamos autorizados a produzir 321? (Caso contrário, Strings são necessárias).
Justin

2
Estou votando para encerrar isso como fora de tópico, porque falta um critério objetivo de validade - "ser criativo" é subjetivo.
Mego

Respostas:


49

Mathematica, sem módulo!

n = 14627;
length = Ceiling[Log[10, n]];
img = Rasterize[n, RasterSize -> 400, ImageSize -> 400];
box = Rasterize[n, "BoundingBox", RasterSize -> 400, ImageSize -> 400];
width = box[[1]]; height = box[[3]];
ToExpression[
 TextRecognize[
  ImageAssemble[
   ImageTake[img, {1, height}, #] & /@ 
    NestList[# - width/length &, {width - width/length, width}, 
     length - 1]]]]

Vamos dividir.

Primeiro, usamos algumas "aritméticas criativas" para descobrir quantos dígitos existem no número: length = Ceiling[Log[10, n]];

Em seguida, rasterizamos o número para uma boa imagem grande:

buzinando grande número rasterizado

Agora, consultamos a caixa delimitadora dessa imagem e preenchemos a largura e a altura (na verdade, usando o deslocamento da linha de base em vez da altura da imagem, porque o MM adiciona algum espaço em branco abaixo da linha de base na imagem).

Em seguida, o NestList subtrai recursivamente a largura da imagem dividida pelo comprimento da string para permitir que o ImageTake retire os caracteres do final da imagem, um por um, e esses são remontados pelo ImageAssemble para esta imagem:

buzinando grande número invertido

Em seguida, passamos isso para a função TextRecognize para reconhecimento óptico de caracteres, que com esse tamanho de imagem e qualidade de rasterização é capaz de reconhecer impecavelmente a saída final e fornecer o número inteiro:

72641

Logaritmos e OCR - É como chocolate e manteiga de amendoim!

Novo e melhorado

Esta versão preenche o número para lidar com o comportamento obstinado do TextRecognize com números pequenos e, em seguida, subtrai o preenchimento no final. Isso funciona mesmo para números de um dígito!

No entanto, por que você executaria uma rotina reversa em um único número é um mistério para mim. Mas, apenas por uma questão de completude, eu até o fiz funcionar para entradas de zero e uma, que normalmente quebrariam porque o log pavimentado não retorna 1 para elas.

n = 1;
pad = 94949;
length = If[n == 1 || n == 0, 1, Ceiling[Log[10, n]]];
img = Rasterize[n + (pad*10^length), RasterSize -> 400, 
   ImageSize -> 400];
padlength = length + 5;
box = ImageDimensions[img];
width = box[[1]]; height = box[[2]];
reversed = 
  ImageResize[
   ImageAssemble[
    ImageTake[img, {1, height}, #] & /@ 
     NestList[# - width/padlength &, {width + 1 - width/padlength, 
       width}, padlength - 1]], 200];
recognized = ToExpression[TextRecognize[reversed]];
(recognized - pad)/10^5

2
Bata-me para isso. Você tem meu voto !! [mas eu ia usar o C #]
HL-SDK

11
TextRegognizenão está funcionando para números pequenos. E você digitou um erro height = b[[3]];. Verifique também a minha resposta também, por favor! :)
swish

Outro problema TextRecognizeé que ele retorna uma String, o que não é permitido e você também precisa convertê-lo novamente em número.
swish

Obrigado por detectar o erro de digitação ... Eu estava tornando os nomes das variáveis ​​mais amigáveis ​​ao leitor antes de enviar e perdi um. Também jogou o ToExpression ausente. E publiquei uma revisão que lida com o problema dos pequenos números até um dígito.
Jonathan Van Matre

Uau ... isso é elaborado!
duci9y

39

Perl / LuaTeX / Tesseract

O seguinte script Perl lê o número como argumento de linha de comando, por exemplo:

    1234567890

O seguinte script Perl imprime o número via LuaTeX. Uma fonte virtual é criada em tempo real que espelha os dígitos horizontalmente.

temp0.png

Em seguida, o número inteiro é novamente espelhado horizontalmente:

temp1.png

A imagem final é relida via OCR (tesseract):

    0987654321

#!/usr/bin/env perl
use strict;
$^W=1;

# Get the number as program argument or use a fixed number with all digits.
$_ = shift // 1234567890;

$\="\n"; # append EOL, when printing

# Catch negative number
exit print "NaUI (Not an Unsigned Integer)" if $_ < 0;

# Catch number with one digit.
exit ! print if ($_ = $= = $_) < 10;

undef $\;

# Write TeX file for LuaTeX
open(OUT, '>', 'temp.tex') or die "!!! Error: Cannot write: $!\n";
print OUT<<"END_PRINT";
% Catcode setting for iniTeX (a TeX format is not needed)
\\catcode`\{=1
\\catcode`\}=2
\\def\\mynumber{$_}
END_PRINT
print OUT<<'END_PRINT';
\directlua{tex.enableprimitives('',tex.extraprimitives())}
\pdfoutput=1 % PDF output
% move origin to (0,0)
\pdfhorigin=0bp
\pdfvorigin=0bp
% magnify the result by 5
\mag=5000

% Create virtual font, where the digits are mirrored
\directlua{
  callback.register('define_font',
    function (name,size)
      if name == 'cmtt10-digits' then
        f = font.read_tfm('cmtt10',size)
        f.name = 'cmtt10-digits'
        f.type = 'virtual'
        f.fonts = {{ name = 'cmtt10', size = size }}
        for i,v in pairs(f.characters) do
          if (string.char(i)):find('[1234567890]') then
            v.commands = {
               {'right',f.characters[i].width},
               {'special','pdf: q -1 0 0 1 0 0 cm'},
               {'char',i},
               {'right',-f.characters[i].width},
               {'special','pdf: Q'},
            }
          else
            v.commands = {{'char',i}}
          end
        end
      else
        f = font.read_tfm(name,size)
      end
      return f
    end
  )
}

% Activate the new font
\font\myfont=cmtt10-digits\relax
\myfont

% Put the number in a box and add a margin (for tesseract)
\dimen0=5bp % margin
\setbox0=\hbox{\kern\dimen0 \mynumber\kern\dimen0}
\ht0=\dimexpr\ht0+\dimen0\relax
\dp0=\dimexpr\dp0+\dimen0\relax
\pdfpagewidth=\wd0
\pdfpageheight=\dimexpr\ht0+\dp0\relax

% For illustration only: Print the number with the reflected digits:
\shipout\copy0 % print the number with the reflected digits

% Final version on page 2: Print the box with the number, again mirrored
\shipout\hbox{%
  \kern\wd0
  \pdfliteral{q -1 0 0 1 0 0 cm}%
  \copy0
  \pdfliteral{Q}%
}

% End job, no matter, whether iniTeX, plain TeX or LaTeX
\csname @@end\endcsname\end
END_PRINT

system "luatex --ini temp.tex >/dev/null";
system qw[convert temp.pdf temp%d.png];
system "tesseract temp1.png temp >/dev/null 2>&1";

# debug versions with output on console
#system "luatex --ini temp.tex";
#system qw[convert temp.pdf temp%d.png];
#system "tesseract temp1.png temp";

# Output the result, remove empty lines
open(IN, '<', 'temp.txt') or die "!!! Error: Cannot open: $!\n";
chomp, print while <IN>;
print "\n";
close(IN);

__END__

6
+1 para TeX. Precisamos de mais respostas TeX!
Jonathan Van Matre

25

Brainfuck

Basicamente, é apenas um programa de reversão de entrada.

,[>,]<[.<]

UPD: Como Sylwester apontou nos comentários, nos intérpretes / compiladores clássicos de Brainfuck (sem possibilidade de sair do ponto zero na matriz de memória) este programa não funcionaria na ausência de '>' no início, portanto, mais estável version is:

>,[>,]<[.<]

4
Programa Bf mais curto que eu já vi. Além disso, muito arrumado.
Nit

2
Sem um >no início para criar uma célula zero antes dos dados, isso não funcionará em muitos intérpretes / compiladores.
precisa

11
@Danek true, todas as células são inicializadas em zero e a primeira coisa que você faz é ler o primeiro dígito na primeira célula. [.<]não tem célula zero para parar por causa disso e falhará. Erro de bf -n rev1.bfé Error: Out of range! Youwanted to '<' below the first cell.. Se você compilar, recebe um segfaulttalvez.
precisa

3
+1 demasiado mesmo se BF é tudo sobre matrizes então eu não tenho certeza que se encaixa a regra não use gama
Michael M.

11
@Nit eco é muito mais curto:,[.,]
Cruncher

20

Haskell

reverseNumber :: Integer -> Integer
reverseNumber x = reverseNumberR x e 0
    where e = 10 ^ (floor . logBase 10 $ fromIntegral x)

reverseNumberR :: Integer -> Integer -> Integer -> Integer
reverseNumberR 0 _ _ = 0
reverseNumberR x e n = d * 10 ^ n + reverseNumberR (x - d * e) (e `div` 10) (n + 1)
    where d = x `div` e

Sem matrizes, strings ou módulos.

Além disso, eu sei que não devemos usar listas ou strings, mas adoro o quão curto é quando você faz isso:

reverseNumber :: Integer -> Integer
reverseNumber = read . reverse . show

2
Vários frequentadores do site haviam aumentado sua votação para o dia, portanto tenha paciência. :)
Jonathan Van Matre

19

C ++

/* 
A one-liner RECUrsive reveRSE function. Observe that the reverse of a 32-bit unsigned int
can overflow the type (eg recurse (4294967295) = 5927694924 > UINT_MAX), thus the 
return type of the function should be a 64-bit int. 

Usage: recurse(n)
*/

int64_t recurse(uint32_t n, int64_t reverse=0L)
{
    return n ? recurse(n/10, n - (n/10)*10 + reverse * 10) : reverse;
}

11
Seria mais legal com?:
mniip 4/14

@mniip Boa ideia
Ali Alavi

+ 1 Brilhante. Gostaria que houvesse mais votos.
duci9y

Parabéns por capturar o caso de estouro.
Jonathan Van Matre

18

Suponho que alguém tem que ser o causador da festa.

Bater

$ rev<<<[Input]

 

$ rev<<<321
123
$ rev<<<1234567890
0987654321

As limitações de tamanho dependem do seu shell, mas você ficará bem dentro do razoável.


2
bem jogado senhor. bem jogado
usuário

4
Como isso não é uma string?
Não que Charles

11
Isso pode ser uma string. Você tem certeza de que o bash aceita a entrada como números inteiros quando possível?
Duci9y

3
Tudo é uma string no Bash, a menos que seja declarado o contrário, por exemplo declare -i. Compare foo=089e declare -i foo=089(número octal inválido).
L0b0 4/03

3
De acordo com o comentário de @ l0b0, esta resposta é inválida.
Duci9y

15

Javascript

EDIT : Como há uma sugestão para não usar o %operador, eu uso um pequeno truque agora.

Eu sei que isso não é um código de golfe, mas não há razão para prolongá-lo.

function r(n){v=0;while(n)v=n+10*(v-(n=~~(n/10)));return v}

r(13457) retorna 75431

Além disso, é muito mais rápido que o método string ( n.toString().split('').reverse().join('')):

insira a descrição da imagem aqui

==> Relatório JSPerf <==


2
Que tal usar em ~~vez de Math.floor?
21320 Victor Stafusa

Sim, isso seria mais curto, mas menos compreensível.
Michael M.

2
Não é este o método de reversão de número inteiro? Acho que escrevi esse algoritmo para trabalhos de casa.
User2357112 suporta Monica

Como no comentário acima, esse é apenas o algoritmo de reversão de número inteiro padrão. Tanto quanto eu posso ver a parte criativa é apenas o uso de ~~, em vez de Math.floor(a mudança sugerida por @Victor)
Bertie Wheen

+1 para teste de desempenho. todas as grandes mentes criativas realizam testes de desempenho com antecedência e frequência. : D
Jonathan Van Matre

10

Python

Não tenho certeza se esta implementação se qualifica para matemática criativa

Também o operador% não foi usado per se, embora se possa argumentar que o divmod faz o mesmo, mas a pergunta precisa ser reformulada :-)

Implementação

r=lambda n:divmod(n,10)[-1]*10**int(__import__("math").log10(n))+r(n /10)if n else 0

demonstração

>>> r(12345)
54321
>>> r(1)
1

Como funciona?

Esta é uma solução divmod recursiva * Essa solução determina o dígito menos significativo e o envia para o final do número. *

Mais uma implementação em Python

def reverse(n):
    def mod(n, m):
        return n - n / m * m
    _len = int(log10(n))
    return n/10**_len + mod(n, 10)*10**_len + reverse(mod(n, 10**_len)/10)*10 if n and _len else n

Como funciona?

Esta é uma solução recursiva que troca os dígitos extremos do número

Reverse(n) = Swap_extreme(n) + Reverse(n % 10**int(log10(n)) / 10) 
             ; n % 10**log10(n) / n is the number without the extreme digits
             ; int(log10(n)) is the number of digits - 1
             ; n % 10**int(log10(n)) drops the most significant digit
             ; n / 10 drops the least significant digit

Swap_extreme(n) = n/10**int(log10(n)) + n%10*10**int(log10(n))
             ; n%10 is the least significant digit
             ; n/10**int(log10(n)) is the most significant digit

Exemplo de execução

reverse(123456) = 123456/10^5 + 123456 % 10 * 10^5 + reverse(123456 % 10 ^ 5 / 10)
                = 1           + 6 * 10 ^ 5 + reverse(23456/10)
                = 1           + 600000     + reverse(2345)
                = 600001 + reverse(2345)
reverse(2345)   = 2345/10^3 + 2345 % 10 * 10^3 + reverse(2345 % 10 ^ 3 / 10)
                = 2         + 5 * 10^3 + reverse(345 / 10)
                = 2         + 5000     + reverse(34)
                = 5002                 + reverse(34)
reverse(34)     = 34/10^1 + 34 % 10 * 10^1 + reverse(34 % 10 ^ 1 / 10)
                = 3       + 40             + reverse(0)
                = 43 + reverse(0)
reverse(0)      = 0

Thus

reverse(123456) = 600001 + reverse(2345)
                = 600001 + 5002 + reverse(34)
                = 600001 + 5002 + 43 + reverse(0)
                = 600001 + 5002 + 43 + 0
                = 654321

Faz. +5 pontos de brownie .
precisa saber é

@ downvoter: Você pode responder o que há de errado com esta resposta?
Abhijit

o senhor, merecem meus polegares para cima ...
kmonsoor

9

Apenas para ser contrário, um uso excessivo do operador do módulo:

unsigned int reverse(unsigned int n)
    {return n*110000%1099999999%109999990%10999900%1099000%100000;}

Observe que isso sempre inverte 5 dígitos e números inteiros de 32 bits serão excedidos para valores de entrada maiores que 39045.


8

C #

Aqui está uma maneira de fazer isso sem o %operador Modulus ( ) e a aritmética simples.

int x = 12356;
int inv = 0;
while (x > 0)
{
    inv = inv * 10 + (x - (x / 10) * 10);
    x = x / 10;
}
return inv;

Você tem módulo, você simplesmente o definiu.
Benjamin Gruenbaum 03/03

Sim, eu sei. Apenas não devemos usar o %operador. :) Entendo o que você quer dizer, meu texto foi um pouco enganador.
Davidsbro 03/03


6

C

#include <stdio.h>

int main(void) {
    int r = 0, x;
    scanf("%d", &x);
    while (x > 0) {
        int y = x;
        x = 0;
        while (y >= 10) { y -= 10; ++x; }
        r = r*10 + y;
    }
    printf("%d\n", r);
}

Sem strings, matrizes, módulo ou divisão. Em vez disso, divida por subtração repetida.


6

Mathematica

Fazendo uma imagem fora do número, refletindo-a, particionando-a nos dígitos. Depois, há duas alternativas:

  1. Compare cada imagem de um dígito refletido com as imagens anteriores preparadas, substitua-o pelo dígito correspondente e construa o número a partir disso.

  2. Reflita cada dígito separadamente, construa uma nova imagem e passe-a para a função de reconhecimento de imagem.

Eu fiz os dois

reflectNumber[n_?IntegerQ] := 
 ImageCrop[
  ImageReflect[
   Image@Graphics[
     Style[Text@NumberForm[n, NumberSeparator -> {".", ""}], 
      FontFamily -> "Monospace", FontSize -> 72]], 
   Left -> Right], {Max[44 Floor[Log10[n] + 1], 44], 60}]
reflectedDigits = reflectNumber /@ Range[0, 9];
reverse[0] := 0
reverse[n_?IntegerQ /; n > 0] := 
 Module[{digits}, 
  digits = ImagePartition[reflectNumber[1000 n], {44, 60}];
  {FromDigits[
    digits[[1]] /. (d_ :> # /; d == reflectedDigits[[# + 1]] & /@ 
       Range[0, 9])],
   ToExpression@
    TextRecognize[
     ImageAssemble[
      Map[ImageReflect[#, Left -> Right] &, digits, {2}]]]}]
reverse[14257893]
> {39875241, 39875241}

EDIT : Adicionado preenchimento de três zeros, porque TextRecognisefunciona corretamente apenas com números inteiros> 999.


Parabéns pela dupla reflexão. Todo bom programador deve usar a reflexão sempre que possível. ;-) No entanto, seu primeiro método não funciona para o seu exemplo no meu sistema no MM9.
Jonathan Van Matre

Agora isso é criativo.
David Sanders

Obtive melhores resultados alternando 9 e 4 no meu bloco (todos os 9s ou todos os 1s tendiam a causar falhas ocasionais de OCR), mas isso provavelmente se deve à diferença de fontes.
Jonathan Van Matre

5

Lua

function assemble(n,...)
    if ... then
        return 10*assemble(...)+n
    end
    return 0
end
function disassemble(n,...)
    if n>0 then
        return disassemble(math.floor(n/10),n%10,...)
    end
    return ...
end
function reverse(n)
    return assemble(disassemble(n))
end

Nenhuma matriz ou string usada. O número é dividido em dígitos e remontado usando a lista de argumentos.


Lua não tem matrizes de qualquer maneira. Tem tabelas: P Caso contrário, as varargs são matrizes
Nowayz 4/14

@Nowayz Possui tabelas que podem se parecer com matrizes. É por isso que não tenho permissão para usá-los. E varargs não são matrizes: P
mniip 4/14

Mas você está usando %! : P
ntoskrnl

5

Python2

Assume que "número inteiro não assinado" é de 32 bits

import math
import sys
a=input()
p=int(math.log(a, 10))
b=a
while b%10==0:
    sys.stdout.write('0') # if 1-char string is not allowed, use chr(48) instead
    b=b/10

if p==0:
    print a
elif p==1:
    print a%10*10+a/10
elif p==2:
    print a%10*100+a%100/10*10+a/100
elif p==3:
    print a%10*1000+a%100/10*100+a%1000/100*10+a/1000
elif p==4:
    print a%10*10000+a%100/10*1000+a%1000/100*100+a%10000/1000*10+a/10000
elif p==5:
    print a%10*100000+a%100/10*10000+a%1000/100*1000+a%10000/1000*100+a%100000/10000*10+a/100000
elif p==6:
    print a%10*1000000+a%100/10*100000+a%1000/100*10000+a%10000/1000*1000+a%100000/10000*100+a%1000000/100000*10+a/1000000
elif p==7:
    print a%10*10000000+a%100/10*1000000+a%1000/100*100000+a%10000/1000*10000+a%100000/10000*1000+a%1000000/100000*100+a%10000000/1000000*10+a/10000000
elif p==8:
    print a%10*100000000+a%100/10*10000000+a%1000/100*1000000+a%10000/1000*100000+a%100000/10000*10000+a%1000000/100000*1000+a%10000000/1000000*100+a%100000000/10000000*10+a/100000000
elif p==9:
    print a%10*1000000000+a%100/10*100000000+a%1000/100*10000000+a%10000/1000*1000000+a%100000/10000*100000+a%1000000/100000*10000+a%10000000/1000000*1000+a%100000000/10000000*100+a%1000000000/100000000*10+a/1000000000

Quando recebida 1230, ela gera 0321.


Acabei de ver a edição do operador de módulo ... devo excluir esta postagem?
ace_HongKongIndependence

7
Eu não acho que você deve excluí-lo, porque é uma sugestão para não usá-lo, não uma regra:"Since this is a popularity contest, I suggest not using the modulus (%) operator in your code."
ProgramFOX

Além disso, essa afirmação enorme se é praticamente arte ASCII.
Jonathan Van Matre

4

Postscript

/rev{0 exch{dup 10 mod 3 -1 roll 10 mul add exch 10 idiv dup 0 eq{pop exit}if}loop}def

Sem matrizes, sem strings, sem variáveis.

gs -q -dBATCH -c '/rev{0 exch{dup 10 mod 3 -1 roll 10 mul add exch 10 idiv dup 0 eq{pop exit}if}loop}def 897251 rev ='
152798

O mesmo sem mod(que é apenas um atalho, portanto, não há grande diferença):

/rev {
    0 exch {
        dup
        10 idiv dup
        3 1 roll 10 mul sub
        3 -1 roll 10 mul add exch 
        dup 0 eq {pop exit} if
    } loop
} def

4

C #

Isso não usa seqüências de caracteres ou matrizes, mas usa o Stack<T>tipo .NET (EDIT: operador de módulo usado originalmente; agora removido)

public class IntegerReverser
{
    public int Reverse(int input)
    {
        var digits = new System.Collections.Generic.Stack<int>();
        int working = input;
        while (working / 10 > 0)
        {
            digits.Push(working - ((working / 10) * 10));
            working = working / 10;
        }
        digits.Push(working);
        int result = 0;
        int mult = 1;
        while (digits.Count > 0)
        {
            result += digits.Pop() * mult;
            mult *= 10;
        }
        return result;
    }
}

4

C

Na medida em que a solução óbvia é representada em algumas outras línguas, é possível publicá-la em C.

Golfe:

r;main(n){scanf("%d",&n);for(;n;n/=10)r=r*10+n%10;printf("%d",r);}

Ungolfed:

#include <stdio.h>

int main()
{
     int n, r = 0;
     scanf("%d", &n);
     for(;n;n/=10)
     { 
          r = r * 10 + n % 10;
     }
     printf("%d", r);
}

EDIT: Acabei de ver o módulo editar.

Golfe (sem módulo):

r;main(n){scanf("%d",&n);for(;n;n/=10)r=r*10+(n-10*(n/10));printf("%d",r);}

Ungolfed (sem módulo):

#include <stdio.h>

int main()
{
     int n, r, m = 0;
     scanf("%d", &n);
     for(;n;n/=10)
     { 
          r=r*10+(n-10*(n/10));
     }
     printf("%d", r);
}

4

Java

Isto é o que eu inventei, sem strings, sem matrizes ... nem mesmo variáveis ​​(em Java, eu lembro):

public static int reverse(int n) {
    return n/10>0?(int)(modulo(n,10)*Math.pow(10, count(n)))+reverse(n/10):(int)(modulo(n,10)*Math.pow(10,count(n)));
}

public static int count(int i) {
    return (i = i/10)>0?count(i)+1:0;
}

public static int modulo(int i,int j) {
    return (i-j)>=0?modulo(i-j, j):i;
}

EDIT Uma versão mais legível

/** Method to reverse an integer, without the use of String, Array (List), and %-operator */
public static int reverse(int n) {
    // Find first int to display
    int newInt = modulo(n,10);
    // Find it's position
    int intPos = (int) Math.pow(10, count(n));
    // The actual value
    newInt = newInt*intPos;
    // Either add newInt to the recursive call (next integer), or return the found
    return (n/10>0) ? newInt+reverse(n/10) : newInt;
}

/** Use the stack, with a recursive call, to count the integer position */
public static int count(int i) {
    return (i = i/10)>0?count(i)+1:0;
}

/** A replacement for the modulo operator */
public static int modulo(int i,int j) {
    return (i-j)>=0?modulo(i-j, j):i;
}

Por favor, torne seu código mais legível, isto não é código de golfe. Obrigado.
Duci9y #

11
Esta é a minha primeira tentativa neste sentido, espero que a versão atualizada é melhor :-)
Oizo

Sim. Obrigado. Bem-vindo ao Code Golf. Eu também sou novo. :)
duci9y

3

PowerShell

Uma solução rápida no PowerShell. Nenhuma matriz ou string usada, implícita ou explicitamente.

function rev([int]$n) {
    $x = 0
    while ($n -gt 0) {
        $x = $x * 10
        $x += $n % 10
        $n = [int][math]::Floor($n / 10)
    }
    $x
}

Teste:

PS > rev(13457)
75431

PS > rev(rev(13457))
13457

3

python (feito facilmente em montagem)

Inverte os bits de um byte. Pontos por não fazer exatamente a mesma coisa que todos os outros fizeram?

x = int(input("byte: "), 2)
x = ((x * 8623620610) & 1136090292240) % 1023
print("{0:b}".format(x).zfill(8))

exemplo

byte: 10101010
01010101

11
Funcionaria para a entrada de amostra produzir a saída de amostra?
duci9y

3

C ++

#include<iostream>
#include<conio.h>
#include<fstream>
using namespace std;
int main()
{
    int i,size;
    float num;
    char ch;
    cout<<"enter the number \t: ";
    cin>>num;
    ofstream outf("tmp.tmp");
    outf<<num;
    outf.close();
    ifstream inf("tmp.tmp");
    inf.seekg(0,ios::end);
    size=inf.tellg();
    inf.seekg(-1,ios::cur);
    cout<<"Reverse of it\t\t: ";
    for(i=0;i<size;i++)
    {
        inf>>ch;
        if(ch!='0'||i!=0)
        cout<<ch;
        inf.seekg(-2,ios::cur);
    }
    inf.close();
            remove("tmp.tmp");
    getch();
    return 0;
}  

SAÍDA

Três execuções de amostra
insira a descrição da imagem aqui

Teste com zeros

insira a descrição da imagem aqui

Também inverte números flutuantes !!!

insira a descrição da imagem aqui

Se você deseja executar esse código , execute-o no seu computador, pois ele cria um arquivo temporário durante o tempo de execução e não tenho certeza se os compiladores online criariam um arquivo temporário no seu computador.


Não está gravando em um arquivo tornando-o uma string?
duci9y

string é uma combinação de caracteres com um caractere nulo no final assim, não é uma cadeia, mas uma combinação de caracteres única
Mukul Kumar

Uma sequência é uma sequência de caracteres. Desculpe, mas esta resposta não atende às restrições.
duci9y

sua definição para strings está incorreta, acesse este site ( cs.stmarys.ca/~porter/csc/ref/c_cpp_strings.html ) e leia o último parágrafo com atenção . String é uma combinação de caracteres TERMINADO COM A '\ 0'
Mukul Kumar

11
Sinto muito, você está falando sobre cadeias C. Eu estou falando sobre cordas em geral. Sua resposta não está qualificada.
duci9y

2

ECMAScript 6

reverse=x=>{
    var k=-(l=(Math.log10(x)|0)),
        p=x=>Math.pow(10,x),
        s=x*p(l);
    for(;k;k++) s-=99*(x*p(k)|0)*p(l+k);
    return s
}

Então:

  • reverse(12345) saídas 54321
  • reverse(3240) saídas 423
  • reverse(6342975) saídas 5792436

2

Fissão

$SX/
\S?L
K\O

Este programa reverte a entrada.

$ echo -n '12345' | fsn tac.fsn
54321

11
Você acabou de passar por "A linguagem de programação existia antes que a pergunta fosse feita?" teste neste. A fissão parece uma entrada interessante para o mundo esolang - como "Embeba-se em ácido com uma prateleira cheia de livros de física de partículas". Agradável!
Jonathan Van Matre

2

ADIANTE

Eu acho que isso é o oposto do popular ... mas usar o Forth é sempre criativo ...

Vamos criar uma nova palavra

: REV 
  BEGIN
    S->D 10 U/
    SWAP 1 .R
  DUP 0= UNTIL 
CR ;

Aqui, ele usa a palavra U / que retorna o restante e o quociente, o restante é enviado para a saída como número dentro de um caractere do campo 1, até o dividendo ser zero. Nenhuma string é usada, pelo menos até que algo seja enviado ao vídeo. Eu não uso um operador de módulo, em vez disso, uso a divisão inteira com o restante e o quociente. Vamos tentar

12345 REV 54321
ok

Emulador do ZX Spectrum


Onde consigo esse emulador?
gato

World of Spectrum tem abundância de emuladores aqui worldofspectrum.org/emulators.html
Mattsteel

2

Código da máquina de Turing

Usando a sintaxe daqui.

0 * * l 0
0 _ # r 2
2 # # r 2
2 0 # l A
2 1 # l B
2 2 # l C
2 3 # l D
2 4 # l E
2 5 # l F
2 6 # l G
2 7 # l H
2 8 # l I
2 9 # l J
2 _ _ l Z
A * * l A
A _ 0 l Q 
B * * l B
B _ 1 l Q 
C * * l C
C _ 2 l Q
D * * l D
D _ 3 l Q
E * * l E
E _ 4 l Q
F * * l F
F _ 5 l Q
G * * l G
G _ 6 l Q
H * * l H
H _ 7 l Q
I * * l I
I _ 8 l Q
J * * l J
J _ 9 l Q
Q # # r 2
Q * * r Q
Z # _ l Z
Z * * l ZZ
ZZ _ * r ZZZ
ZZ * * l ZZ
ZZZ 0 _ r ZZZ
ZZZ * * * halt

Experimente online!


1

Python

import itertools

def rev(n):
    l = next(m for m in itertools.count() if n/10**m == 0)
    return sum((n-n/10**(i+1)*10**(i+1))/10**i*10**(l-i-1) for i in range(l))

rev(1230)321. Suponho que realmente deveria dar 0321?
ace_HongKongIndependence

Isso está errado? Se estamos lidando apenas com números, não com strings, 0321 e 321 são equivalentes, certo?
Jayanth Koushik

Deve ser 321 para meu entendimento. A pergunta não permitia o uso de strings. Por isso, deve ser 321.
microbian

Não sei ... aguardando a resposta do OP. Estou apenas apontando isso, não dizendo que está errado. Desculpe pela confusão.
ace_HongKongIndependence

Eu atualizei a pergunta.
duci9y

1

C

#include <stdio.h>

int c(int n) {
    return !n ? 0 : 1+c(n/10);
}

int p(int n) {
    return !n ? 1 : 10*p(n-1);
}

int r(int n) {
    return !n ? 0 : n%10*p(c(n/10))+r(n/10);
}

int main() {
    printf("%d\n", r(13457));

    return 0;
}

1

Lote

Perdeu a parte de não usar cordas - tudo bem.

@echo off
setLocal enableDelayedExpansion enableExtensions
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"
set num=%~1
set cnum=%num%
set len=0
:c
if defined num set num=%num:~1%&set /a len+=1&goto :c
set /a len-=1
for /L %%a in (%len%,-1,0) do set /p "=!ASCII_13!!cnum:~%%a,1!"<nul

1

Python 2

import math

def reverseNumber(num):
    length = int(math.ceil(math.log10(num)))
    reversed = 0

    for i in range(0, length):
        temp = num // math.pow(10, length - i - 1)
        num -= temp * math.pow(10, length - i - 1)
        reversed += int(temp * math.pow(10, i))

    return reversed

print reverseNumber(12345)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.