Reverse decimal number

preparation
javascript

#1

Здравейте,
Тотално забих с тази задача. Пробвах 2 различни решения :
https://jsfiddle.net/n_koev/pv0yzr8n/
https://jsfiddle.net/n_koev/x2tns3rw/2/
И в двата случая получавам 8/10, последните два теста не минават. И двата са с много дълги десетични дроби (над 16 цифри) и съответно според това, което изчетох губят прецизност.
Някой може ли да даде идеи?


#2

Здравей, n_koev,
Мисля, че няма нужда входните данни изобщо да се интерпретират като число с плаваща запетая, а направо като стринг. Само трябва да се обърне внимание на случая, когато входният стринг завършва с една или повече нули.
Поздрави,
Иван


#3

Благодаря за отговора, но в условието изрично е записано че входните данни са под формата на десетично число и незнам как бих могъл да ги интерпретирам директно като стринг. Ако имаш предвид да ползвам gets() вместо +gets() - не става.
Нулите в края не би трябвало да са проблем защото оговора се връща като стринг, а не като число.


#4

Здравей отново,
Второто решение, коетo си предложил, минава всички тестове, ако вместо с +gets() входът се чете с gets(), което прави излишно и викането на toString(). Преди малко го проверих - върви, както казваш, без никакво премахване на нулите в края на числото.
Съжалявам, че може би те подведох в това отношение. Но това просто означава, че тестовете, които се пoдават на решението не включват числа от рода на 1200. Според мене в този случай би трябвало да се изведе като резултат 21, а не 0021, което не е валиден десетичен запис на число. Вече опитно установен факт е, че със или без премахване на нулите в края на числото, тестовете минават. Направихме нещо като known-plaintext attack на Judge. :slight_smile:

P.S. Възможно е да не говорим за една и съща задача. Тази, която аз пробвах, беше: https://judge.telerikacademy.com/problem/07reversenumber

P.P.S. Относно четенето на входни данни в случая на JavaScript, тази страница https://judge.telerikacademy.com/usage/js/ подсказва част от това, което се случва зад кулисите. Нека тези, които са вещи в JavaScript, да ме поправят, но това, което разбирам от кода в секцията Testing locally, e, че магическата дума +gets() е просто аритметичният оператор унарен плюс (както напр. в израза +2), приложен към резултата от извикването на gets(). Съгласно MDN docs: Arithmetic operators/Unary plus, това, което този оператор прави, когато аргументът му е стринг, е да превърне този аргумент в число и да върне полученото число, като резултат. Така че входните данни, които се подават на програмите, написани на JavaScript, винаги са масиви от стрингове, като всеки от тези стрингове представлява един отделен ред от входа. Ако даден ред се състои от едно единствено число под формата на стринг, това число може да се извлече от стринга с оператора +.
Пак съдейки от кода в Testing locally, предполагам, че константата gets, която използвате, е своего рода функция (closure), която помни в себе си масива от входните стрингове, arr, подаден ѝ при стартирането на програмата, и позицията index, указваща от кое място в масива трябва да продължи четенето. При всяко свое извикване, gets би трябвало да връща съответния елемент на масива, премествайки показалеца върху следващия елемент (редове 5-7 от кода).


#5

Уау, много благодаря за цялата информация, беше ми супер полезно.
Иначе си абсолютно прав просто е трябвало вместо +gets() и съответно toString() да въведа данните директно с gets().
Всъщност аз бях пробвал вече този вариант, но сега виждам че в конкретния случай съм бил допуснал друга синтактична грешка заради която резултата е бил IR и съответно съм го отхвърлил като вариант.
Спаси ме от отчаяние :slight_smile: