https://coderun.yandex.ru/problem/phone-formatting/description Средняя

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

data class Template(
    val pattern: String, 
    val country: String, 
    val operator: String, 
    val countryCode: String, 
    val operatorCode: String
)

fun cleanNumber(number: String): String {
    // Удаляем все символы кроме цифр
    return number.filter { it.isDigit() }
}

fun matchesTemplate(number: String, template: Template): Boolean {
    val cleanNum = cleanNumber(number)
    val patternNum = template.pattern.split(" - ")[0].filter { it.isDigit() || it == 'X' }
    
    if (cleanNum.length != patternNum.length) return false
    
    for (i in cleanNum.indices) {
        if (patternNum[i] != 'X' && patternNum[i] != cleanNum[i]) {
            return false
        }
    }
    
    // Проверяем, что countryCode и operatorCode совпадают
    val countryCodeLen = template.countryCode.length
    val operatorCodeLen = template.operatorCode.length
    
    return cleanNum.startsWith(template.countryCode) && 
           cleanNum.substring(countryCodeLen, countryCodeLen + operatorCodeLen) == template.operatorCode
}

fun formatNumber(number: String, template: Template): String {
    val cleanNum = cleanNumber(number)
    val countryCodeLen = template.countryCode.length
    val operatorCodeLen = template.operatorCode.length
    
    val personalNum = cleanNum.substring(countryCodeLen + operatorCodeLen)
    return "+${template.countryCode} (${template.operatorCode}) $personalNum - ${template.country} ${template.operator}"
}

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    // Читаем количество номеров
    val n = reader.readLine().toInt()
    val numbers = Array(n) { reader.readLine() }
    
    // Читаем количество шаблонов
    val m = reader.readLine().toInt()
    val templates = Array(m) {
        val line = reader.readLine()
        val (pattern, rest) = line.split(" - ")
        val parts = pattern.split(" ")
        val countryCode = parts[0].drop(1) // Убираем +
        val operatorCode = parts[1].removeSurrounding("(", ")")
        val (country, operator) = rest.split(" ")
        Template(pattern, country, operator, countryCode, operatorCode)
    }
    
    // Обрабатываем каждый номер
    for (number in numbers) {
        val matchingTemplate = templates.find { matchesTemplate(number, it) }
        if (matchingTemplate != null) {
            writer.write(formatNumber(number, matchingTemplate))
            writer.newLine()
        }
    }
    
    reader.close()
    writer.close()
}