はるすえすしーのぶろぐ

ブログのないようがないよう

【Julia】ABC198-D "Send More Money"

問題ページ - ACコード

制約きっっっっっっっっつ…20敗 f:id:halss:20210509231225p:plain

解き方(簡単なやつ)

まず覆面算に使われているアルファベットがいくつあるかカウントし、10個より多かったらUNSOLVABLEと出力。
次にDFSで各アルファベットにどの数字を割り当てるか探索しチェック、見つかったらそれを変換して終了。 詳しいやり方ははまやんさんのユーザ解説を読むといいと思う。

普通に書いてみる

 _____ _     _____
|_   _| |   | ____|
  | | | |   |  _|
  | | | |___| |___
  |_| |_____|_____| 残念!

考えたこと

  • 型注釈をとりあえず全部のローカル変数につける
  • 関数の引数をできるだけ減らす
  • 辞書を配列に書き換える
  • 時間計測して4.5secくらいかかってたらその時点でUNSOLVABLEする→失敗
  • for文の順番を1:10から10:-1:1に変更する→失敗
  • よくアクセスするインデックスを変数に保存しておく
  • ソースコード内でかわいくお願い♡する→成功?
  • 人力ループアンローリングする→成功
  • 成立しないときは早めに枝刈りする

おわりに

数か月ぶりに競プロしたら異次元になっててつらかった ペナ記録最多更新したかもしれん アスキーコードはLinuxにfiglet入れてやりました

ACコード

#        _                          _    ____   _
#  _ __ | | ___  __ _ ___  ___     / \  / ___| | |
# | '_ \| |/ _ \/ _` / __|/ _ \   / _ \| |     | |
# | |_) | |  __/ (_| \__ \  __/  / ___ \ |___  |_|
# | .__/|_|\___|\__,_|___/\___| /_/   \_\____| (_)
# |_|

# ----------solution----------
function main()
    s1,s2,s3=input(),input(),input()
    s11,s21,s31=s1[1],s2[1],s3[1]
    d::Vector{Char}=fill(' ',26)
    used::Vector{Char}=fill(' ',10)
    chara::Vector{Char}=sort(unique(s1*s2*s3))
    l::Int=length(chara)
    if l>10
        println("UNSOLVABLE")
        return
    end
    function check()
        # for i=10:-1:1
        #  used[i]!=' ' && (d[used[i]-'a'+1]='0'+i-1)
        # end
        if used[1]!=' '
            d[used[1]-'a'+1]='0'
        end
        if used[2]!=' '
            d[used[2]-'a'+1]='1'
        end
        if used[3]!=' '
            d[used[3]-'a'+1]='2'
        end
        if used[4]!=' '
            d[used[4]-'a'+1]='3'
        end
        if used[5]!=' '
            d[used[5]-'a'+1]='4'
        end
        if used[6]!=' '
            d[used[6]-'a'+1]='5'
        end
        if used[7]!=' '
            d[used[7]-'a'+1]='6'
        end
        if used[8]!=' '
            d[used[8]-'a'+1]='7'
        end
        if used[9]!=' '
            d[used[9]-'a'+1]='8'
        end
        if used[10]!=' '
            d[used[10]-'a'+1]='9'
        end
        if d[s11-'a'+1]=='0' || d[s21-'a'+1]=='0' || d[s31-'a'+1]=='0'
            return false
        end
        i1::Int=int(join([d[i-'a'+1] for i=s1]))
        i2::Int=int(join([d[i-'a'+1] for i=s2]))
        i3::Int=int(join([d[i-'a'+1] for i=s3]))
        if i1+i2!=i3 || iszero(i1) || iszero(i2) || iszero(i3)
            return false
        end
        println(i1)
        println(i2)
        println(i3)
        return true
    end
    function dfs(n::Int)
        if n==l+1
            return check()
        end
        for i=10:-1:1
            if used[i]==' '
                used[i]=chara[n]
                if dfs(n+1)
                    return true
                end
                used[i]=' '
            end
        end
        return false
    end
    if !dfs(1)
        println("UNSOLVABLE")
    end
end

# --------input func----------
lines=readlines()
input()=popfirst!(lines)
int(s::AbstractString)=parse(Int,s)
ints(s::AbstractString)=map(x->parse(Int,x),split(s))
ints(s::AbstractString,sp)=map(x->parse(Int,x),split(s,sp))
main()

f:id:halss:20210302234341p:plain
これは唐突なJuliaねこ