正の整数を逆にする最も創造的な方法[終了]


40

入力を符号なし整数として提供しました:

13457

あなたの関数/サブルーチンは以下を返します:

75431

これは人気コンテストであるため、クリエイティブになりましょう。創造的なソリューションは、特定のタスクを達成するために、珍しいまたは巧妙なテクニックを使用します。

制約:

  • 配列は使用できません。
  • 文字列は使用できません。
  • RTLオーバーライドなし(&#8238

創造的な算術を使用するためのブラウニーポイント。

これは人気コンテストなので%、コードでモジュロ()演算子を使用しないことをお勧めします。

先行ゼロについて:

入力が次の場合:

12340

次に、出力:

4321

許容されます。



3
@microbianいいえ、それはコードゴルフでした。これは人気コンテストです。
ビクターStafusa 14

2
今すぐルールを変更し始めると、人々はチェックされます。:それはちょうど最初のサンドボックスを通して、あなたの次の課題を実行して、私には罰金を行くことのようですmeta.codegolf.stackexchange.com/questions/1117/...
Hosch250

2
1230入力はどうなりますか?出力できます321か?(それ以外の場合、文字列が必要です)。
ジャスティン14

2
これは客観的な妥当性基準を欠いているので、トピック外としてこれを閉じることを投票しています-「創造的である」は主観的です。
メゴ

回答:


49

Mathematica、モジュロなし!

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

分解しましょう。

まず、いくつかの「創造的な算術演算」を使用して、数字の桁数を調べます。 length = Ceiling[Log[10, n]];

次に、数値を素敵な大きな画像にラスタライズします。

大きなラスタライズされた数を鳴らす

次に、その画像の境界ボックスを照会し、幅と高さを設定します(MMは画像のベースラインの下に空白を追加するため、実際には画像の高さの代わりにベースラインオフセットを使用します)。

次に、NestListは、イメージの幅を文字列の長さで割った値を再帰的に減算して、ImageTakeがイメージの末尾から文字を1つずつ抜き取り、ImageAssembleによってこのイメージに再アセンブルします。

大きな逆数を鳴らす

次に、それを光学文字認識のTextRecognize関数に渡します。この関数は、この画像サイズとラスター化品質で最終出力を完璧に認識し、整数を与えることができます。

72641

対数とOCR-チョコレートとピーナッツバターのようなものです!

新しくなり改善された

このバージョンでは、小さな数字でTextRecognizeの頑固な動作に対処するために数字を埋めてから、最後のパッドを差し引きます。これは1桁の数字でも機能します!

しかし、なぜあなたは単一の番号で逆ルーチンを実行するのかは私には謎です。しかし、完全を期すために、0と1の入力に対しても機能させました。これは、フロアログが1を返さないため、通常は壊れます。

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
それに私を打つ。あなたは私の票を持っています!! [私は、C#を使用するつもりだった]
HL-SDK

1
TextRegognize少数では機能しません。そして、あなたはタイプミスをしていheight = b[[3]];ます。私の答えもチェックしてください!:)
swish 14年

のもう1つの問題TextRecognizeは、文字列が返されることです。これは許可されておらず、数値に戻す必要があります。
swish 14年

タイプミスを見つけてくれてありがとう...変数名を提出する前に、変数名を読みやすくしていました。また、欠落しているToExpressionをスローしました。そして、私は小数の問題を一桁まで扱う修正を投稿しました。
ジョナサンヴァンマトレ14年

うわー、それは手の込んだ!
duci9y 14年

39

Perl / LuaTeX / Tesseract

次のPerlスクリプトは、番号をコマンドライン引数として読み取ります。例:

    1234567890

次のPerlスクリプトは、LuaTeXを介して番号を出力します。数字を水平にミラーリングする仮想フォントがその場で作成されます。

temp0.png

次に、全体の数が再び水平にミラーリングされます。

temp1.png

最終画像は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
TeXの場合は+1。さらにTeXの回答が必要です!
ジョナサンヴァンマトレ14年

25

ブレインファック

基本的に、これは単なる入力反転プログラムです。

,[>,]<[.<]

UPD:Sylwesterがコメントで指摘したように、古典的なBrainfuckインタープリター/コンパイラー(メモリーアレイのゼロポイントから離れる可能性なし)では、このプログラムは最初に '>'がないと機能しないため、より安定していますバージョンは:

>,[>,]<[.<]

4
私が今まで見た中で最も短いBfプログラム。また、本当にきちんとした。
ニト14年

2
せずに>初めには、データの前にゼロのセルを作るために、この多くの通訳/コンパイラでは動作しません。
シルウェスター14年

1
@Danek true、すべてのセルはゼロに初期化され、最初に行うことは最初の数字を最初のセルに読み込むことです。[.<]そのため、停止するゼロセルがなく、失敗します。からのエラーbf -n rev1.bfですError: Out of range! Youwanted to '<' below the first cell.。コンパイルする場合、segfaultおそらく得る。
シルウェスター14年

3
+1は、私はありませんので、BFは、アレイのすべてについて、あまりにもあっても必ずそれはルール適合する配列を使用しないでください
マイケル・M.

1
@Nitエコーがはるかに短いです:,[.,]
たけ

20

ハスケル

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

配列、文字列、またはモジュラスはありません。

また、リストや文字列を使用することを想定していませんが、それを行うとどれだけ短いかが大好きです。

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

2
たくさんのサイトの常連がその日の投票を上限にしたので、忍耐があります。:)
ジョナサンヴァンマトレ14年

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
とクールになります?:
mniip 14年

良いアイデア@mniip
アリAlavi

+ 1ブリリアント。もっと賛成票があればいいのに。
duci9y

オーバーフローのケースをキャッチしたことに対する称賛。
ジョナサンヴァンマトレ14年

18

私は考え、誰かが partypooperなければなりません。

バッシュ

$ rev<<<[Input]

 

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

サイズの制限はシェルによって異なりますが、合理的な範囲内であれば問題ありません。


2
よくやった。よくプレイ
ユーザー14

4
それは文字列ではないのですか?
はないチャールズ

1
これ文字列かもしれません。bashは可能であれば整数として入力を取りますか?
duci9y 14年

3
たとえばを使用して別の方法で宣言しない限り、すべてはBashの文字列declare -iです。比較foo=089してdeclare -i foo=089(無効進数)。
l0b0 14年

3
@ l0b0のコメントによると、この回答は無効です。
duci9y 14年

15

Javascript

編集%演算子を使用しないように提案があるので、私は今少しトリックを使用します。

私はこれがコードゴルフではないことを知っていますが、もっと長くする理由はありません。

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

r(13457) 返す 75431

さらに、stringメソッド(n.toString().split('').reverse().join(''))よりもはるかに高速です。

ここに画像の説明を入力してください

==> JSPerfレポート<==


2
~~代わりに使用するのはMath.floorどうですか?
ビクターStafusa 14

はい、それは短くなりますが、理解しにくいでしょう。
マイケルM. 14

2
これは教科書の整数反転法ではありませんか?宿題用にこのアルゴリズムを書いたと思います。
user2357112は

上記のコメントと同様に、これは標準の整数反転アルゴリズムです。私が見る限り、クリエイティブな部分は(@Victorによって提案された変更)の~~代わりに使用するだけですMath.floor
バーティ

パフォーマンステストの場合は+1。優れた創造力を発揮するすべての人が、パフォーマンステストを早期かつ頻繁に行います。:D
ジョナサンヴァンマトレ14年

10

Python

この実装が創造的な数学に適しているかどうかわからない

また、%mod自体は使用されませんでしたが、divmodは同じことをしていると主張するかもしれませんが、質問は言い換える必要があります:-)

実装

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

デモ

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

どのように機能しますか?

これは再帰的なdivmodソリューションです *このソリューションは最下位桁を決定し、それを数字の末尾にプッシュします。*

さらに別の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

どのように機能しますか?

これは、数値から極端な数字を交換する再帰的なソリューションです

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

実行例

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

します。+5ブラウニーポイント
duci9y 14

@downvoter:この答えのどこがおかしいのでしょうか?
アビジット2014年

あなたは、先生、私の親指を値する...
kmonsoor

9

ただ逆に、モジュロ演算子の過剰使用:

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

これは常に5桁を逆にし、39045を超える入力値では32ビット整数がオーバーフローすることに注意してください。


8

C#

モジュラス(%)演算子と単純な算術演算なしでそれを行う方法を次に示します。

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

モジュラスがあり、自分で定義しただけです。
ベンジャミングリュンバウム14

ええ、知っています。%演算子を使用することは想定されていません。:)私はあなたが何を意味するかわかります、私のテキストは少し誤解を招くものでした。
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);
}

文字列、配列、モジュラス、除算はありません。代わりに、繰り返し減算による除算。


6

Mathematica

数字からイメージを作成し、それを反映して、数字に分割します。次に、2つの選択肢があります。

  1. 反射された数字の各画像を準備された以前の画像と比較し、対応する数字に置き換えて、これから数字を構成します。

  2. すべての数字を個別に反映し、新しい画像を作成して、画像認識機能に渡します。

両方やりました

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}

編集TextRecognise999を超える整数でのみ正しく動作するため、3つのゼロのパディングが追加されました。


二重反射に対する称賛。すべての優秀なプログラマーは、可能な限りリフレクションを使用する必要があります。;-)ただし、MM9の私のシステムでは、最初の方法はあなたの例では機能しません。
ジョナサンヴァンマトレ14年

今、それは創造的です。
デビッドサンダース14年

パッドで9と4を交互に使用して最良の結果を得ました(すべて9またはすべて1でOCRの不具合が発生する傾向がありました)が、それはおそらくフォントの違いによるものです。
ジョナサンヴァンマトレ14年

5

ルア

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

配列や文字列は使用されていません。数値は数字に分割され、引数リストを使用して再構成されます。


とにかくLuaには配列がありません。テーブルました:Pは、そうでない場合は可変引数が配列されている
Nowayz

@Nowayz配列に似たテーブルがあります。それが私がそれらを使用することを許可されていない理由です。そして可変引数は配列ではありません:P
mniip 14年

しかし、あなたは使用しています%!:P
ntoskrnl 14年

5

Python2

「符号なし整数」は32ビットであると仮定します

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

入力が与えられると1230、出力します0321


モジュラス演算子の編集を見ました...この投稿を削除する必要がありますか?
ace_HongKongIndependence 14

7
それはそれを使用しないように提案、ないルールがあるので、私は、あなたがそれを削除する必要はないと思う:"Since this is a popularity contest, I suggest not using the modulus (%) operator in your code."
ProgramFOX

さらに、そのif文は実質的にASCIIアートです。
ジョナサンヴァンマトレ14年

4

追記

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

配列、文字列、変数はありません。

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

なしmod(これは単なるショートカットなので、大きな違いはありません):

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

これは文字列や配列を使用しませんが、.NET Stack<T>タイプを使用します(編集:元々使用されていたモジュラス演算子。現在は削除されています)

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

明らかな解決策は他のいくつかの言語で表されているため、Cで投稿することもできます

ゴルフ:

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

ゴルフをしていない:

#include <stdio.h>

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

編集:モジュラスの編集を見ました。

ゴルフ(モジュラスなし):

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

ゴルフなし(モジュラスなし):

#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

これは私が思いついたこれです、文字列も配列もありません...変数さえもありません(Javaではあなたを気にします):

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

より読みやすいバージョンを編集

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

コードを読みやすくしてください。これはコードゴルフではありません。ありがとうございました。
duci9y 14年

1
これはこれに対する私の最初の試みです。更新されたバージョンがより良いことを願っています:
oiZo 14年

はい、そうです。ありがとうございました。コードゴルフへようこそ。私も新しいです。:)
duci9y 14年

3

パワーシェル

PowerShellの簡単なソリューション。暗黙的または明示的に配列または文字列は使用されません。

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

テスト:

PS > rev(13457)
75431

PS > rev(rev(13457))
13457

3

python(アセンブリで簡単に実行)

バイトのビットを反転します。他の皆がやったこととまったく同じことをしないことのポイント

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

byte: 10101010
01010101

1
サンプル入力でサンプル出力を生成することはできますか?
duci9y 14年

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

出力

3回のサンプル実行
ここに画像の説明を入力してください

ゼロでテストする

ここに画像の説明を入力してください

浮動小数点数反転します!!!

ここに画像の説明を入力してください

あなたがしたい場合は、このコードを実行するために、それはその実行時に一時ファイルを作成しますので、あなたのコンピュータ上でそれを実行し、私はオンラインのコンパイラは、コンピュータの一時ファイルを作るかどうかわかりません


ファイルに書き込んで文字列にしないのですか?
duci9y

文字列は、文字の終わりにヌル文字があるため、文字列ではなく、文字のみの組み合わせです
。MukulKumar 14

文字列は文字のシーケンスです。申し訳ありませんが、この答えは制約を満たしていません。
duci9y 14年

文字列へのあなたの定義は、このウェブサイト(にアクセスしてください間違っているcs.stmarys.ca/~porter/csc/ref/c_cpp_strings.html)と最後の段落carefully.Stringは、文字の組み合わせで読んAで終わった「\ 0」
ムクルクマール14年

1
すみません、あなたはC文字列について話しているのです。私は一般的に文字列について話している。あなたの答えは資格がありません。
duci9y 14年

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
}

次に:

  • reverse(12345) 出力 54321
  • reverse(3240) 出力 423
  • reverse(6342975) 出力 5792436

2

核分裂

$SX/
\S?L
K\O

このプログラムは入力を逆にします。

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

1
「質問がされる前にプログラミング言語は存在していましたか?」これでテストします。核分裂は、エソランの世界へのクールなエントリーのように見えます-一種の「素粒子物理学の本でいっぱいの棚で酸を楽しむ」のようなものです。いいね!
ジョナサンヴァンマトレ14年

2

フォース

これはポピュラーなものの反対だと思います...しかし、フォースを使用することは常に創造的です...

新しい言葉を作ろう

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

ここでは、剰余と商を返す単語U /を使用します。剰余は、配当がゼロになるまで、フィールド1文字内の数値として出力に送信されます。少なくともビデオに何かが送信されるまで、文字列は使用されません。モジュロ演算子は使用せず、代わりに剰余と商を含む整数除算を使用します。やってみよう

12345 REV 54321
ok

ZX Spectrumエミュレーター


そのエミュレータはどこで入手できますか?

World of Spectrumには、ここにリストされているエミュレータがたくさんあります。worldofspectrum.org/ emulators.html
Mattsteel

2

チューリング機械コード

ここから構文を使用します

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

オンラインでお試しください!


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。私はそれが本当に与えるべきだと思う0321
ace_HongKongIndependence 14

それは間違っていますか?文字列ではなく数字だけを扱っている場合、0321と321は同等ですよね?
ジャヤンスコウシック14

私の理解では321になるはずです。質問は文字列の使用を許可していません。それはする必要がありますので、321
microbian

わからない... OPの返事を待っている。私はこれを指摘しているだけで、間違っていると言っているのではありません。混乱させて申し訳ありません。
ace_HongKongIndependence 14

質問を更新しました。
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

バッチ

文字列を使用しないことに関する部分を見逃した-まあ。

@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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.