数字を使用せずに2つの数字を掛ける


30

入力として"12345"、10などの正の整数を表す2つの文字列(やなど)が与えられます"42""518490"この場合、タスクは製品を含む文字列を出力することです。

ひねりは、コードで数値型を使用できないことです。いいえintsfloats、unsigned longsなど、組み込みの複素数型または任意の精度の整数、またはそれらの行に沿ったものはありません。多くの場合、これらのタイプのリテラルも、それらを返す関数、メソッド、演算子なども使用しません。

君は することができ、文字列、ブール値、配列、または通常の数を表すために使用されない何か他のものを使用しています。(どちらの配列へのインデックスもその長さを取得するには。数値型を呼び出すことなく可能である可能性があることをしかしノート)charsは許可されていますが、それらに任意の算術演算やビット演算を実行するか、そうでない場合以外の何か他のものとして扱うないかもしれません文字列の一部を表すトークン。(charsの辞書編集による比較が可能です。)

制限を回避することはできません。これには、eval型関数内での数値型の使用、数値型への暗黙的な型変換、それらをサポートする非数値型での数値演算子またはビット単位演算子の使用、コンテナ型内に格納された数値型の使用、または関数の呼び出しが含まれます(ただし、これらに限定されません)文字列形式で数値結果を返す外部プログラム。(他の回避策が回答に表示される場合、このリストに追加する権利を留保します。)非数値型のみを使用して自分で乗算を実装する必要があります。

データが文字列の形式でコードに出入りする限り、入出力は任意の便利な方法で行うことができます。2つの入力引数のそれぞれにASCII文字のみが含まれており、で[0-9]始まらないと想定でき0ます。出力の先頭にゼロを付けないでください。

もう一つ:あなたのコードがなければなりません正しくまでの入力に扱うの長さの少なくとも10の文字、としなければならないため、現代のコンピュータ上の分の下で実行するすべてのその範囲で入力。投稿する前に、入力9999999999およびを指定したとき9999999999に、プログラムが999999999800000000011分以内にの出力を提供することを確認してください。この制限は、サイズの配列を割り当ててa*bそれを反復することで機能する回答を防ぐために特に存在するため、そのフォームの回答は勝つ資格がないことに注意してください。

これはであるため、最短の有効なソリューション(バイト単位)が優先されます。


"12345"STDINからではなく受け入れることができます12345か?または、両方の数値を受け入れることができ"12345", "42"ますか?
ジャスティン14年

私が最初に考えたのは関数が長さの文字列引数を取る書くことだったmnし、長さの引数を返しますm*n。しかし、文字列には文字通り数字のASCII表現を含める必要があるため、これはルールに反していると思います。
レベルリバーセント14年

1
@xnorは多くの言語で、すべてのケースを書き出す方が短いかもしれません。しかし、私はPythonでこの方法を見つけました:a,b="0123456789x".split('0');c=iter(b).next() if c=='x': c='0'
ナサニエル14年

1
またはPython 3でa,b="0123456789x".split(x);c,*d=b if c=='x': c='0'
ナサニエル14年

2
@ナサニエルd='123456789';I=dict(zip('0'+d,d+'0'))
ジャスティン

回答:


6

ハスケル- 180 206 214

r=reverse
f=filter
z=['0'..'9']
a?f|f="1"!a
a?_=a
(a:b)!(c:d)=e:b!d?(e<a)where e=fst$last$zip(f(>=c)z++z)$f(<=a)z
a!c=a++c
a%(b:c)=foldr(!)('0':a%c)$f(<b)z>>[a]
_%b=b
a#b=r$r a%r b

繰り返し加算を介して乗算を実装し、すべての種類の数字の魔法は、['0'..'9']リストをシフトおよびフィルタリングすることによって処理されます。#タイプの演算子を定義しますString -> String -> String

*> :set +s
*> "9990123456789"#"9999876543210"
"99900001219316321126352690"
(0.02 secs, 9862288 bytes)

新しい勝者ができたようです!(以前のように、この程度の洗練されたHaskellを読むことはできません-誰かが独自にそれが仕様を満たしていることを確認できますか?)
ナサニエル

(また、['0' .. '9']は、暗黙的に文字を反復可能な数字として扱うように感じます。代わりに、文字列 "0123456789"からリストを生成する簡単な方法はありますか?)
ナサニエル

@Nathanielそもそも文字列"0123456789" リスト['0'..'9']です。次に、Haskell [a..b]は列挙であり、Enumtypeclassのインスタンスを宣言した型はそのように列挙でき、宣言は列挙がどのように機能するかを説明します。Bool、ブール型にもインスタンスがあるため、を実行することもできます[False..True]。関係する数字はほとんどありません。
mniip

14

sed、 339 338バイト

私はこれが古いものであることを知っていますが、ブラウジングしていて、これが私の興味をそそりました。実際にユーザーとして登録するのに十分です!「完全なsedソリューション–ナサニエルを見たいと思いました

s/[1-9]/0&/g
s/[5-9]/4&/g
y/8/4/
s/9/4&/g
s/4/22/g
s/[37]/2x/g
s/[26]/xx/g
s/[1-9]/x/g
:o
s/\( .*\)0$/0\1/
/x$/{
x
G
s/ .*/\n/
:a
s/\(.*\)0\(x*\)\n\(.*\)0\(x*\)\n/\1\n\3\n0\2\4/
ta
s/\n//g
:c
s/^x/0x/
s/0xxxxxxxxxx/x0/
tc
x
s/x$//
}
/ 0/bo
g
s/0x/-x/g
s/xx/2/g
y/x/1/
s/22/4/g
s/44/8/g
s/81/9/g
s/42/6/g
s/21/3/g
s/61/7/g
s/41/5/g
s/-//g

このsedスクリプトは、入力として1つのスペースで区切られた2つの10進数を想定しています

テスト:

time test 518490 = $(./40297.sed <<<)"12345 42" || echo fail
time test 99999999980000000001 = $(./40297.sed <<<"9999999999 9999999999") || echo fail
time test 1522605027922533360535618378132637429718068114961380688657908494580122963258952897654000350692006139 = $(./40297.sed <<<"37975227936943673922808872755445627854565536638199 40094690950920881030683735292761468389214899724061") || echo fail
time test 1230186684530117755130494958384962720772853569595334792197322452151726400507263657518745202199786469389956474942774063845925192557326303453731548268507917026122142913461670429214311602221240479274737794080665351419597459856902143413 = $(./40297.sed <<<"33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489 36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917") || echo fail

最後の2つはRSA-100(50 x 50桁)およびRSA-768(116 x 116桁)として認識される場合があります。

あまり近代的ではない(2007年時代のIntel Core 2)でGNU sedを使用すると、それらの最後は1分以上かかりますが、新しいプロセッサではより高速になります。

  • Q6600:> 1分
  • i7-3770:26秒
  • i7-6700:22秒

質問で指定された小柄な10桁の乗算は、これらのいずれについても1秒未満で十分にかかります(病理学的な9でいっぱいですが)。

私はそれが標準のsedであり、拡張機能がないと信じています。POSIXは8192バイトのスペースのみを保持することを保証します。これにより、400x400桁の数字の乗算に制限されますが、実装はそれ以上を提供できます。GNU sedは利用可能なメモリによってのみ制限されるので、もしあなたが待っていればもっと大きなものを管理できます。

そして、私は規則を遵守したと確信しています-それは数字のない言語ではほとんど与えられています。:-)

説明

単項/十進ハイブリッドを使用して、10進数を単項のシーケンスに変換します。

 42 => _xxxx_xx

単項10進数では、加算は簡単です。xを連結して、最下位桁から最上位桁まで反復します。

   X=965                   Y=106                                 SUM
   _xxxxxxxxx_xxxxxx_xxxxx _x__xxxxxx
   _xxxxxxxxx_xxxxxx       _x_                          _xxxxxxxxxxx
   _xxxxxxxxx              _x                    _xxxxxx_xxxxxxxxxxx
                                      _xxxxxxxxxx_xxxxxx_xxxxxxxxxxx

次に、空白を削除し、連続する10個のxを次のユニットの1つに変換することにより、キャリーを処理します。

 _xxxxxxxxxx_xxxxxx_xxxxxxxxxxx       10.6.11
 _xxxxxxxxxx_xxxxxxx_x                10.7.1
 _x__xxxxxxx_x                        1.0.7.1 

加算が完了すると、乗算が可能になります。yの最後の桁を考慮してx * yを乗算します。アキュムレータにxを何回も追加してから、次の桁に移動し、xを小数点以下1桁左にシフトします。yがゼロになるまで繰り返します。

拡張コード

#!/bin/sed -f

# Convert to unary decimal.  We save two or three bytes of code by
# reusing 0 as the digit separator.
s/[1-9]/0&/g
s/[5-9]/4&/g
y/8/4/
s/9/4&/g
s/4/22/g
s/[37]/2x/g
s/[26]/xx/g
s/[1-9]/x/g

# until y==0

:one

# y ends in zero => x *= 10 and y /= 10
s/\( .*\)0$/0\1/

# while y%10, acc += x, y -= 1
/x$/{
x
G
s/ .*/\n/
# Add x
:add
s/\(.*\)0\(x*\)\n\(.*\)0\(x*\)\n/\1\n\3\n0\2\4/
tadd
s/\n//g
:carry
s/^x/0x/
s/0xxxxxxxxxx/x0/
tcarry

# repeat for each unit of y
x
s/x$//
}

# y?
/ 0/bone


# convert hold space to decimal
g
s/0x/-x/g
s/xx/2/g
y/x/1/
s/22/4/g
s/44/8/g
s/81/9/g
s/42/6/g
s/21/3/g
s/61/7/g
s/41/5/g
s/-//g

1
非常に満足のいく答え、ありがとう!
ナサニエル

9

sed、379バイト

この素晴らしい回答の功績は、Unix&Linux.SEの@LuigiTiburziのhttps://unix.stackexchange.com/a/372​​13/34061にあります。数日前に偶然これに出くわしました。

s/[0-9]/<&/g
s/0//g
s/1/|/g
s/2/||/g
s/3/|||/g
s/4/||||/g
s/5/|||||/g
s/6/||||||/g
s/7/|||||||/g
s/8/||||||||/g
s/9/|||||||||/g
:t
s/|</<||||||||||/g
tt
s/<//g
s/.*\*$/0/
s/^\*.*/0/
s/*|/*/
:m
s/\(|*\)\*|/\1<\1*/
tm
s/*//g
s/<//g
:b
s/||||||||||/</g
s/<\([0-9]*\)$/<0\1/
s/|||||||||/9/
s/||||||||/8/
s/|||||||/7/
s/||||||/6/
s/|||||/5/
s/||||/4/
s/|||/3/
s/||/2/
s/|/1/
s/</|/g
tb

幅広い説明

  • 各桁を区切ります。かくして12*3なりました<1<2*<3
  • 各桁をその数に変換します |。このように<1<2*<3なりました<|<||*<|||
  • 繰り返しに置き換え|<<||||||||||小数点以下の桁数をすべて単位の位置にシフトするために、ます。このように<|<||*<|||なりました<||||||||||||*<|||
  • 削除する <ます。このように<||||||||||||*<|||なりました||||||||||||*|||
  • |のRHSから1 を削除します*ます。このように||||||||||||*|||なりました||||||||||||*||
  • |RHSのそれぞれを|LHSのすべてと繰り返し交換します。これは、LHSとRHSの数を乗算|して、製品の数を与える効果があります。| このように||||||||||||*||なります||||||||||||||||||||||||||||||||||||*
  • を削除し*ます。かくして||||||||||||||||||||||||||||||||||||*なりました||||||||||||||||||||||||||||||||||||
  • |最初の数ステップを逆にして、数値を10進数に変換します。このように||||||||||||||||||||||||||||||||||||なりました36ます。

出力:

$ echo "04*3
4*3
40*3
42*32
150*20
1*3
3*1
0*3
3*0" | sed -f mult.sed
12
12
120
1344
3000
3
3
0
0
$

残念ながら、時間要件で惨めに失敗します- 200*1000私のUbuntu VMでは41秒かかり、ランタイムは最終製品の2乗で経験的に上昇するようです。


1
これは、数値部分に変換することを除いて、削除されたJS回答とほぼアルゴリズム的に同等です。
オプティマイザー14年

@Optimizer合意。違いは、あなたが使用するlength()ものが数値を返すことです。これは、数値型のない純粋な正規表現の置換を使用します。私はあなたの答えが潜在的に勝者だと思いますが、もしあなたが削除できるなら length()-おそらくあなたは代わりにいくつかの同様の正規表現の置換を行うことができますか?
デジタル外傷14年

1
非常に良いことですが、1分間の制限は、回答までカウントアップすることで機能するソリューションを防ぐことを目的としています。ただし、完全なsedソリューションをご覧ください。
ナサニエル

1
大きな数値(たとえば、システムのアドレススペースより大きい)で機能する答えあります
トビーSpeight

@TobySpeightはい、とても良い。しばらく前からあなたの投票を支持していたに違いないと思います:)
デジタルトラウマ

9

Python – 312 286 273

D={}
e=t=""
N=[e]
for c in"0123456789":D[c]=t;D[t]=c;t+="I";N+=N
B=lambda s:[D[c]for c in reversed(s)]
Y=B(input())+N
for a in B(input())+N:
 for c in a:
    s=[];o=e
    for a,b in zip(N,Y):i=a+b+o;o=t<=i and"I"or e;s+=i.replace(t,e),;N=s
 Y=[e]+Y
print e.join(B(N)).lstrip("0")

(多数の)先行ゼロが許可される場合、最後の12文字は必要ありません。

これは基本的に手動で標準の乗算を実行します。数字は、繰り返されるIsのストリングとして表されます(プリミティブなローマ数字のように)。番号は、逆順の数字のリストとして表されます。文字列を連結し、10を削除することにより、1桁の追加が実行されますI、必要に応じて。

以下は、バージョン化されていないバージョンです。

N = [""] # zero object: list with a lot of empty strings
D = {}   # dictionary for conversion from and to digits
i = ""   # iterates over digits
for c in "0123456789":
    D[c] = i  # map digit to Roman digit
    D[i] = c  # and vice versa
    i += "I"  # increments Roman digit
    N += N    # add leading zeros to zero

ten = "IIIIIIIIII" # Roman digit ten

# Conversion function
B = lambda s: [D[c] for c in reversed(s)]

def Add(x,y):
    Sum = []
    carryover = ""
    for a,b in zip(x,y):
        increment = a+b+carryover
        carryover = "I" if ten in increment else ""
        increment = increment.replace(ten,"") # take increment modulo ten
        Sum += [increment]
    return Sum

def M(x,y):
    Sum = N[:] # Initiate Sum as zero
    X = B(x)+N # Convert and add leading zeros
    Y = B(y)+N
    for a in X:
        for c in a:
            Sum = Add(Sum,p+Y)
        Y = [""] + Y # multiply Y by 10
    return "".join(B(Sum)).lstrip("0") # Convert back and to string, remove leading zeros.

M(input(),input())

1
この魔術とは何ですか!どのように動作します!ワオ。また、次のゴルフもできます。- def A(x,y):\n S=[];o=""> def A(x,y,S=[],o=""):。また、残念ながら、["","1"][t in i]許可されていません。インデックスとしてboolを使用して、数値として扱います。t in i and"1"or""ただし、これでうまくいくと思います。
ジャスティン14年

@Quincunx:S関数の異なる呼び出しに対しても常に同じリストであり、したがってにリセットされないため、デフォルトで引数として定義しても機能しませんでした[]。あなたは正しかった["","1"][t in i]、私はそれを修正しました。説明も追加しました。
Wrzlprmft 14年

これはすごいです。今のところ緑色のチェックマークが付いています。(出力の先行ゼロは許可されないことを明確にするために質問を編集しました-ごめんなさい!)
ナサニエル14年

7

ルビー:752 698

これは、単に好奇心から答えを得るためのものです。編集済み:少しゴルフをしました。

$F='0123456789'
$G="#{$F}abcdefghij"
def x(a,b);p(a=~/[13579]$/?b:"",a==""?"":x(Hash[*%w(b0 5 b1 6 b2 7 b3 8 b4 9)].to_a.inject(a.tr($F,'0011223344').chars.zip(a.tr($F,'ababababab').chars).flatten.join("")){|n,q|k,v=q;n.gsub(k,v)}.gsub(/[ab]/,'').sub(/^0*/,''),p(b,b)));end
def p(a,b);j,k=["0#{a}","0#{b}"].map{|c|c.gsub(/./,'0')};c="#{k}#{a}".chars.zip("#{j}#{b}".chars).drop_while{|z|z==%w(0 0)}.map{|m|$G.sub(/#{m.map{|n|"122333444455555666666777777788888888999999999".chars.select{|c|c==n}}.flatten.map{|c|'.'}.join("")}/,"").chars.first}.flatten.join("");d=nil;
while c!=d
 d=c;c="0#{d}".gsub(/[0-9][a-j]/) {|m| m.tr($G,"123456789a#{$F}")}.sub(/^0/,'')
end;c;end
puts x(ARGV.shift,ARGV.shift)

使用法:peasant.rbというファイルにこれがありました:

$ time ruby peasant.rb 9999999999 9999999999
99999999980000000001

real    0m0.129s
user    0m0.096s
sys 0m0.027s

説明:それは農民の掛け算ですので、私は繰り返し半分と二重にします。半分にすることは、数字を半分にして残りを次のようにマークすることによって行われます:1234-> 0b1a1b2a; 次に、bで検索して置き換えます:06a17a; その後、クリーンアップ-> 617。

追加は次のように行われます...まず、両方の文字列を同じ長さになるまで埋め込み、数字からペアを作成します。次に、各桁の長さの文字列を作成して連結し、数字を追加します。'0123456789abcdefghij'の先頭からその長さの文字列を削除し、最初の文字を保持します。したがって、たとえば、「9」+「9」->「i」です。NBここでは、数値型を完全に回避するために、ここでは実際に長さ関数を使用することを避けています。接頭辞の削除は、代わりに正規表現で行われます。

これで、数字と文字が混在した文字列ができました。文字は桁を表す数字を表します。数字の前に0を追加し、数字の文字パターンをキャリーの結果で繰り返して、加算が完了するまで繰り返します。


1
非常に巧妙な答え、まさに私が見たいと思っていたようなもの!
ナサニエル14年

1
私は実際に誰かが教会の数字で1つを投稿することを望んでいます!
bazzargh

私は効果的に99999999980000000001.までカウント伴うだろう文字列や教会の数字間の変換を考える-それは、効率の要件に働くだろう場合、私はわからないけれどもそれは、クールになる
ナサニエル

7

Brainfuck(1328バイト)

最初の考慮事項:

  • セル値を「数値型」とみなすかどうかわからないので、brainfuckがこの質問に対する有効な答えであるかどうかはわかりません。bfは型を知らないのでそうは思いませんが、それは私自身の意見です。間違っている場合は修正してください。
  • (ほぼ)無制限の値をサポートする実装が必要です。
  • 実装によっては、非常に遅いかもしれません。

私は自分のインタプリタでプログラムをテストしただけです。あなたはそれをここで見つけることができます。

入力は、単一のASCIIスペースで区切られた両方の数字でなければなりません。

ゴルフ:

,>++++++[<----->-]<--[>,>++++++[<----->-]<--]>>>+<<<<[>>++++[<<---->>-]<<[>>>>[>+>+<<-]>>[<<+>>-]<<<<<<-]>>>>>[<<<<<+>>>>>-]<[>++++++++++<-]>[<<+>>-]<<<<<[->+<]>[-<+>]<<]>>>>[-]<,[>,]>>>+<<<<[>>+++++++[<<------->>-]<<+[>>>>[>+>+<<-]>>[<<+>>-]<<<<<<-]>>>>>[<<<<<+>>>>>-]<[>++++++++++<-]>[<<+>>-]<<<<<[->+<]>[-<+>]<<]>>>>[-]<<<<<[>>[>+>+<<-]>>[<<+>>-]<<<<-]>>[-]>[<+>-]<[>>+>+<<<-]>>>[<<<+>>>-]<[[-]<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]++++++++++<[>>+>+<<<-]>>>[<<<+>>>-]<[>+<-]>[<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<[>+<<-[>>[-]>+<<<-]>>>[<<<+>>>-]<[<-[<<->>[-]]+>-]<-]<<+>]<[>>+<<-]>>[<<<[>+>+<<-]>>[<<+>>-]>-]<<[<<->>-]<[-]<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[>>]+[<<]>[>[>>]<+<[<<]>-]<<<<<<<<<<[>>+>+<<<-]>>>[<<<+>>>-]+[<+>-]<<<[-]>>[<<+>>-]<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]++++++++++<[>>+<<-]>>[<[>>+>+<<<-]>>>[<<<+>>>-]<[>+<<-[>>[-]>+<<<-]>>>[<<<+>>>-]<[<-[<<<->>>[-]]+>-]<-]<<<+>>]<[-]<<<<[-]>>>[<<<+>>>-]<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<[<+>-]<]<[>+>+<<-]>>[<<+>>-]<[>+<[-]]+>[<[-]<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<[[-]>>>>>>>>[>>]<[<[<<]<<<<<+>>>>>>>[>>]<-]<-<<[<<]<<<<<>++++++++++++++++++++++++++++++++++++++++++++++++[<+>-]<.[-]<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-]+[<->-]<<<<<[-]>>>>[<<<<+>>>>-]<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-]<[<+>-]<]<[-]]<[>>++++++[<++++++++>-]<.[-]<[-]]<[-]<[-]>>>>>>>>>>>>[>[-]>]<<[-<<]<<<<<<<<<<<<<<<<<[-]<[-]

ゴルフをしていない:

,
>++++++[<----->-]<--
[                                           # read input until space
    >,
    >++++++[<----->-]<--                    # decrease cell by 32 to check if it's a space
]
>>>+<<<<                                    # set multiplier to 1

[

    >>++++[<<---->>-]<<                     # decrease by 16 to get cell value of number

    [>>>>[>+>+<<-]>>[<<+>>-]<<<<<<-]        # multiply value by multiplier
    >>>>>[<<<<<+>>>>>-]                     # copy value back
    <[>++++++++++<-]>[<<+>>-]               # multiply multiplier by 10
    <<<<<                                   # go back to number

    [->+<]>[-<+>]                           # add value to next cell and move sum to previous cell

    <<                                      # go to next number
]

>>>>[-]<                                    # delete old multiplier

,[>,]                                       # read second number until end of input
>>>+<<<<                                    # set new multiplier

[

    >>+++++++[<<------->>-]<<+              # decrease by 48 to get cell value of number

    [>>>>[>+>+<<-]>>[<<+>>-]<<<<<<-]        # multiply value by multiplier
    >>>>>[<<<<<+>>>>>-]                     # copy value back
    <[>++++++++++<-]>[<<+>>-]               # multiply multiplier by 10
    <<<<<                                   # go back to number

    [->+<]>[-<+>]                           # add value to next cell and move sum to previous cell

    <<                                      # go to next number
]

>>>>[-]<<<<<                                # delete multiplier

[>>[>+>+<<-]>>[<<+>>-]<<<<-]>>[-]>          # multiply both values

# magical algorithm for printing cell value as number taken from Cedric Mamo's code from a previous question
[<+>-]<[>>+>+<<<-]>>>[<<<+>>>-]<[[-]<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]++++++++++<[>>+>+<<<-]>>>[<<<+>>>-]<[>+<-]>[<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<[>+<<-[>>[-]>+<<<-]>>>[<<<+>>>-]<[<-[<<->>[-]]+>-]<-]<<+>]<[>>+<<-]>>[<<<[>+>+<<-]>>[<<+>>-]>-]<<[<<->>-]<[-]<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[>>]+[<<]>[>[>>]<+<[<<]>-]<<<<<<<<<<[>>+>+<<<-]>>>[<<<+>>>-]+[<+>-]<<<[-]>>[<<+>>-]<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]++++++++++<[>>+<<-]>>[<[>>+>+<<<-]>>>[<<<+>>>-]<[>+<<-[>>[-]>+<<<-]>>>[<<<+>>>-]<[<-[<<<->>>[-]]+>-]<-]<<<+>>]<[-]<<<<[-]>>>[<<<+>>>-]<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<[<+>-]<]<[>+>+<<-]>>[<<+>>-]<[>+<[-]]+>[<[-]<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<[[-]>>>>>>>>[>>]<[<[<<]<<<<<+>>>>>>>[>>]<-]<-<<[<<]<<<<<>++++++++++++++++++++++++++++++++++++++++++++++++[<+>-]<.[-]<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-]+[<->-]<<<<<[-]>>>>[<<<<+>>>>-]<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-]<[<+>-]<]<[-]]<[>>++++++[<++++++++>-]<.[-]<[-]]<[-]<[-]>>>>>>>>>>>>[>[-]>]<<[-<<]<<<<<<<<<<<<<<<<<[-]<[-]

私はこの答えから値を出力するためのコードを取りましたための作者のおかげです!

プログラム有効でないかもしれませんが、いずれにしても、あなたと共有したかったです^^

更新:あなたは今、ここに(わずかな乗算のために)SP3000の@のおかげでそれをテストすることができます答え、このコンテストとSEの新しいスタックスニペットを!

var NUM_CELLS = 30000;var ITERS_PER_SEC = 100000;var TIMEOUT_MILLISECS = 5000;function clear_output(){document.getElementById("output").value="";document.getElementById("stderr").innerHTML=""}function stop(){running=false;document.getElementById("run").disabled=false;document.getElementById("stop").disabled=true;document.getElementById("clear").disabled=false;document.getElementById("wrap").disabled=false;document.getElementById("timeout").disabled=false;document.getElementById("eof").disabled=false}function interrupt(){error(ERROR_INTERRUPT)}function error(e){document.getElementById("stderr").innerHTML=e;stop()}function run(){clear_output();document.getElementById("run").disabled=true;document.getElementById("stop").disabled=false;document.getElementById("clear").disabled=true;document.getElementById("wrap").disabled=true;document.getElementById("timeout").disabled=true;document.getElementById("eof").disabled=true;code=document.getElementById("code").value;input=document.getElementById("input").value;wrap=document.getElementById("wrap").value;timeout=document.getElementById("timeout").checked;eof=document.getElementById("eof").value;loop_stack=[];loop_map={};for(var e=0;e<code.length;++e){if(code[e]=="["){loop_stack.push(e)}else if(code[e]=="]"){if(loop_stack.length==0){error(ERROR_BRACKET);return}else{var t=loop_stack.pop();loop_map[t]=e;loop_map[e]=t}}}if(loop_stack.length>0){error(ERROR_BRACKET);return}running=true;start_time=Date.now();code_ptr=0;input_ptr=0;cell_ptr=Math.floor(NUM_CELLS/2);cells={};iterations=0;bf_iter(1)}function bf_iter(e){if(code_ptr>=code.length||!running){stop();return}var t=Date.now();for(var n=0;n<e;++n){if(cells[cell_ptr]==undefined){cells[cell_ptr]=0}switch(code[code_ptr]){case"+":if(wrap=="8"&&cells[cell_ptr]==255||wrap=="16"&&cells[cell_ptr]==65535||wrap=="32"&&cells[cell_ptr]==2147483647){cells[cell_ptr]=0}else{cells[cell_ptr]++}break;case"-":if(cells[cell_ptr]==0){if(wrap=="8"){cells[cell_ptr]=255}if(wrap=="16"){cells[cell_ptr]=65535}if(wrap=="32"){cells[cell_ptr]=2147483647}}else{cells[cell_ptr]--}break;case"<":cell_ptr--;break;case">":cell_ptr++;break;case".":document.getElementById("output").value+=String.fromCharCode(cells[cell_ptr]);break;case",":if(input_ptr>=input.length){if(eof!="nochange"){cells[cell_ptr]=parseInt(eof)}}else{cells[cell_ptr]=input.charCodeAt(input_ptr);input_ptr++}break;case"[":if(cells[cell_ptr]==0){code_ptr=loop_map[code_ptr]}break;case"]":if(cells[cell_ptr]!=0){code_ptr=loop_map[code_ptr]}break}code_ptr++;iterations++;if(timeout&&Date.now()-start_time>TIMEOUT_MILLISECS){error(ERROR_TIMEOUT);return}}setTimeout(function(){bf_iter(ITERS_PER_SEC*(Date.now()-t)/1e3)},0)}var ERROR_BRACKET="Mismatched brackets";var ERROR_TIMEOUT="Timeout";var ERROR_INTERRUPT="Interrupted by user";var code,input,wrap,timeout,eof,loop_stack,loop_map;var running,start_time,code_ptr,input_ptr,cell_ptr,cells,iterations
<div style="font-size:12px;font-family:Verdana, Geneva, sans-serif;"> <div style="float:left; width:50%;"> Code: <br> <textarea id="code" rows="4" style="overflow:scroll;overflow-x:hidden;width:90%;">,>++++++[<----->-]<--[>,>++++++[<----->-]<--]>>>+<<<<[>>++++[<<---->>-]<<[>>>>[>+>+<<-]>>[<<+>>-]<<<<<<-]>>>>>[<<<<<+>>>>>-]<[>++++++++++<-]>[<<+>>-]<<<<<[->+<]>[-<+>]<<]>>>>[-]<,[>,]>>>+<<<<[>>+++++++[<<------->>-]<<+[>>>>[>+>+<<-]>>[<<+>>-]<<<<<<-]>>>>>[<<<<<+>>>>>-]<[>++++++++++<-]>[<<+>>-]<<<<<[->+<]>[-<+>]<<]>>>>[-]<<<<<[>>[>+>+<<-]>>[<<+>>-]<<<<-]>>[-]>[<+>-]<[>>+>+<<<-]>>>[<<<+>>>-]<[[-]<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]++++++++++<[>>+>+<<<-]>>>[<<<+>>>-]<[>+<-]>[<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<[>+<<-[>>[-]>+<<<-]>>>[<<<+>>>-]<[<-[<<->>[-]]+>-]<-]<<+>]<[>>+<<-]>>[<<<[>+>+<<-]>>[<<+>>-]>-]<<[<<->>-]<[-]<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[>>]+[<<]>[>[>>]<+<[<<]>-]<<<<<<<<<<[>>+>+<<<-]>>>[<<<+>>>-]+[<+>-]<<<[-]>>[<<+>>-]<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]++++++++++<[>>+<<-]>>[<[>>+>+<<<-]>>>[<<<+>>>-]<[>+<<-[>>[-]>+<<<-]>>>[<<<+>>>-]<[<-[<<<->>>[-]]+>-]<-]<<<+>>]<[-]<<<<[-]>>>[<<<+>>>-]<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<[<+>-]<]<[>+>+<<-]>>[<<+>>-]<[>+<[-]]+>[<[-]<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<[[-]>>>>>>>>[>>]<[<[<<]<<<<<+>>>>>>>[>>]<-]<-<<[<<]<<<<<>++++++++++++++++++++++++++++++++++++++++++++++++[<+>-]<.[-]<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-]+[<->-]<<<<<[-]>>>>[<<<<+>>>>-]<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-]<[<+>-]<]<[-]]<[>>++++++[<++++++++>-]<.[-]<[-]]<[-]<[-]>>>>>>>>>>>>[>[-]>]<<[-<<]<<<<<<<<<<<<<<<<<[-]<[-]</textarea> <br>Input: <br> <textarea id="input" rows="2" style="overflow:scroll;overflow-x:hidden;width:90%;">7 6</textarea> <p> Wrap: <select id="wrap"> <option value="8">8-bit</option> <option value="16">16-bit</option> <option value="32" selected="selected">32-bit</option> </select> &nbsp; Timeout: <input id="timeout" type="checkbox"></input>&nbsp; EOF: <select id="eof"> <option value="nochange">Same</option> <option value="0" selected="selected">0</option> <option value="-1">-1</option> </select> </p> </div> <div style="float:left; width:50%;"> Output: <br> <textarea id="output" rows="6" style="overflow:scroll;width:90%;"></textarea> <p> <input id="run" type="button" value="Run" onclick="run()"></input> <input id="stop" type="button" value="Stop" onclick="interrupt()" disabled="true"></input> <input id="clear" type="button" value="Clear" onclick="clear_output()"></input> &nbsp; <span id="stderr" style="color:red"></span></p></div></div>


それが有効かどうかもわかりません!Brainfuckですべてが数字であるか、または何もないことを推測します。
ナサニエル14年

私はこの答えが好きです。私は最近自分自身でbfをいじっていました。とにかく、マシンレベルでは、すべてが単なるトークンであるという事実に光を当てます。これが本当にルールに従っているかどうかを言うのは難しい。
タコ14年

6

Python、394 349 340文字

D='0123456789'
R=reversed
U=lambda x:[R for y in D if y<x]
T=U(':')
def A(a,b,r='',c=[]):
 for x,y in map(None,R(a),R(b)):
    d=U(x)+U(y)+c;t=T;c=[R]
    if d<T:t=c=[]
    r=min(k for k in D if U(k)+t>=d)+r
 if c:r='1'+r
 return r
a,b=input()
m=''
while b:
 if list(b).pop()in'13579':m=A(m,a)
 b=list(A(b,A(b,A(b,A(b,b)))));b.pop();a=A(a,a)
print m

次のように実行します:

echo '"9999999999","9999999999"' | ./mulstr.py

50ミリ秒かかります。

ロシア農民の乗算を使用します。数字を追加するとき、それらを単項に変換し( '5' => [R、R、R、R、R])、リストを連結してから元に戻します。 単項数字としてU使用しRて、単項に変換します。b/=2として計算しb=b*5/10ます。


カップルのゴルフ:def A(a,b):\n r='';c=[]-> def A(a,b,r='',c=[]):、同様にdef M。あなたは変更することができるかもしれないfor z in D:d.pop()\n c=['X'][d.pop()for z in D];c=['X']、その場合には、あなたも、前にそれを折りたたむことができif。また、if list(b).pop()in'13579'ちょうどすることができますif b[:].pop()in'13579'か?
ジャスティン14年

@Quincunx:ありがとう。最初の反復でbはリストではなく文字列であるため、最後のものは機能しません。
キースランドール14年

スキップMして完全なプログラムを作成できます。a,b=input() 許可されている。
ジャスティン14年

1
b * 5/10は素晴らしいトリックです。
バザーグ14年

私はちょうどつまずいreduceあなたがnicenすることを可能にする、A(b,A(b,A(b,A(b,b))))reduce(A,[b,b,b,b,b])。悲しいことに、これは文字数に影響しません。
Wrzlprmft 14年

5

JavaScript(E6)375395411411449

編集 Golfed
編集固定バグ:キャリーフラグをクリア行方不明

それは、シンボル操作だけでほぼ0時間で実行できます。
このバージョンでは、シンボルが昇順である限り、数字の代わりに任意の文字を使用できます。

注:文字列の使用、文字列キーを含むハッシュマップ、リストとして使用される配列。インデックス付けなし。配列は「マップ」を使用して移動されるか、プッシュ&シフトを使用して回転されます。
すべての「+」は文字列の連結です。

M=(x,y,S=a=>a.shift()||z,R=a=>[...a].reverse(),e=R('9876543210'),d=[...e])=>
  R(y)[T='map'](b=>
     R(x)[T](a=>(
       u=R[e[a+=b]+v],
       v=R[S[a]+(u<v?'1':z)],
       p[P](t=R[S(o)+u]),
       t<u?v=R[v+'1']:v
     ),o=p,p=[])
    +(v>z&&p[P](v),x+=v=z),
    d[T](a=>d[T](b=>e[P='push'](R[a+b]=S(e)))+e[P](S(e))),  
    d[T](a=>d[T](b=>e[d[T](c=>v=c<a?(u=R[u+b])<b?R[v+'1']:v:v,v=u=z='0'),S[a+b]=v,a+b]=u)),
    p=[v=z]
  )&&R(p).join(o)

少ないゴルフ(おそらく明日説明を追加します)

M=(x,y)=>(
  R=a=>[...a].reverse(),
  // Addition table s 
  s={},
  e=[...'9012345678'],
  [for(a of(d='0123456789'))for(b of(e.push(e.shift()),d))e.push(s[a+b]=c=e.shift())],
  // Multiplication table m,n
  m={},n={},
  [for(a of d)for(b of d)(
     [for(c of(z=u=v='0',d))
     c<a&&(t=s[u+b],t<u?v=s[v+'1']:v,u=t)
     ],m[a+b]=u,n[a+b]=v
  )],
  x=R(x),v=z,o=[],p=[],
  [for(b of R(y))(
     [for(a of x)(
       u=s[m[a+b]+v],v=s[n[a+b]+(u<v?'1':z)],
       p.push(t=s[(o.shift()||z)+u]),
       t<u?v=s[v+'1']:v
     )],
     v>z?p.push(v):o,o=p,p=[],x.unshift(v=z)
  )],
  R(o).join('')
)

FireFox / FireBugコンソールでテストする

t0=-new Date
r=M('9999999999','9999999999')
t1=-new Date
console.log("Result",r, "time ms", t0-t1)

出力

Result 99999999980000000001 time ms 14

わずかなバグがある可能性があります- 9999999999ケースからの出力はそう99999999980000000001ではないはずです99999999980000000081
ナサニエル

:(チェックしよう
edc65

乗算表を使用している場合、加算が許可されていないという事実をどのように回避していますか?
COTO

1
集計はハッシュテーブル(コード内のs)を使用して許可されます。例 s ['34 ']->' 7 '。数字ではなく単なる記号。s ['cd']-> 'g'可能性があります
edc65

5

Haskell、231バイト

これは、自然数の2つの文字列表現を乗算する演算子#を定義します。これは、文字列で基本的なインクリメント/デクリメント操作を定義し、それを使用して加算と乗算を構築することにより機能します。少し余分な魔法は、それをすべて可能にするいくつかの指数関数的な高速化を提供します。

r=reverse
n="9876543210"
t=True
c&(x:y)|c==x=head y|t=c&y
m%[]="1";m%(c:s)|c==last m=head m:m%s|t=c&m:s
[]!y=y;x![]=x;(x:a)!('0':b)=x:a!b;x!y=(r n%x)!(n%y)
"0"?_="0";x?('0':y)|all(=='0')y="0"|t=('0':x)?y;x?y=x?(n%y)!x
x#y=r$r x?r y

このアプローチは十分に高速であるため、最適化されていないghci REPLの2008年のラップトップでも、テストケースはほんの数秒で完了します。

λ> :set +s
λ> let test = replicate 10 '9'
(0.00 secs, 0 bytes)
λ> test
"9999999999"
(0.00 secs, 1069784 bytes)
λ> test # test
"99999999980000000001"
(0.06 secs, 13451288 bytes)

2桁の製品がすべて正しいことを確認します。

λ> and [ show (x * y) == (show x # show y) | x <- [0..100], y <- [0..100] ]
True

新しいリーダーがいるようです!(しかし、Haskellを読むことはできません-仕様に適合することを誰かが独自に確認できますか?)
ナサニエル14年

1
はい、それは完全に色付きのhaskellであり、仕様に適合し、宣伝どおりに機能します。よくやった!
バザーグ14年

4

Bash + ImageMagick:52

convert -size ${a}x${b} xc:red txt:-|grep -v g|wc -l

入力がシェル変数にあることを期待します aおよびb。それは特に賢くも効率的でもありませんが、仕事を終わらせます。おそらく以前に行われたものです。

xは画像の寸法を示すことに注意してください。このコンテキストでは算術演算子ではありません。

私はこれをテストしていませんが、極端ではない入力の場合、1分以内に完了すると思います。明日テストできます。

ImageMagickバージョンで面白いビジネスがある場合、これは私が使用しているものです: ImageMagick 6.7.7-10


良い試みですが、入力9999999999とに対して1分以内に(または実際に既存のマシンではまったく)動作しないことは確かです9999999999
ナサニエル14年

4
これも機能しますdd if=/dev/zero bs=$a count=$b 2>&-|wc -c
jimmy23013

1
9999999999x99999999998ビット形式の画像は、現在地球上に存在するすべてのハードドライブ領域を占有します。もちろん、生の画像を最初に作成せずに作成できる場合、pngはずっと小さくなります。(私はあなたがそのサイズの画像で整数オーバーフローの問題を抱えていることを強く疑います。)しかし、それでも、そのようなメソッドはほとんど確実に呼び出し元、戻り値、数値結果、文字列の抜け穴のファウルに落ちるでしょう。
ナサニエル14年

1
$b代わりにを使用すると、2バイト節約できます${b}
nyuszika7h 14年

1
また、のgrep -vc g代わりにを使用して5バイトを節約できますgrep -v g|wc -l
nyuszika7h 14年

2

Python 2(概念実証)

このソリューションは、文字列とリストのみを使用し、少し正規表現を使用します。すぐにできる方法がないことを除いて、仕様に完全に適合すると思います9999999999x9999999999。十分な時間が与えられたとしても、それは動作するでしょう。4桁の数字を非常にすばやく乗算できます。

技術的には無効であるため、私はまだ完全にゴルフをする気になりませんでした。ルールが変更された場合はそうします。

import re
D='123456789'
D=dict(zip('0'+D,D+'0'))

def toRlist(s):
    if s:t,h=re.match(r'(\d*)(\d)',s).groups();return[h,toRlist(t)]
    return''

def increment(r):
    if not r:return['1','']
    h,t=r
    return[D[h],increment(t)if h=='9'else t]

def toString(r):
    if not r:return''
    h,t=r
    return h+toString(t)

def listify(r,L):
    if not r:return
    h,t=r
    if h=='1':L.append('')
    if h=='2':L.extend(['',''])
    if h=='3':L.extend(['','',''])
    if h=='4':L.extend(['','','',''])
    if h=='5':L.extend(['','','','',''])
    if h=='6':L.extend(['','','','','',''])
    if h=='7':L.extend(['','','','','','',''])
    if h=='8':L.extend(['','','','','','','',''])
    if h=='9':L.extend(['','','','','','','','',''])
    listify(t,L);listify(t,L);listify(t,L);listify(t,L);listify(t,L)
    listify(t,L);listify(t,L);listify(t,L);listify(t,L);listify(t,L)

def add(r1,r2):
    L=[];listify(r2,L)
    for _ in L:r1=increment(r1)
    return r1

def multiply(a,b):
    total=''
    r=toRlist(a)
    L=[];listify(toRlist(b),L)
    for _ in L:total=r if total=='' else add(total,r)
    return''.join(reversed(toString(total)))

例:

multiply('12','5') #returns the string 60

multiply('1869','1243') #returns the string 2323167

1
+1は、私が知る限りでは(効率要件を除いて)仕様を満たしているためです
ナサニエル14年

2

パイソン2(555)

私は通常、自分の課題にそれほど迅速に(またはまったく)答えませんが、それが実現できることを証明したかったのです。(幸いにも、この前に他のいくつかの答えがそれをしましたが、私はそれを終えたいと思わずにはいられませんでした)9999999999x9999999999私のマシンでは0.03秒未満でケースを処理します。

d="123456789";I=dict(zip('0'+d,d+'0'))
def r(x):return reversed(x)
def s(x):return''.join(x)
def i(x):
    try:
        h=I[x.next()]
        if h!='0':h+=s(x)
        else:h+=i(x)
        return h
    except:return'1'
def b(x,y):
    for c in'0'+d:
        if c==y:break
        x=iter(i(x))
    return x
def a(x,y):
    z=''
    for c in y:
        x=b(x,c)
        try:z+=x.next()
        except:z+='0'
    return z+s(x)
def n(x,y):
    z='0'
    for c in'0'+d:
        if c==y:break
        z=a(iter(z),x)
    return z
def o(x,y):
    x=s(x)
    l='';z=''
    for c in y:
        z=a(iter(z),l+s(n(x,c)))
        l+='0'
    return z
def m(x,y):
    return s(r(o(r(x),r(y))))

使用例: m("12345","42")

文字列操作を使用して長い乗算を行うことで機能します。変数が文字列である場合もあれば、文字列の反復子である場合もあります。これにより、整数リテラルを使用せずに最初の要素を取得できます。最初の要素が最下位桁になるように、すべてが数字を逆にして保存されます。

機能ごとの説明は次のとおりです。

  • rそして、s機能簿記されています。(rは、のエイリアスreversedであり、逆イテレータを作成し、sイテレータを文字列に変換します。)

  • i39+1=40やのようなケースを含め、文字列の数を1増やします99+1=100

  • bとを追加しますがx、1桁のみにする必要yyあります。x y時間を増分することで機能します。

  • ab、の各桁を呼び出すことにより、両方が複数の桁を持つことができる2つの数値を加算しyます。

  • nとを乗算xしますがyy1桁のみにする必要があります。x自身にy時間を追加することで機能します。

  • oとを乗算xyます。両方の引数に複数の数字を含めることができます。従来の長い乗算を使用します

  • m文字列入力を逆イテレータに変換してに渡しo、結果を逆にして文字列に変換します。


カップルゴルフ:def a(x,y):-> def a(x,y,z=''):次の行を削除します。他の関数の同様のトリック、in def o(x,y):x=s(x)toの変更、x=s(x);l='';z=''forループで、同様に改行+ペースを削除します。代わりにを使用してください;。また、私if h!='0':h+=s(x)\nelse:h+=i(x)は単純にできると思うh+=h!='0'and i(x)or s(x); たぶんh+=(h!='0'and i or s)(x); それ以外の場合は、単にに変更しif'0'!=hます。また、物事が好きdef r(x):return reversed(x)- >r=reversed
ジャスティン・

また、私はのために言及するのを忘れてしまったsms=lambda x:''.join(x)m=lambda x,y:s(r(o(r(x),r(y))))全体の代わりに関数宣言の。私は仕事を知っているだけのもので、これはあなたの521までのバイトがカウントもたらします
ジャスティン・

ああ、もう1つ:forループの場合:for c in'0'+d:\nif c==y:break\nz=a(iter(z),x)-> for c in'0'+d:\nif c!=y:z=a(iter(z),x)ですが、これによりプログラムの速度が大幅に変わる可能性があります。
ジャスティン14年

@Quincunxありがとう!今朝、さらにいくつかの改善点を見ることができます。(関数を定義するのではなく、ほとんどループを入れ子にします。)より競争力のある答えが表示される場合、これらの変更を行います。おそらくそうです。 veはそれについて考えるのに時間がかかりました。
ナサニエル14年

2

JavaScript:3710 3604バイト

  • 1桁の乗算で文字列検索テーブルを使用し、キャリーで加算します。
  • 乗算は、桁x行ではなく桁x digitによって行われます。

ゴルフ:

var M={
'00':'0','01':'0','02':'0','03':'0','04':'0','05':'0','06':'0','07':'0','08':'0','09':'0',
'10':'0','11':'1','12':'2','13':'3','14':'4','15':'5','16':'6','17':'7','18':'8','19':'9',
'20':'0','21':'2','22':'4','23':'6','24':'8','25':'10','26':'12','27':'14','28':'16','29':'18',
'30':'0','31':'3','32':'6','33':'9','34':'12','35':'15','36':'28','37':'21','38':'24','39':'27',
'40':'0','41':'4','42':'8','43':'12','44':'16','45':'20','46':'24','47':'28','48':'32','49':'36',
'50':'0','51':'5','52':'10','53':'15','54':'20','55':'25','56':'30','57':'35','58':'40','59':'45',
'60':'0','61':'6','62':'12','63':'18','64':'24','65':'30','66':'36','67':'42','68':'48','69':'54',
'70':'0','71':'7','72':'14','73':'21','74':'28','75':'35','76':'42','77':'49','78':'56','79':'63',
'80':'0','81':'8','82':'16','83':'24','84':'32','85':'40','86':'48','87':'56','88':'64','89':'72',
'90':'0','91':'9','92':'18','93':'27','94':'36','95':'45','96':'54','97':'63','98':'72','99':'81'
};
var A={
'000':'0','001':'1','002':'2','003':'3','004':'4','005':'5','006':'6','007':'7','008':'8','009':'9',
'010':'1','011':'2','012':'3','013':'4','014':'5','015':'6','016':'7','017':'8','018':'9','019':'10',
'020':'2','021':'3','022':'4','023':'5','024':'6','025':'7','026':'8','027':'9','028':'10','029':'11',
'030':'3','031':'4','032':'5','033':'6','034':'7','035':'8','036':'9','037':'10','038':'11','039':'12',
'040':'4','041':'5','042':'6','043':'7','044':'8','045':'9','046':'10','047':'11','048':'12','049':'13',
'050':'5','051':'6','052':'7','053':'8','054':'9','055':'10','056':'11','057':'12','058':'13','059':'14',
'060':'6','061':'7','062':'8','063':'9','064':'10','065':'11','066':'12','067':'13','068':'14','069':'15',
'070':'7','071':'8','072':'9','073':'10','074':'11','075':'12','076':'13','077':'14','078':'15','079':'16',
'080':'8','081':'9','082':'10','083':'11','084':'12','085':'13','086':'14','087':'15','088':'16','089':'17',
'090':'9','091':'10','092':'11','093':'12','094':'13','095':'14','096':'15','097':'16','098':'17','099':'18',
'100':'1','101':'2','102':'3','103':'4','104':'5','105':'6','106':'7','107':'8','108':'9','109':'10',
'110':'2','111':'3','112':'4','113':'5','114':'6','115':'7','116':'8','117':'9','118':'10','119':'11',
'120':'3','121':'4','122':'5','123':'6','124':'7','125':'8','126':'9','127':'10','128':'11','129':'12',
'130':'4','131':'5','132':'6','133':'7','134':'8','135':'9','136':'10','137':'11','138':'12','139':'13',
'140':'5','141':'6','142':'7','143':'8','144':'9','145':'10','146':'11','147':'12','148':'13','149':'14',
'150':'6','151':'7','152':'8','153':'9','154':'10','155':'11','156':'12','157':'13','158':'14','159':'15',
'160':'7','161':'8','162':'9','163':'10','164':'11','165':'12','166':'13','167':'14','168':'15','169':'16',
'170':'8','171':'9','172':'10','173':'11','174':'12','175':'13','176':'14','177':'15','178':'16','179':'17',
'180':'9','181':'10','182':'11','183':'12','184':'13','185':'14','186':'15','187':'16','188':'17','189':'18',
'190':'10','191':'11','192':'12','193':'13','194':'14','195':'15','196':'16','197':'17','198':'18','199':'19'
} 
Array.prototype.e=function(){return(''+this)==='';}
String.prototype.s=function(){return this.split('').reverse();}
function B(a,b,c) {
var r='',s='';
a=a.s();
b=b.s();
while (!a.e()||!b.e()||c!=='0') {
x=a.e()?'0':a.shift();
y=b.e()?'0':b.shift();
s=A[c+x+y];
s=s.s();
r=s.shift()+r;
c=s.e()?'0':'1';
}
return r;
}
function m(a,b) {
var s='0',m='';
b.split('').reverse().forEach(function(e){
var z=m;
a.split('').reverse().forEach(function(f){s=B(s,M[e+f]+z,'0');z+='0';});
m+='0';
});
return s;
}

テストを行っていない:

var mul = {
'00':'0','01':'0','02':'0','03':'0','04':'0','05':'0','06':'0','07':'0','08':'0','09':'0',
'10':'0','11':'1','12':'2','13':'3','14':'4','15':'5','16':'6','17':'7','18':'8','19':'9',
'20':'0','21':'2','22':'4','23':'6','24':'8','25':'10','26':'12','27':'14','28':'16','29':'18',
'30':'0','31':'3','32':'6','33':'9','34':'12','35':'15','36':'28','37':'21','38':'24','39':'27',
'40':'0','41':'4','42':'8','43':'12','44':'16','45':'20','46':'24','47':'28','48':'32','49':'36',
'50':'0','51':'5','52':'10','53':'15','54':'20','55':'25','56':'30','57':'35','58':'40','59':'45',
'60':'0','61':'6','62':'12','63':'18','64':'24','65':'30','66':'36','67':'42','68':'48','69':'54',
'70':'0','71':'7','72':'14','73':'21','74':'28','75':'35','76':'42','77':'49','78':'56','79':'63',
'80':'0','81':'8','82':'16','83':'24','84':'32','85':'40','86':'48','87':'56','88':'64','89':'72',
'90':'0','91':'9','92':'18','93':'27','94':'36','95':'45','96':'54','97':'63','98':'72','99':'81'
};

var adc = {
'000':'0','001':'1','002':'2','003':'3','004':'4','005':'5','006':'6','007':'7','008':'8','009':'9',
'010':'1','011':'2','012':'3','013':'4','014':'5','015':'6','016':'7','017':'8','018':'9','019':'10',
'020':'2','021':'3','022':'4','023':'5','024':'6','025':'7','026':'8','027':'9','028':'10','029':'11',
'030':'3','031':'4','032':'5','033':'6','034':'7','035':'8','036':'9','037':'10','038':'11','039':'12',
'040':'4','041':'5','042':'6','043':'7','044':'8','045':'9','046':'10','047':'11','048':'12','049':'13',
'050':'5','051':'6','052':'7','053':'8','054':'9','055':'10','056':'11','057':'12','058':'13','059':'14',
'060':'6','061':'7','062':'8','063':'9','064':'10','065':'11','066':'12','067':'13','068':'14','069':'15',
'070':'7','071':'8','072':'9','073':'10','074':'11','075':'12','076':'13','077':'14','078':'15','079':'16',
'080':'8','081':'9','082':'10','083':'11','084':'12','085':'13','086':'14','087':'15','088':'16','089':'17',
'090':'9','091':'10','092':'11','093':'12','094':'13','095':'14','096':'15','097':'16','098':'17','099':'18',
'100':'1','101':'2','102':'3','103':'4','104':'5','105':'6','106':'7','107':'8','108':'9','109':'10',
'110':'2','111':'3','112':'4','113':'5','114':'6','115':'7','116':'8','117':'9','118':'10','119':'11',
'120':'3','121':'4','122':'5','123':'6','124':'7','125':'8','126':'9','127':'10','128':'11','129':'12',
'130':'4','131':'5','132':'6','133':'7','134':'8','135':'9','136':'10','137':'11','138':'12','139':'13',
'140':'5','141':'6','142':'7','143':'8','144':'9','145':'10','146':'11','147':'12','148':'13','149':'14',
'150':'6','151':'7','152':'8','153':'9','154':'10','155':'11','156':'12','157':'13','158':'14','159':'15',
'160':'7','161':'8','162':'9','163':'10','164':'11','165':'12','166':'13','167':'14','168':'15','169':'16',
'170':'8','171':'9','172':'10','173':'11','174':'12','175':'13','176':'14','177':'15','178':'16','179':'17',
'180':'9','181':'10','182':'11','183':'12','184':'13','185':'14','186':'15','187':'16','188':'17','189':'18',
'190':'10','191':'11','192':'12','193':'13','194':'14','195':'15','196':'16','197':'17','198':'18','199':'19'
} 

Array.prototype.isEmpty = function() {
  return (''+this) === '';
}

function add(a, b, c) {
  var r = '', s = '';
  a = a.split("").reverse();
  b = b.split("").reverse();
  while (!a.isEmpty() || !b.isEmpty() || c !== '0') {
    x = a.isEmpty() ? '0' : a.shift();
    y = b.isEmpty() ? '0' : b.shift();
    s = adc[c + x + y];
    s = s.split("").reverse();
    r = (s.shift()) + r;
    c = (s.isEmpty()) ? '0' : '1';
  }
  return r;
}

function mult(a, b) {
  var s = '0';
  var m = '';
  b.split('').reverse().forEach(function(e) {
    var z = m;
    a.split('').reverse().forEach(function(f) {
      s = add(s, mul[e + f] + z, '0');
      z = z + '0';
    });
    m = m + '0';
  } );
  return s;
}

function test(a, b) {
  var t0 = (new Date()).getTime();
  var r = mult(a,b);
  var t1 = (new Date()).getTime();
  var e = t1 - t0;
  console.log('mult ' + a + ' * ' + b + ' = ' + r + " (" + e + " ms)");
}

test('12345', '42');
test('9999999999', '9999999999');

この出力:

mult 12345 * 42 = 518490 (3 ms) 
mult 9999999999 * 9999999999 = 99999999980000000001 (47 ms) 

2

ハスケル507 496

これは、任意の大きな整数に対して機能します。0〜18の自然数(2桁の合計に等しい最大自然数)のカスタム表現を定義し、数字+数の加算で定義するdigit * numberの乗算でリトルエンディアンの乗算を定義します。 、数字と数字の加算の観点から定義します。10-18の値をデジタル分解に展開するリダクション機能があります。次に、2つの文字列を読み取って反転し、カスタムバインディングに変換し、乗算し、逆に変換して、正しい結果を得るために反転します。

編集2

複数回使用する複数文字コマンドの短いローカルエイリアスを作成し、スペースと括弧を削除して、可能であれば(- )ペアを置き換えることにより、いくつかの文字を保存しました$

data S=Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R deriving(Enum, Ord, Eq)
p Z=id
p x=succ.p(pred x)
s Z=id
s x=pred.s(pred x)
z=s J
r[]=[]
r(x:y)|x<J=x:r y
r(x:[])=z x:[A]
r(x:y)=z x:(r$p A a:b)where(a:b)=r y
a x y=r$w(r x)(r y)
m Z _=[]
m _[]=[]
m x y=r$a y(m(pred x)y)
t[]_=[Z]
t _[]=[Z]
t(x:z)y=r$a(m x y)(Z:r(t z y))
i '0'=Z
i x=succ.i.pred$x
b Z='0'
b x=succ.b.pred$x
w[]y=y
w x[]=x
w(x:c)(y:d)=p x y:(w c d)
o=map
v=reverse
f=(o i).v
g=v.o b
main=getLine>>=putStrLn.(\[x,y]->g$t(f x)(f y)).words

参考のため、S、カスタム整数のようなデータ型である、p「プラス」(数字+桁の添加)であり、s(還元用)減算は、r(デジタル分解に展開)低減され、aまた(数+数の加算)で、mあります乗算(数字*数値の乗算)は、t回数(数値*数値の乗算)、i「解釈」(文字列をのリストに変換S)、b「戻る」(Sの文字列へのリスト)、およびfとgはゴルフの短縮目的。暗黙的にでも数字を使用しませんでした。私が得た最も近いものは、自然数の加算や乗算よりもはるかに高いレベルの数学的概念である後継者と先行者を使用することでした。

編集

時間プロファイルを含めるのを忘れました。

> time echo "9999999999 9999999999" | runhaskell multnonum.hs
99999999980000000001

real    0m0.246s
user    0m0.228s
sys     0m0.012s

ちょうど良い尺度:

> time echo "99999999980000000001 99999999980000000001" | runhaskell multnonum.hs
9999999996000000000599999999960000000001

real    0m0.244s
user    0m0.224s
sys     0m0.016s

狂っちゃおう!

> time echo "9999999996000000000599999999960000000001 9999999996000000000599999999960000000001" | runhaskell multnonum.hs
99999999920000000027999999994400000000699999999944000000002799999999920000000001

real    0m0.433s
user    0m0.424s
sys     0m0.004s

確認


1

Python 2-1165、712、668 664

I,T,V,N,X,J=raw_input,dict,reversed,None,zip,''.join
D='0123456789'
z,o='01'
A,B=I(),I()
r=i=""
K=map(J,X('666622222222911111551111555884444447773333333','678945672389954132987698765898967457989837654'))
P=T(X(K,map(J,X('344501110011800000440000332673322124652202211','628480244668154132507698505422648609367491852'))))
S=T(X(K,'cdef678945abi65243ed87a9cbaghcdab89egfcb6a987'))
for d in D:P[z+d]=z;S[z+d]=d
def Z(A,B,R=r):
 for a,b in V(map(N,V(z+A),V(z+B))):c=(a or z)+(b or z);s=S[min(c)+max(c)];R=Z(R,o)+T(X('abcdefghi',D))[s]if s>"?"else R+s
 return R
for a in V(A):
 j=""
 for b in V(B):r=Z(r,P[min(a+b)+max(a+b)]+i+j).lstrip(z);j+=z
 i+=z
print r if r else z

Z = [X, Y][N == "0"]これは数値インデックスにキャストされたブール値として解釈される可能性があるため、論理インデックスを使用していないことに注意してください。

ゴルフをしていない:

A = raw_input()
B = raw_input()

P = {'00':'00','01':'00','02':'00','03':'00','04':'00','05':'00','06':'00','07':'00','08':'00','09':'00',
     '10':'00','11':'01','12':'02','13':'03','14':'04','15':'05','16':'06','17':'07','18':'08','19':'09',
     '20':'00','21':'02','22':'04','23':'06','24':'08','25':'10','26':'12','27':'14','28':'16','29':'18',
     '30':'00','31':'03','32':'06','33':'09','34':'12','35':'15','36':'28','37':'21','38':'24','39':'27',
     '40':'00','41':'04','42':'08','43':'12','44':'16','45':'20','46':'24','47':'28','48':'32','49':'36',
     '50':'00','51':'05','52':'10','53':'15','54':'20','55':'25','56':'30','57':'35','58':'40','59':'45',
     '60':'00','61':'06','62':'12','63':'18','64':'24','65':'30','66':'36','67':'42','68':'48','69':'54',
     '70':'00','71':'07','72':'14','73':'21','74':'28','75':'35','76':'42','77':'49','78':'56','79':'63',
     '80':'00','81':'08','82':'16','83':'24','84':'32','85':'40','86':'48','87':'56','88':'64','89':'72',
     '90':'00','91':'09','92':'18','93':'27','94':'36','95':'45','96':'54','97':'63','98':'72','99':'81',
     }
S = {'00':'0','01':'1','02':'2','03':'3','04':'4','05':'5','06':'6','07':'7','08':'8','09':'9',
     '10':'1','11':'2','12':'3','13':'4','14':'5','15':'6','16':'7','17':'8','18':'9','19':'a',
     '20':'2','21':'3','22':'4','23':'5','24':'6','25':'7','26':'8','27':'9','28':'a','29':'b',
     '30':'3','31':'4','32':'5','33':'6','34':'7','35':'8','36':'9','37':'a','38':'b','39':'c',
     '40':'4','41':'5','42':'6','43':'7','44':'8','45':'9','46':'a','47':'b','48':'c','49':'d',
     '50':'5','51':'6','52':'7','53':'8','54':'9','55':'a','56':'b','57':'c','58':'d','59':'e',
     '60':'6','61':'7','62':'8','63':'9','64':'a','65':'b','66':'c','67':'d','68':'e','69':'f',
     '70':'7','71':'8','72':'9','73':'a','74':'b','75':'c','76':'d','77':'e','78':'f','79':'g',
     '80':'8','81':'9','82':'a','83':'b','84':'c','85':'d','86':'e','87':'f','88':'g','89':'h',
     '90':'9','91':'a','92':'b','93':'c','94':'d','95':'e','96':'f','97':'g','98':'h','99':'i',
     }
L = {'a':'0','b':'1','c':'2','d':'3','e':'4','f':'5','g':'6','h':'7','i':'8'}

def strSum(A, B):
    R = ""
    for a, b in reversed(map(None, reversed("0" + A), reversed("0" + B))):
        if a == None: a = '0'
        if b == None: b = '0'
        s = S[a + b]
        if s.isdigit():
            R += s
        else:
            R = strSum(R, "1") + L[s]
    return R

i = ""
r = "0"
for a in reversed(A):
    j = ""
    for b in reversed(B):
        p = P[a + b] + i + j
        r = strSum(r, p)
        j += "0"
    i += "0"

r = r.lstrip("0")
if r == "":
    r = "0"

print r

min()およびmax()関数を使用することは、実際の整数値を比較しているため許可されていないのではないでしょうか?
WorldSEnder 14年

@WorldSEnder:キャラクターを比較していると思いますが、これはこのチャレンジで許可されています。(「charsの辞書編集の比較が許可されています。」)
ファルコ14年

1

Scala、470文字

(これらは標準のscalaですが、=>バイトをカウントしている場合は同等に置き換えることができます)

def p(a: String,b: String)={type D=List[Char]
val d="0123456789".toList
def v(s: String)=s.toList.map{c⇒d.takeWhile(c.!=)}
def u(l:D, a:D):(Char,D)=l match {
case _::_::_::_::_::_::_::_::_::_::m⇒u(m,'a'::a)
case _⇒(('a'::l).zip(d).last._2,a)}
val o=(("", List[Char]())/:v(a).tails.toList.init.map{l⇒(v(b) map {_.flatMap(_⇒l.head)})++l.tail.map(_⇒Nil) reverse}.reduce(_.zipAll(_, Nil, Nil).map{t⇒t._1++t._2}))({(t,e)⇒val s=u(t._2++e,Nil);(s._1+t._1,s._2)})
u(o._2, Nil)._1+o._1}

ここでは、リストの長さを使用して数字をエミュレートしています。数値演算を使用しないように注意してください-折りたたみ、マップ、zipなどのみを使用してください。数字はこれらの数字のリストです(計算の途中で戦略的に順序が逆になります)。個々の数字を乗算しますflatMapし、行しreduceます。uキャリーを計算し(10個を超える要素のリストと直接照合し、再帰することにより)、数字を文字に戻す処理を行い、aを使用/:してスタックを処理します。必要な例は、1秒未満で完了します。

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