Il modo più creativo per invertire un numero intero positivo [chiuso]


40

Fornito un input come numero intero senza segno:

13457

La tua funzione / subroutine dovrebbe restituire:

75431

Dal momento che questo è un concorso di popolarità, sii creativo. Le soluzioni creative utilizzano tecniche insolite o intelligenti per eseguire determinate attività.

vincoli:

  • Non è possibile utilizzare le matrici.
  • Non puoi usare le stringhe.
  • Nessuna sostituzione RTL ( &#8238)

Punti brownie per l'utilizzo dell'aritmetica creativa.

Dato che si tratta di un concorso di popolarità, ti suggerisco di non utilizzare l' %operatore modulo ( ) nel tuo codice.

Informazioni sugli zeri iniziali:

Se l'input è:

12340

Quindi l'output:

4321

sarebbe accettabile.



3
@microbian No, quello era code-golf. Questo è concorso di popolarità.
Victor Stafusa

2
Le persone saranno spuntate se inizi a cambiare le regole ora. Mi sembra che vada bene, corri prima la tua prossima sfida nella sandbox: meta.codegolf.stackexchange.com/questions/1117/…
Hosch250

2
E se 1230fosse l'input? Siamo autorizzati a produrre 321? (Altrimenti, sono necessarie le stringhe).
Justin

2
Sto votando per chiudere questo come fuori tema perché questo manca di un criterio oggettivo di validità - "essere creativi" è soggettivo.
Mego

Risposte:


49

Mathematica, nessun modulo!

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]]]]

Analizziamolo.

Innanzitutto usiamo alcune "aritmetiche creative" per scoprire quante cifre ci sono nel numero: length = Ceiling[Log[10, n]];

Successivamente, rasterizziamo il numero in una bella immagine di grandi dimensioni:

honking big rasterized number

Ora chiediamo il riquadro di delimitazione di quell'immagine e popoliamo la larghezza e l'altezza (in realtà usando l'offset della linea di base anziché l'altezza dell'immagine, perché MM aggiunge degli spazi bianchi sotto la linea di base nell'immagine).

Successivamente, NestList sottrae in modo ricorsivo la larghezza dell'immagine divisa per la lunghezza della stringa per consentire a ImageTake di strappare i caratteri dalla fine dell'immagine uno alla volta, e questi vengono riassemblati da ImageAssemble in questa immagine:

honking big reversed number

Quindi passiamo alla funzione TextRecognize per il riconoscimento ottico dei caratteri, che a questa dimensione dell'immagine e qualità di rasterizzazione è in grado di riconoscere impeccabilmente l'output finale e darci il numero intero:

72641

Logaritmi e OCR - È come cioccolato e burro di arachidi!

Nuovo e migliorato

Questa versione completa il numero per gestire il comportamento ostinato di TextRecognize con piccoli numeri, quindi sottrae il pad alla fine. Funziona anche con numeri a una cifra!

Tuttavia, il motivo per cui eseguiresti una routine inversa su un singolo numero è un mistero per me. Ma solo per completezza, l'ho persino fatto funzionare per input di zero e uno, che normalmente si spezzerebbero perché il log pavimentato non restituisce 1 per loro.

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
Sconfiggimi. Hai il mio voto !! [ma stavo per usare C #]
HL-SDK

1
TextRegognizenon funziona per piccoli numeri. E hai digitato height = b[[3]];. Controlla anche la mia risposta, per favore! :)
swish

Un altro problema con TextRecognize, è che restituisce una stringa, che non è consentita e inoltre è necessario riconvertirla in numero.
Swish

Grazie per aver individuato l'errore di battitura ... Stavo rendendo i nomi delle variabili più facili da leggere per il lettore prima di inviarlo e ne ho perso uno. Anche gettato nella ToExpression mancante. E ho pubblicato una revisione che affronta il problema dei piccoli numeri fino a singole cifre.
Jonathan Van Matre

Wow ... è elaborato!
duci9y

39

Perl / LuaTeX / Tesseract

Il seguente script Perl legge il numero come argomento della riga di comando, ad esempio:

    1234567890

Il seguente script Perl stampa il numero tramite LuaTeX. Un carattere virtuale viene creato al volo che rispecchia le cifre in orizzontale.

temp0.png

Quindi l'intero numero viene nuovamente specchiato in orizzontale:

temp1.png

L'immagine finale viene riletta tramite 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 per TeX. Abbiamo bisogno di più risposte TeX!
Jonathan Van Matre,

25

Brainfuck

Fondamentalmente, è solo un programma di inversione dell'input.

,[>,]<[.<]

UPD: Come ha sottolineato Sylwester nei commenti, nei classici interpreti / compilatori Brainfuck (senza possibilità di andare a sinistra dal punto zero nell'array di memoria) questo programma non funzionerebbe in assenza di '>' all'inizio, quindi il più stabile la versione è:

>,[>,]<[.<]

4
Il programma Bf più breve che abbia mai visto. Inoltre, davvero pulito.
Nit

2
Senza un >all'inizio per creare una cella zero prima dei dati, questo non funzionerà in molti interpreti / compilatori.
Sylwester

1
@Danek vero, tutte le celle sono inizializzate a zero e la prima cosa da fare è leggere la prima cifra nella prima cella. [.<]non ha celle zero dove fermarsi a causa di ciò e fallirà. Errore da bf -n rev1.bfè Error: Out of range! Youwanted to '<' below the first cell.. Se compili ottieni un segfaultforse.
Sylwester

3
+1 anche se BF riguarda gli array, quindi non sono sicuro che si adatti alla regola Non usare l'array
Michael M.

1
L'eco di @Nit è molto più breve:,[.,]
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

Nessun array, stringhe o modulo.

Inoltre, so che non dovremmo usare liste o stringhe, ma adoro quanto è corto quando lo fai:

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

2
Un gruppo di clienti abituali del sito ha esaurito il proprio voto per la giornata, quindi abbi pazienza. :)
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;
}

1
Sarebbe più ?:
bello

@mniip Buona idea
Ali Alavi

+ 1 brillante. Vorrei che ci fossero più voti.
duci9y,

Complimenti per aver catturato la custodia di troppo pieno.
Jonathan Van Matre,

18

Suppongo che qualcuno debba essere il partypooper.

bash

$ rev<<<[Input]

 

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

Le limitazioni di dimensione dipendono dal tuo guscio, ma starai bene entro limiti ragionevoli.


2
ben giocato signore. ben suonato
utente

4
Come mai non è una stringa?
Non che Charles

1
Questa potrebbe essere una stringa. Sei sicuro che bash accetta input come numeri interi quando possibile?
duci9y

3
Tutto è una stringa in Bash, a meno che non venga dichiarato diversamente, ad esempio declare -i. Confronta foo=089e declare -i foo=089(numero ottale non valido).
l0b0

3
Secondo il commento di @ l0b0 questa risposta non è valida.
duci9y

15

Javascript

EDIT : Dal momento che c'è un suggerimento di non usare l' %operatore, ora uso un piccolo trucco.

So che questo non è un codice-golf, ma non c'è motivo di allungarlo.

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

r(13457) ritorna 75431

Inoltre, è molto più veloce del metodo string ( n.toString().split('').reverse().join('')):

enter image description here

==> Rapporto JSPerf <==


2
Che ne dici di usare ~~invece di Math.floor?
Victor Stafusa

Sì, sarebbe più breve, ma meno comprensibile.
Michael M.

2
Non è questo il metodo intero-inversione del libro di testo? Penso di aver scritto questo algoritmo per i compiti.
user2357112 supporta Monica

Come nel commento sopra, questo è solo l'algoritmo di inversione di numeri interi standard. Per quanto posso vedere la parte creativa è solo l'uso di ~~invece di Math.floor(la modifica suggerita da @Victor)
Bertie Wheen

+1 per i test delle prestazioni. tutte le grandi menti creative eseguono test delle prestazioni in anticipo e spesso. : D
Jonathan Van Matre,

10

Pitone

Non sono sicuro se questa implementazione sia idonea per la matematica creativa

Inoltre l'operatore% non è stato utilizzato di per sé, anche se si potrebbe sostenere che divmod fa lo stesso, ma quindi la domanda deve essere riformulata :-)

Implementazione

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

dimostrazione

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

Come funziona?

Questa è una soluzione divmod ricorsiva * Questa soluzione determina la cifra meno significativa e la spinge alla fine del numero. *

Ancora un'altra implementazione di 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

Come funziona?

Questa è una soluzione ricorsiva che scambia le cifre estreme dal numero

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

Esempio di esecuzione

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

Lo fa. +5 punti brownie .
duci9y,

@downvoter: puoi per favore rispondere cosa c'è di sbagliato in questa risposta?
Abhijit

lei, signore, mi meriti il ​​pollice in alto ...
kmonsoor

9

Giusto per essere contrario, un uso eccessivo dell'operatore modulo:

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

Si noti che ciò inverte sempre 5 cifre e gli interi a 32 bit traboccano per valori di input superiori a 39045.


8

C #

Ecco un modo per farlo senza l' %operatore Modulus ( ) e solo una semplice aritmetica.

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

Hai un modulo, lo hai semplicemente definito tu stesso.
Benjamin Gruenbaum,

Si lo so. Non dovremmo usare l' %operatore. :) Capisco cosa intendi, il mio testo è stato un po 'fuorviante.
davidsbro,


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);
}

Nessuna stringa, matrice, modulo o divisione. Invece, divisione per sottrazione ripetuta.


6

matematica

Creare un'immagine per numero, riflettendola, partizionandola in cifre. Quindi ci sono due alternative:

  1. Confronta ogni immagine di una cifra riflessa con immagini preparate in precedenza, sostituiscila con la cifra corrispondente e costruisci il numero da questo.

  2. Rifletti ogni cifra separatamente, costruisci una nuova immagine e passala alla funzione di riconoscimento dell'immagine.

Ho fatto entrambe le cose

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 : aggiunta una spaziatura di tre zero, perché TextRecognisefunziona correttamente solo con numeri interi> 999.


Complimenti per il doppio riflesso. Ogni buon programmatore dovrebbe usare la riflessione quando possibile. ;-) Tuttavia, il tuo primo metodo non funziona per il tuo esempio sul mio sistema in MM9.
Jonathan Van Matre

Questo è creativo.
David Sanders,

Ho ottenuto i migliori risultati alternando 9 e 4 nel mio pad (tutti i 9 o tutti 1 tendevano a dare anomalie OCR occasionali), ma probabilmente questo dipende dalla differenza nei caratteri.
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

Nessun array o stringhe utilizzate. Il numero viene suddiviso in cifre e riassemblato utilizzando l'elenco degli argomenti.


Lua non ha comunque array. Dispone di tabelle: P Altrimenti varargs sono array
Nowayz

@Nowayz Ha tabelle che possono assomigliare ad array. Ecco perché non mi è permesso usarli. E i vararg non sono array: P
mniip

Ma stai usando %! : P
ntoskrnl,

5

python2

Suppone che "numero intero senza segno" sia a 32 bit

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 viene dato input 1230, viene emesso 0321.


Ho appena visto la modifica dell'operatore modulo ... dovrei eliminare questo post?
pastebin.com slash 0mr8spkT

7
Non credo che dovresti eliminarlo, perché è un suggerimento di non usarlo, non una regola:"Since this is a popularity contest, I suggest not using the modulus (%) operator in your code."
ProgramFOX

Inoltre quell'enorme affermazione if è praticamente arte ASCII.
Jonathan Van Matre,

4

poscritto

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

Nessuna matrice, nessuna stringa, nessuna variabile.

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

Lo stesso senza mod(che è solo una scorciatoia, quindi nessuna grande differenza):

/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 #

Questo non utilizza stringhe o array, ma utilizza il Stack<T>tipo .NET (EDIT: operatore modulo originariamente utilizzato; ora rimosso)

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

In quanto la soluzione ovvia è rappresentata in un paio di altre lingue, potrebbe anche pubblicarla in C.

golfed:

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: appena visto il modulo di modifica.

Golf (nessun modulo):

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

Ungolfed (nessun modulo):

#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

Giava

Questo è ciò che ho inventato, niente stringhe, niente array ... nemmeno variabili (in Java mi dispiace):

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;
}

MODIFICA Una versione più leggibile

/** 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;
}

Rendi il tuo codice più leggibile, non si tratta di code golf. Grazie.
duci9y

1
Questo è il mio primo tentativo, spero che la versione aggiornata sia migliore :-)
oiZo

Sì. Grazie. Benvenuti in Code Golf. Anch'io sono nuovo. :)
duci9y

3

PowerShell

Una soluzione rapida in PowerShell. Nessuna matrice o stringa utilizzata, implicitamente o esplicitamente.

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

test:

PS > rev(13457)
75431

PS > rev(rev(13457))
13457

3

python (facilmente eseguibile in assembly)

Inverte i bit di un byte. Punti per non fare esattamente la stessa cosa che hanno fatto tutti gli altri?

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

esempio

byte: 10101010
01010101

1
Funzionerebbe per l'input del campione per produrre l'output del campione?
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;
}  

PRODUZIONE

Tre sequenze di esempio
enter image description here

Prova con zeri

enter image description here

Anche questo inverte i numeri fluttuanti !!!

enter image description here

Se vuoi eseguire questo codice, eseguilo sul tuo computer perché crea un file temporaneo durante il suo runtime e non sono sicuro che i compilatori online creerebbero un file temporaneo sul tuo computer


Scrivere su un file non lo rende una stringa?
duci9y

stringa è una combinazione di caratteri con un carattere nullo alla fine, quindi non è una stringa ma solo una combinazione di caratteri
Mukul Kumar

Una stringa è una sequenza di caratteri. Siamo spiacenti, ma questa risposta non soddisfa i vincoli.
duci9y

la tua definizione di stringhe è errata, vai su questo sito Web ( cs.stmarys.ca/~porter/csc/ref/c_cpp_strings.html ) e leggi attentamente l'ultimo paragrafo. La stringa è una combinazione di caratteri FINE CON UN '\ 0'
Mukul Kumar il

1
Mi dispiace, stai parlando di stringhe C. Sto parlando di stringhe in generale. La tua risposta non è valida.
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
}

Poi:

  • reverse(12345) uscite 54321
  • reverse(3240) uscite 423
  • reverse(6342975) uscite 5792436

2

scissione

$SX/
\S?L
K\O

Questo programma inverte l'ingresso.

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

1
Passi semplicemente il "Esisteva il linguaggio di programmazione prima che fosse posta la domanda?" prova su questo. La fissione sembra una bella entrata nel mondo esolang - una specie di "Befunge on acid con uno scaffale pieno di libri di fisica delle particelle". Bello!
Jonathan Van Matre,

2

VIA

Penso che questo sia l'opposto del popolare ... ma l'utilizzo di Forth è sempre creativo ...

Creiamo una nuova parola

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

Qui, usa la parola U / che restituisce il resto e il quoziente, il resto viene inviato all'output come numero all'interno di un campo lungo 1 carattere, fino a quando il dividendo è zero. Non viene utilizzata alcuna stringa, almeno fino a quando non viene inviato qualcosa al video. Non utilizzo un operatore modulo, ma utilizzo la divisione intera con resto e quoziente. Proviamo

12345 REV 54321
ok

ZX Spectrum emulator


Dove trovo quell'emulatore?
gatto,

World of Spectrum ha molti emulatori elencati qui worldofspectrum.org/emulators.html
Mattsteel,

2

Codice di Turing Machine

Utilizzando la sintassi da qui.

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

Provalo online!


1

Pitone

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) gives 321. I suppose it should really give 0321?
pastebin.com slash 0mr8spkT

Is that wrong? If we are only dealing with numbers, not strings, then 0321 and 321 are equivalent right?
Jayanth Koushik

It should be 321 to my understanding. The question disallowed using of strings. So it should be 321.
microbian

I don't know... waiting for the OP's reply. I'm just pointing this out, not saying it's wrong. Sorry for the confusion.
pastebin.com slash 0mr8spkT

I updated the question.
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

Batch

Missed the part about not using strings - oh well.

@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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.