ママ見て!私は自分の(Base 10)数字システムを作りました![閉まっている]


21

たぶん、そうではないかもしれませんが、独自の外国語と番号付けシステムを作成することは、特に空想的な執筆の主流ですが、ほとんどの場合は楽しいアクティビティです。

タスクは簡単で、2つの入力を取ります。

  1. 10 [10]個の一意の「数字」(印刷可能なASCII文字)の順序付きリスト入力で、値0、1、2、3、...、9として順番に解釈します

    +ここで数字にできるものには例外があります。算術演算子(+、-、*、/)、括弧、およびスペースは数字の1つとして使用できません。

  2. それらの「数字」のみを使用した算術問題

そして、与えられた形式で同等の整数結果を出力します。

以下に例を示します。

INPUT

abcdefghij

bcd + efg + hij
OUTPUT

bdgi

この例では、「abcdefghij」の入力リスト(リストの入力形式を選択できます)は「0123456789」に対応します。これは、「hjkloiwdfp」も「a」ではなく「aゼロ、「h」は。'translate'に続く算術は1368に等しい123 + 456 + 789に変換されます。これは指定した形式で出力する必要があるため、b(1を表す)d(2の場合)g(6の場合)およびi( 8)。

テストケース

abcdefghij
abc + def - ghij

-gedc
qwertyuiop
qwerty / uiop

e
%y83l;[=9|
(83l * 9) + 8%

y9|8

より多くのルール

  • 標準的な抜け穴 は禁止されています!
  • これはコードゴルフであるため、バイト単位の最短回答が優先されます。
  • 最適な形式の入力と出力を受け取る完全なプログラムまたは関数でなければなりません。(入力に追加情報を追加することはできません。「数字」と式だけを追加できます。
  • 任意の言語を使用します(他のルールに準拠している限り)

9
2番目のテストケースは、最終出力が丸められることを示唆していますq.ioiopewioyetqorw...。そうでない場合、結果はになります。その場合、どのような丸めを適用する必要がありますか?
アーナルド

2
@ SriotchilismO'Zaicのポイントに追加するために、あなたと私たちの利益のためのサンドボックスもあります。その目的は、投稿される前にコミュニティが課題を改善できるようにすることです。しかし、挑戦のための素晴らしいアイデア!
ジュゼッペ

3
異なる言語は同じ方程式を異なる方法で評価する可能性が高く、それを回避する方法があるかどうかはわかりません。たとえば、T-SQLは1、整数の除算(丸めではない)のために5/3、ではなくを返します2。これはチャレンジを無効にするものではありませんが、同じテストケースに対して異なる許容可能な回答を許可する必要がある場合があります(以下のT-SQLの回答を参照)。
BradC

2
@Giuseppeうわー、私は長い間このスタックを閲覧しましたが、それを知らなかったのです!特に私が初めてのポスター(長年のリスナー)として、間違いなく役に立ちました。次回のために注意してください!コメントと回答をありがとう。
ビルW

2
この上の興味深い変化が...入力の最初の文字列の長さに応じて、任意の数のベースをサポートするものだろう
ダレル・ホフマン

回答:


11

05AB1E10 9 バイト

žh‡.Eò¹Åв

(現在)文字のリストとして出力します。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

          # Transliterate the second (implicit) input, replacing every character of 
           # the first (implicit) input with:
žh         # The builtin "0123456789"
   .E      # Then evaluate it as Elixir code
     ò     # Round it to the nearest integer
      ¹Åв  # And change it back by using a custom base-conversion with the first input as
           # base (which results in a character list)
           # (after which that result is output implicitly)

05AB1Eの新しいバージョンは、Elixirでビルドされます。.E機能が呼び出されますcall_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a)場合は、Code.eval_stringエリクシール組み込みです

05AB1EのレガシーバージョンはPythonでビルドされているため、これでは動作しません。先頭に0が付いた数字は評価されません。
レガシーバージョンÅв組み込みが新しいため10バイトバージョンを使用)のすべてのテストケースを参照してください


8

R、58バイト

function(d,s,`[`=chartr)'0-9'[d,eval(parse(t=d['0-9',s]))]

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

文字変換chartrを使用して数字を交換し、式をparsesおよびevalsしchartrてから、sを元の数字に戻します。

最も近い整数への丸めが必要な場合、これは

R、65バイト

function(d,s,`[`=chartr)'0-9'[d,round(eval(parse(t=d['0-9',s])))]

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


[3つのパラメーターを持つ関数の短い名前として使用するのは非常に賢明です。よくやった。
ロビンライダー

6

T-SQL、117バイト

DECLARE @ CHAR(99)
SELECT @='SELECT TRANSLATE('+TRANSLATE(e,c,'0123456789')+',''0123456789'','''+c+''')'FROM t
EXEC(@)

改行は読みやすくするためのものです。

入力は、IOルールに従って、テキスト列c(文字)およびe(式)を持つ既存のテーブルtを介して行われます

SQL 2017関数TRANSLATEを使用して文字を切り替え、方程式だけでなく元の文字に変換するコードを含む文字列を生成します。

SELECT TRANSLATE(123 + 456 + 789,'0123456789','abcdefghij') 

次に、この文字列はを使用して評価されEXEC()ます。

'このコードを壊すような文字(一重引用符など)がある場合があります。可能なすべてのASCII文字をテストしたわけではありません。

課題ごとに、私は自分の言語がそれらの演算子をどのように解釈するかに従って、与えられた式を評価しています。そのため、2番目のテストケースでは、整数の除算により、w2(e)ではなく1()が返されます。


4

Perl 6、38バイト

{*.trans($_=>^10).EVAL.trans(^10=>$_)}

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

丸めがどのように機能するかはわかりません。それが最後に丸めた場合、私は追加することができます.roundのために6バイト。の動作/が異なる場合は、より長くなる可能性があります。のような入力をカリー化しf(arithmetic)(numerals)(arithmetic)ます。

説明:

{                                    }  # Anonymous codeblock
 *                                      # Returning a whatever lambda
  .trans($_=>^10)       # That translates the numerals to digits
                 .EVAL  # Evaluates the result as code
                      .trans(^10=>$_)   # And translates it back again

3

スタックス74 66 65 バイト

┼ö8Q#xóπcM~oÖ÷╦├mî☼yº─▐4ç≥e╘o▄ê‼ø_k╜ø8%N╫ ╗e<.╗P[─╛èA±!xêj«w╠°{B♪

実行してデバッグする

Staxはここではうまく機能せず、真の「評価」命令がありません。ドキュメントでは「eval」と呼ばれるものがありますが、完全な式ではなくリテラル値でのみ機能します。


これは、オペレーターの予測に従わない場合があります。しかし、それが必要かどうかわかりませんか? staxlang.xyz/...
ダナ

@ダナ:良い点。私はそれを考慮しませんでした。修正には数バイトかかる可能性が高いため、その動作を変更する前に、いくつかの明確化を待ちます。
再帰的な

3

Bash、97バイト

IFS=''
read S
read O
A=`echo "$O"|tr "$S" 0-9`
printf %0.f `bc<<<"(${A[@]##0})+0.5"`|tr 0-9 "$S"

丸めるのではなく、切り捨てることができれば、より少ない可能性があります。また、Bashは0で始まる数値を8進数として解釈するため、先行ゼロ(テストケース#2のように)を処理するのも困難です。


ゴルフに「bc」や「tr」などのユーティリティを使用することについてのコンセンサスは何ですか?
spuck

1
私は専門家ではありませんが、これらのタイプの回答は通常「bash + coreutils」のようなものとして提出されると思います
ジュゼッペ

@Giuseppe trはcoreutilsの一部ですが、そうでbcはありません。それにもかかわらず、bc非常に一般的なツールです。この回答の他のコマンドはすべてbashです。
rexkogitans

@CM

Tを定義することはもはや有利ではありません:$Tは1バイトだけ短く、0-92回しか使用せず、8バイトを費やして定義します。
ruds

2

Bean94 90バイト

Hexdump

00000000: 53d0 80d6 d800 d3d0 80a0 1f20 8047 53a0  SÐ.ÖØ.ÓÐ. . .GS 
00000010: 1753 d080 d3d0 80a0 5e20 800a a181 8100  .SÐ.ÓÐ. ^ ..¡...
00000020: 40a0 5f52 cac3 4da0 6580 53d0 80a0 5d20  @ _RÊÃM e.SÐ. ] 
00000030: 8089 205f a065 205f 2080 0aa1 8181 0123  .. _ e _ ..¡...#
00000040: 0058 0020 800a a181 8102 40a0 6550 84a0  .X. ..¡...@ eP. 
00000050: 5d20 652e dce2 b02b dc64                 ] e.Üâ°+Üd

JavaScript

`${Math.round(
  eval(
    b.replace(
      /./g,
      c => ~(i = a.indexOf(c)) ? i : c
    ).replace(
      /\b0+/g,
      ''
    )
  )
)}`.replace(
  /\d/g,
  i => a[i]
)

説明

このプログラムは、入力の最初の行と2番目の行をabそれぞれ文字列として変数およびに暗黙的に割り当てます。

c行の各文字は、行bi見つかった文字の対応するインデックスa、または見つからない場合はそれ自体で置き換えられます。

次に0、結果の文字列から、境界が先行する1つ以上のsの各シーケンスを削除します。これは、8進リテラルとしてeval()始まる数字のシーケンスを評価しないようにするため0です。

eval()Math.round()、結果は文字列に戻って強制され、各桁の文字がiラインから対応する文字に置き換えられaたインデックス位置i

テストケース

デモ

abcdefghij
abcd + efg + hij

bdgi

デモ

abcdefghij
abc + def - ghij

-gedc

デモ

qwertyuiop
qwerty / uiop

e

デモ

%y83l;[=9|
(83l * 9) + 8%

y9|8



1

、14バイト

⍘UV⭆η⎇№θι⌕θιιθ

オンラインでお試しください!リンクは、コードの詳細バージョンです。注:式はPython 3のセマンティクスに従って評価されるため、たとえば、ゼロ以外の数値の先行ゼロは無効です。説明:

   ⭆η           Map over expression's characters and join
        ι       Current character
      №θ        Count matches in first input
     ⎇          If non-zero
         ⌕θι    Replace with position in first input
            ι   Otherwise keep character unchanged
 UV             Evaluate as Python 3
⍘            θ  Convert to base using first input as digits

残念ながら、主要な0sは、テストケースに存在するPythonでは動作しません。
ジョナサンアラン

0

Python 3、137バイト

文字を使用str.translatestr.maketransて文字を置換する非正規表現アプローチ。先行ゼロのトリミングで多くのキャラクターを失いました...

lambda s,t,d='0123456789',e=str.translate,m=str.maketrans:e(str(round(eval(' '.join(c.lstrip('0')for c in e(t,m(s,d)).split())))),m(d,s))

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



0

Wolfram言語(Mathematica)、121バイト

2つの引数を持つ純粋な関数を定義します。いくつかの機能が繰り返されるので、変数に保存していくつかの文字を保存します。このコードは単に文字列の置換をToExpression行い、Wolframカーネルで式を評価するために使用します。

(r=Thread[StringPartition[#,1]->(t=ToString)/@Range[0,9]];u[(u=StringReplace)[#2,r]//ToExpression//Round//t,Reverse/@r])&

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


0

Lua162 151150バイト

  • load代わりに使用する私のアイデアのおかげで-11バイトfunction(...) end
  • 改行を省略して-1バイト
l,p=...print(((math.ceil(load('return '..p:gsub('.',load'n=l:find(...,1,1)return n and n-1'))()-0.5)..''):gsub('%d',load'c=...+1 return l:sub(c,c)')))

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

世界で最も短いものではありません(特に巨大なキーワードを使用することで、Luaは空想に苦労します)が、作成するのはとても楽しかったです。入力を引数として受け取り、結果を出力する完全なプログラム。

説明

前書き

l,p=...

引数から変数に値を割り当てます。私たちの辞書はlあり、表現はpです。

次の式は実行の順序が奇妙であるため理解するのが非常に難しいので、ステップごとに説明します。

通常の数値への変換

p:gsub('.',
load'n=l:find(...,1,1)return n and n-1')

式文字列で置換を実行します。各シンボルを取得し、関数に渡します(loadここでは通常の宣言よりも短いことが証明されています)。

関数はを使用して、渡されたシンボルのdict文字列内の出現位置を見つけfindます。...ここで最初の(そして唯一の)引数loadは、現在のシンボルであるvaarg関数(任意のedのもの)にあるためです。次の引数は、find特別なシンボルを無視するために必要です(ブール値に変換1されたtrueときに評価される短い値です):開始位置(ここでは1つがデフォルトです)およびplainパターン処理を実際に無効にします。これらのプログラムがないと、3番目のテストケースで失敗します。%、特別な。

一致が見つかった場合、Lua文字列(および配列btw)は1から始まるため、1を減算します。一致するものが見つからない場合、何も返されず、置換は行われません。

解く

math.ceil(load('return '..ABOVE)()-0.5)

return式を先頭に追加して結果を返し、Lua関数としてコンパイルして呼び出して計算し、丸めを実行します(これにより逆になり、短くなります)。

最後に、問題の数値解を取得し、それを元に戻すだけです。

再び夢中にさせる

(ABOVE..'')
:gsub('%d',load'c=...+1 return l:sub(c,c)')

最初の行は、数値を文字列に変換するための短い方法です。したがって、文字列メソッドを短い方法で呼び出すことができます。そうしましょう!

今度gsubは、すべてを狂気に戻すために再び呼び出されます。この時間%d.、関数が数値のみを処理する必要.があるため、置換パターンとしてではなく使用されます(負の数値ではエラーになります)。この時間関数(loadバイトを節約するために再度編集)は1、最初の(そして唯一の)変数に最初に追加し、それをdict文字列の位置に変換してから、その位置の文字を返します。

やったー!

劇的なフィナーレ、またはブラケットが重要な理由

print((ABOVE))

まあ…なぜとにかく2組のブラケットですか?パラルについて話をする時が来ました…ええ、ルアでの複数の帰還。1つの関数が1つの呼び出しからほとんど値を返さないことがあるということです(他の例については、このメタの質問を参照してください)。

ここで、最後gsubに2つの値が返されました:必要な応答文字列と実行された置換の量(実際の桁数ですが、気にする人)。内部ペアではない場合、文字列と数字の両方が印刷されてしまい、混乱してしまいます。そこで、ここでは2バイトを犠牲にして2番目の結果を省略し、最終的にこの狂気の工場の製品を印刷します。


まあ、私はゴルフとほぼ同じくらい説明するのを楽しんでいます、ここで何が起こっているのかを願っています。


注:すべてのテストケースに合格しますが、他のテストケースでは誤って丸められる可能性があります。あなたがそれを見つけることができれば、私はそれを修正するつもりです。
valは、モニカを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.