| Task: | Kertoma |
| Sender: | Esinko |
| Submission time: | 2022-11-01 12:09:57 +0200 |
| Language: | Node.js |
| Status: | READY |
| Result: | 0 |
| group | verdict | score |
|---|---|---|
| #1 | TIME LIMIT EXCEEDED | 0 |
| #2 | TIME LIMIT EXCEEDED | 0 |
| #3 | TIME LIMIT EXCEEDED | 0 |
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | TIME LIMIT EXCEEDED | -- | 1, 2, 3 | details |
| #2 | ACCEPTED | 0.13 s | 1, 2, 3 | details |
| #3 | ACCEPTED | 0.12 s | 1, 2, 3 | details |
| #4 | ACCEPTED | 0.12 s | 1, 2, 3 | details |
| #5 | ACCEPTED | 0.13 s | 1, 2, 3 | details |
| #6 | ACCEPTED | 0.12 s | 1, 2, 3 | details |
| #7 | ACCEPTED | 0.12 s | 2, 3 | details |
| #8 | ACCEPTED | 0.12 s | 2, 3 | details |
| #9 | ACCEPTED | 0.12 s | 2, 3 | details |
| #10 | ACCEPTED | 0.12 s | 2, 3 | details |
| #11 | ACCEPTED | 0.21 s | 3 | details |
| #12 | ACCEPTED | 0.30 s | 3 | details |
| #13 | TIME LIMIT EXCEEDED | -- | 3 | details |
| #14 | TIME LIMIT EXCEEDED | -- | 3 | details |
| #15 | WRONG ANSWER | 0.16 s | 3 | details |
| #16 | WRONG ANSWER | 0.16 s | 3 | details |
Code
// Päättele luku x
// Kun saat tietoa kertomasta
const { createInterface } = require("readline")
const interface = createInterface({
input: process.stdin,
terminal: false
})
function findDigits(factorial) {
let count = 0
for (let i = 2; i <= factorial; i++) count += Math.log10(i)
return Math.floor(count) + 1
}
function factorial(number) {
let returnValue = 1n
for (let i = 2n; i <= number; i++) returnValue *= i
return returnValue
}
function getCounts(string) {
let counts = new Array(10).fill(0)
for (const char of string.split("")) {
if (isNaN(parseInt(char))) continue
counts[parseInt(char)] += 1
}
return counts
}
const manualTarget = 100000
const fallbackThreshold = 1
interface.once("line", (line) => {
const expectedCounts = line.split(" ")
.map((val) => parseInt(val))
// Find the expected length of the factorial and find a factorial within a range of lengths with a given precision
const expectedLength = expectedCounts.reduce((a, b) => a + b)
let currentTarget = [1, manualTarget]
let lastTarget = []
while(true) {
// If the min factorial's length is more than the mean of the min-max factorial, add the mean as the min
// and the other way around for if it's larger
if (currentTarget[1] - currentTarget[0] < fallbackThreshold + (currentTarget[1] < 1000 ? 3 : 0)) break
const newTarget = Math.round((currentTarget[1] + currentTarget[0]) / 2)
const testFactorialLength = findDigits(newTarget)
if (testFactorialLength === expectedLength) {
currentTarget[0] = newTarget
break
}
else if (testFactorialLength > expectedLength) currentTarget[1] = newTarget
else currentTarget[0] = newTarget
if (lastTarget === newTarget) break
lastTarget = newTarget
}
if (currentTarget[0] !== currentTarget[1]) {
let lastValue = factorial(BigInt(currentTarget[0]))
let i = BigInt(currentTarget[0])
while (i !== currentTarget[1]) {
const calculatedCounts = getCounts(lastValue.toString())
if (expectedCounts.join("") === calculatedCounts.join("")) {
console.log(i.toString())
break
}
++i
lastValue *= i
}
} else {
console.log(currentTarget[0].toString())
}
process.exit()
})
Test details
Test 1
Group: 1, 2, 3
Verdict: TIME LIMIT EXCEEDED
| input |
|---|
| 0 0 1 0 0 0 0 0 0 0 |
| correct output |
|---|
| 2 |
| user output |
|---|
| (empty) |
Test 2
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| 0 0 0 0 0 0 1 0 0 0 |
| correct output |
|---|
| 3 |
| user output |
|---|
| 3 |
Test 3
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| 0 0 1 0 1 0 0 0 0 0 |
| correct output |
|---|
| 4 |
| user output |
|---|
| 4 |
Test 4
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| 2 0 1 1 0 0 1 0 2 0 |
| correct output |
|---|
| 10 |
| user output |
|---|
| 10 |
Test 5
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| 9 3 1 1 2 2 3 1 6 1 |
| correct output |
|---|
| 27 |
| user output |
|---|
| 27 |
Test 6
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| 10 4 3 4 3 2 2 4 3 7 |
| correct output |
|---|
| 36 |
| user output |
|---|
| 36 |
Test 7
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| 71 53 36 30 25 29 42 24 34 29 |
| correct output |
|---|
| 199 |
| user output |
|---|
| 199 |
Test 8
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| 71 33 46 38 27 45 36 21 35 35 |
| correct output |
|---|
| 205 |
| user output |
|---|
| 205 |
Test 9
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| 93 38 35 26 43 54 38 25 41 34 |
| correct output |
|---|
| 222 |
| user output |
|---|
| 222 |
Test 10
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| 100 33 33 45 36 43 38 54 56 36 |
| correct output |
|---|
| 242 |
| user output |
|---|
| 242 |
Test 11
Group: 3
Verdict: ACCEPTED
| input |
|---|
| 3419 1797 1845 1849 1879 1791 ... |
| correct output |
|---|
| 5959 |
| user output |
|---|
| 5959 |
Test 12
Group: 3
Verdict: ACCEPTED
| input |
|---|
| 4776 2695 2709 2781 2616 2753 ... |
| correct output |
|---|
| 8391 |
| user output |
|---|
| 8391 |
Test 13
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input |
|---|
| 20097 12282 12229 12214 12406 ... |
| correct output |
|---|
| 32001 |
| user output |
|---|
| (empty) |
Test 14
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input |
|---|
| 47934 29918 29878 29713 29984 ... |
| correct output |
|---|
| 71718 |
| user output |
|---|
| (empty) |
Test 15
Group: 3
Verdict: WRONG ANSWER
| input |
|---|
| 84691 54156 54277 54533 54296 ... |
| correct output |
|---|
| 123123 |
| user output |
|---|
| 100000 |
Test 16
Group: 3
Verdict: WRONG ANSWER
| input |
|---|
| 99098 63339 63878 64182 63904 ... |
| correct output |
|---|
| 142663 |
| user output |
|---|
| 100000 |
