Подивись мамо! Я створив свою власну систему (число 10)! [зачинено]


21

Ми все це зробили, ну, може, і ні, але створення власної чужорідної мови та системи нумерації є основним елементом особливо фантазійного написання, але в основному це лише розважальне заняття.

Завдання проста, візьміть два входи:

  1. Впорядкований список введення 10 [десяти] унікальних "цифр" (будь-який друкований символ ASCII) та інтерпретувати їх у порядку як значення 0, 1, 2, 3, ..., 9

    + Є винятки з того, що тут може бути числом. Арифметичні оператори (+, -, *, /), дужки та пробіли не можна використовувати як одну з цифр.

  2. Арифметична задача з використанням лише цих "цифр"

І вивести еквівалентне ціле число в заданій формі.

Ось приклад:

INPUT

abcdefghij

bcd + efg + hij
OUTPUT

bdgi

У прикладі списку введення (ви можете вибрати, у якій формі цей список входить) "abcdefghij" відповідає "0123456789" так само, як "hjkloiwdfp" також відповідатиме 1 до 1 "0123456789", де замість "a" асоціюється з нуль, 'h' робить. Арифметика, наступна за "перекладається" на 123 + 456 + 789, що дорівнює 1368. Потім це потрібно вивести у формі, яку ми надали, тому 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 Вау, я довго переглядав цей стек і ніколи про це не знав! Було б, безумовно, корисним, особливо як плакат першого разу (слухач давніх часів), який я є. Запишись у наступний раз! Дякуємо за Ваш коментар та відповідь.
Білл Ш

2
Цікавим варіантом цього може бути те, що підтримує будь-яку базу чисел, залежно від довжини першого рядка на вході ...
Даррел Хоффман

Відповіді:


11

05AB1E , 10 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є вбудований Elixir .

Зауважте, що застаріла версія 05AB1E для цього не працює, оскільки вона побудована в Python. Числа з ведучими 0 не будуть оцінені:
Перегляньте всі тестові випадки у застарілій версії (яка використовує 10-байтну версію, оскільки Åввбудована нова).


8

R , 58 байт

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

Спробуйте в Інтернеті!

Використовує переклад символів chartrдля заміни виразів parses , s та evals, а потім chartrназад до початкових цифр.

Якщо потрібно округлення до найближчого цілого числа, це

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(@)

Розриви рядків призначені лише для читабельності.

Введення здійснюється за допомогою вже існуючої таблиці t з текстовими стовпцями c (символи) та e (рівняння), згідно з нашими правилами вводу- виводу .

Використовує функцію SQL 2017 TRANSLATEдля перемикання між символами та генерування рядка, що містить не тільки рівняння, але і код для переведення назад до початкових символів:

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

Потім цей рядок оцінюється за допомогою EXEC().

Можуть бути деякі символи (наприклад, одна цитата '), які б порушили цей код; Я не перевірив усіх можливих символів ASCII.

Відповідно до виклику, я оцінюю вираз як даний, залежно від того, як моя мова інтерпретує ці оператори. Таким чином, другий тестовий випадок повертає 1 ( w), а не 2 ( e) через ціле ділення.


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♪

Запустіть і налагоджуйте його

Стакс тут не справляється добре, не маючи справжньої інструкції "eval". У документах є такий, який називається "eval", але він працює лише на буквальні значення, а не на повні вирази.


Це може не підпорядковуватися оператору. Не впевнений, чи потрібно це все-таки? staxlang.xyz / ...
Dana

@dana: Гарний момент. Я не вважав цього. Виправлення, ймовірно, обійдеться в кілька байтів, тому я зачекаю деяких роз'яснень, перш ніж спробувати змінити таку поведінку.
рекурсивна

3

Баш, 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"

Може бути менше, якби ми могли усікати, а не круглими. Також складно обробляти провідні нулі (як у тестовому випадку №2), оскільки Bash інтерпретує числа, починаючи з 0, як вісімкові.


Який єдиний консенсус щодо використання таких програм, як "bc" та "tr" для гольфу?
spuck

1
Я не експерт, але я думаю, що такі типи відповідей зазвичай подаються як щось на зразок "bash + coreutils"
Джузеппе

@Giuseppe trє частиною основних елементів, а bcні. Тим не менш, bcце дуже поширений інструмент. Кожна інша команда у цій відповіді - це удар.
rexkogitans

-7 байт, викрадених з відповіді @ CM, зменшивши '0123456789' до '0-9'
spuck

Визначення T вже не є вигідним: $Tлише один байт коротший 0-9, ви використовуєте його лише два рази, і ви витрачаєте 8 байт, щоб визначити його.
руди

2

Бін , 94 90 байт

Гексдумп

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

Пояснення

Ця програма неявно призначає перший і другий рядки введення як рядки змінним aі bвідповідно.

Кожен символ cу рядку bзамінюється відповідним індексом iсимволу, знайденим у рядку a, або самим собою, якщо він не знайдений.

Потім він видаляє кожну послідовність одного або декількох 0s, що передує межі з отриманого рядка. Це не дозволяє 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

Пітон 3 , 137 байт

Не-регулярний підхід, що використовує str.translateта str.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

Мова Вольфрама (Mathematica) , 121 байт

Я визначаю чисту функцію з двома аргументами. Оскільки деякі функції повторюються, я зберігаю їх у змінній, щоб зберегти кілька символів. Цей код просто виконує деякі заміни рядків, а потім використовує ToExpressionдля оцінки виразу ядро ​​Wolfram.

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

Спробуйте в Інтернеті!


0

Луа , 162 151 150 байт

  • -11 байт завдяки моїй ідеї використання loadзамість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. ...це перший (і єдиний) аргумент тут, оскільки ми перебуваємо у функції vaarg (будь-яка loadредакція), яка є нашим поточним символом. Для findігнорування спеціальних символів потрібні наступні аргументи ( 1це лише коротке значення, яке оцінюється як trueпри перетворенні в булевий): вихідне положення (тут одне за замовчуванням) і plainяке фактично вимикає обробку шаблону. Без цієї програми не виходить третій тестовий випадок через %те, що він спеціальний.

Якщо відповідність знайдена, відніміть порядок Lua (і масиви btw) на основі 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))

Ну ... чому взагалі дві пари дужок? Час поговорити про параллель… е-е, багаторазове повернення в Луа. Річ у тому, що одна функція може повернути кілька значень за один виклик (див. Це мета-запитання для отримання додаткових прикладів).

Тут останнє gsubповернуло два значення: відповідь рядок нам потрібна і кількість виконаних замін (наслідок цифр, але кого це цікавить). Якби не внутрішня пара, було б надруковано і рядок, і номер, що накручує нас. Тож тут ми жертвуємо двома байтами, щоб опустити другий результат і нарешті надрукувати продукт цієї фабрики божевілля.


Що ж, мені сподобалося пояснювати майже так само, як гольф в першу чергу, сподіваюся, що ви тут зрозуміли, що відбувається.


Примітка: він проходить усі тестові корпуси, але, ймовірно, округляє неправильно в інших. Якщо ви можете знайти його, я збираюся це виправити.
Вал каже Відновити Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.