Advertisement
paranid5

TheBiggestTaskSib

Jan 9th, 2022
1,434
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 13.58 KB | None | 0 0
  1. internal class Cube private constructor(
  2.     private val upEdge: Edge,
  3.     private val frontEdge: Edge,
  4.     private val rightEdge: Edge,
  5.     private val backEdge: Edge,
  6.     private val leftEdge: Edge,
  7.     private val downEdge: Edge
  8. ) {
  9.     internal enum class Rotation { LEFT, RIGHT }
  10.  
  11.     private data class Edge(
  12.         var c1: Char,
  13.         var c2: Char,
  14.         var c3: Char,
  15.         var c4: Char,
  16.         var c5: Char,
  17.         var c6: Char,
  18.         var c7: Char,
  19.         var c8: Char,
  20.         var c9: Char,
  21.     ) {
  22.         fun rotateSelf(rotation: Rotation) {
  23.             val c1 = c1
  24.             val c2 = c2
  25.             val c3 = c3
  26.             val c4 = c4
  27.             val c6 = c6
  28.             val c7 = c7
  29.             val c8 = c8
  30.             val c9 = c9
  31.  
  32.             when (rotation) {
  33.                 Rotation.LEFT -> {
  34.                     this.c1 = c3
  35.                     this.c2 = c6
  36.                     this.c3 = c9
  37.                     this.c4 = c2
  38.                     this.c6 = c8
  39.                     this.c7 = c1
  40.                     this.c8 = c4
  41.                     this.c9 = c7
  42.                 }
  43.  
  44.                 Rotation.RIGHT -> {
  45.                     this.c1 = c7
  46.                     this.c2 = c4
  47.                     this.c3 = c1
  48.                     this.c4 = c8
  49.                     this.c6 = c2
  50.                     this.c7 = c9
  51.                     this.c8 = c6
  52.                     this.c9 = c3
  53.                 }
  54.             }
  55.         }
  56.     }
  57.  
  58.     internal companion object {
  59.         private lateinit var INSTANCE: Cube
  60.  
  61.         @JvmStatic
  62.         internal fun initialize() {
  63.             val upEdge = (1..3).flatMap {
  64.                 val (f, s, t) = readLine()!!.toCharArray()
  65.                 listOf(f, s, t)
  66.             }.let {
  67.                 Edge(it[0], it[1], it[2], it[3], it[4], it[5], it[6], it[7], it[8])
  68.             }
  69.  
  70.             val (frontEdge, rightEdge, backEdge, leftEdge) = kotlin.run {
  71.                 val up = readLine()!!.toCharArray()
  72.                 val mid = readLine()!!.toCharArray()
  73.                 val down = readLine()!!.toCharArray()
  74.  
  75.                 listOf(
  76.                     Edge(up[0], up[1], up[2], mid[0], mid[1], mid[2], down[0], down[1], down[2]),
  77.                     Edge(up[3], up[4], up[5], mid[3], mid[4], mid[5], down[3], down[4], down[5]),
  78.                     Edge(up[6], up[7], up[8], mid[6], mid[7], mid[8], down[6], down[7], down[8]),
  79.                     Edge(up[9], up[10], up[11], mid[9], mid[10], mid[11], down[9], down[10], down[11]),
  80.                 )
  81.             }
  82.  
  83.             val downEdge = (1..3).flatMap {
  84.                 val (f, s, t) = readLine()!!.toCharArray()
  85.                 listOf(f, s, t)
  86.             }.let {
  87.                 Edge(it[0], it[1], it[2], it[3], it[4], it[5], it[6], it[7], it[8])
  88.             }
  89.  
  90.             INSTANCE = Cube(upEdge, frontEdge, rightEdge, backEdge, leftEdge, downEdge)
  91.         }
  92.  
  93.         internal val instance: Cube
  94.             @JvmStatic
  95.             get() = INSTANCE
  96.     }
  97.  
  98.     internal fun rotateUp(rotation: Rotation) {
  99.         upEdge.rotateSelf(rotation)
  100.  
  101.         val front1 = frontEdge.c1
  102.         val front2 = frontEdge.c2
  103.         val front3 = frontEdge.c3
  104.  
  105.         val right1 = rightEdge.c1
  106.         val right2 = rightEdge.c2
  107.         val right3 = rightEdge.c3
  108.  
  109.         val back1 = backEdge.c1
  110.         val back2 = backEdge.c2
  111.         val back3 = backEdge.c3
  112.  
  113.         val left1 = leftEdge.c1
  114.         val left2 = leftEdge.c2
  115.         val left3 = leftEdge.c3
  116.  
  117.         when (rotation) {
  118.             Rotation.LEFT -> {
  119.                 frontEdge.c1 = left1
  120.                 frontEdge.c2 = left2
  121.                 frontEdge.c3 = left3
  122.  
  123.                 rightEdge.c1 = front1
  124.                 rightEdge.c2 = front2
  125.                 rightEdge.c3 = front3
  126.  
  127.                 backEdge.c1 = right1
  128.                 backEdge.c2 = right2
  129.                 backEdge.c3 = right3
  130.  
  131.                 leftEdge.c1 = back1
  132.                 leftEdge.c2 = back2
  133.                 leftEdge.c3 = back3
  134.             }
  135.  
  136.             Rotation.RIGHT -> {
  137.                 frontEdge.c1 = right1
  138.                 frontEdge.c2 = right2
  139.                 frontEdge.c3 = right3
  140.  
  141.                 leftEdge.c1 = front1
  142.                 leftEdge.c2 = front2
  143.                 leftEdge.c3 = front3
  144.  
  145.                 backEdge.c1 = left1
  146.                 backEdge.c2 = left2
  147.                 backEdge.c3 = left3
  148.  
  149.                 rightEdge.c1 = back1
  150.                 rightEdge.c2 = back2
  151.                 rightEdge.c3 = back3
  152.             }
  153.         }
  154.     }
  155.  
  156.     internal fun rotateDown(rotation: Rotation) {
  157.         downEdge.rotateSelf(rotation)
  158.  
  159.         val front7 = frontEdge.c7
  160.         val front8 = frontEdge.c8
  161.         val front9 = frontEdge.c9
  162.  
  163.         val right7 = rightEdge.c7
  164.         val right8 = rightEdge.c8
  165.         val right9 = rightEdge.c9
  166.  
  167.         val back7 = backEdge.c7
  168.         val back8 = backEdge.c8
  169.         val back9 = backEdge.c9
  170.  
  171.         val left7 = leftEdge.c7
  172.         val left8 = leftEdge.c8
  173.         val left9 = leftEdge.c9
  174.  
  175.         when (rotation) {
  176.             Rotation.LEFT -> {
  177.                 frontEdge.c7 = right7
  178.                 frontEdge.c8 = right8
  179.                 frontEdge.c9 = right9
  180.  
  181.                 leftEdge.c7 = front7
  182.                 leftEdge.c8 = front8
  183.                 leftEdge.c9 = front9
  184.  
  185.                 backEdge.c7 = left7
  186.                 backEdge.c8 = left8
  187.                 backEdge.c9 = left9
  188.  
  189.                 rightEdge.c7 = back7
  190.                 rightEdge.c8 = back8
  191.                 rightEdge.c9 = back9
  192.             }
  193.  
  194.             Rotation.RIGHT -> {
  195.                 frontEdge.c7 = left7
  196.                 frontEdge.c8 = left8
  197.                 frontEdge.c9 = left9
  198.  
  199.                 rightEdge.c7 = front7
  200.                 rightEdge.c8 = front8
  201.                 rightEdge.c9 = front9
  202.  
  203.                 backEdge.c7 = right7
  204.                 backEdge.c8 = right8
  205.                 backEdge.c9 = right9
  206.  
  207.                 leftEdge.c7 = back7
  208.                 leftEdge.c8 = back8
  209.                 leftEdge.c9 = back9
  210.             }
  211.         }
  212.     }
  213.  
  214.     internal fun rotateFront(rotation: Rotation) {
  215.         frontEdge.rotateSelf(rotation)
  216.  
  217.         val up7 = upEdge.c7
  218.         val up8 = upEdge.c8
  219.         val up9 = upEdge.c9
  220.  
  221.         val right1 = rightEdge.c1
  222.         val right4 = rightEdge.c4
  223.         val right7 = rightEdge.c7
  224.  
  225.         val down1 = downEdge.c1
  226.         val down2 = downEdge.c2
  227.         val down3 = downEdge.c3
  228.  
  229.         val left3 = leftEdge.c3
  230.         val left6 = leftEdge.c6
  231.         val left9 = leftEdge.c9
  232.  
  233.         when (rotation) {
  234.             Rotation.RIGHT -> {
  235.                 upEdge.c7 = left9
  236.                 upEdge.c8 = left6
  237.                 upEdge.c9 = left3
  238.  
  239.                 rightEdge.c1 = up7
  240.                 rightEdge.c4 = up8
  241.                 rightEdge.c7 = up9
  242.  
  243.                 downEdge.c3 = right1
  244.                 downEdge.c2 = right4
  245.                 downEdge.c1 = right7
  246.  
  247.                 leftEdge.c3 = down1
  248.                 leftEdge.c6 = down2
  249.                 leftEdge.c9 = down3
  250.             }
  251.  
  252.             Rotation.LEFT -> {
  253.                 upEdge.c7 = right1
  254.                 upEdge.c8 = right4
  255.                 upEdge.c9 = right7
  256.  
  257.                 rightEdge.c1 = down3
  258.                 rightEdge.c4 = down2
  259.                 rightEdge.c7 = down1
  260.  
  261.                 downEdge.c1 = left3
  262.                 downEdge.c2 = left6
  263.                 downEdge.c3 = left9
  264.  
  265.                 leftEdge.c3 = up9
  266.                 leftEdge.c6 = up8
  267.                 leftEdge.c9 = up7
  268.             }
  269.         }
  270.     }
  271.  
  272.     internal fun rotateBack(rotation: Rotation) {
  273.         backEdge.rotateSelf(rotation)
  274.  
  275.         val up1 = upEdge.c1
  276.         val up2 = upEdge.c2
  277.         val up3 = upEdge.c3
  278.  
  279.         val right3 = rightEdge.c3
  280.         val right6 = rightEdge.c6
  281.         val right9 = rightEdge.c9
  282.  
  283.         val down7 = downEdge.c7
  284.         val down8 = downEdge.c8
  285.         val down9 = downEdge.c9
  286.  
  287.         val left1 = leftEdge.c1
  288.         val left4 = leftEdge.c4
  289.         val left7 = leftEdge.c7
  290.  
  291.         when (rotation) {
  292.             Rotation.RIGHT -> {
  293.                 upEdge.c1 = right3
  294.                 upEdge.c2 = right6
  295.                 upEdge.c3 = right9
  296.  
  297.                 rightEdge.c3 = down9
  298.                 rightEdge.c6 = down8
  299.                 rightEdge.c9 = down7
  300.  
  301.                 downEdge.c7 = left1
  302.                 downEdge.c8 = left4
  303.                 downEdge.c9 = left7
  304.  
  305.                 leftEdge.c1 = up3
  306.                 leftEdge.c4 = up2
  307.                 leftEdge.c7 = up1
  308.             }
  309.  
  310.             Rotation.LEFT -> {
  311.                 upEdge.c1 = left7
  312.                 upEdge.c2 = left4
  313.                 upEdge.c3 = left1
  314.  
  315.                 rightEdge.c3 = up1
  316.                 rightEdge.c6 = up2
  317.                 rightEdge.c9 = up3
  318.  
  319.                 downEdge.c7 = right9
  320.                 downEdge.c8 = right6
  321.                 downEdge.c9 = right3
  322.  
  323.                 leftEdge.c1 = down7
  324.                 leftEdge.c4 = down8
  325.                 leftEdge.c7 = down9
  326.             }
  327.         }
  328.     }
  329.  
  330.     internal fun rotateLeft(rotation: Rotation) {
  331.         leftEdge.rotateSelf(rotation)
  332.  
  333.         val up1 = upEdge.c1
  334.         val up4 = upEdge.c4
  335.         val up7 = upEdge.c7
  336.  
  337.         val back3 = backEdge.c3
  338.         val back6 = backEdge.c6
  339.         val back9 = backEdge.c9
  340.  
  341.         val down1 = downEdge.c1
  342.         val down4 = downEdge.c4
  343.         val down7 = downEdge.c7
  344.  
  345.         val front1 = frontEdge.c1
  346.         val front4 = frontEdge.c4
  347.         val front7 = frontEdge.c7
  348.  
  349.         when (rotation) {
  350.             Rotation.RIGHT -> {
  351.                 upEdge.c1 = back9
  352.                 upEdge.c4 = back6
  353.                 upEdge.c7 = back3
  354.  
  355.                 backEdge.c3 = down7
  356.                 backEdge.c6 = down4
  357.                 backEdge.c9 = down1
  358.  
  359.                 downEdge.c1 = front1
  360.                 downEdge.c4 = front4
  361.                 downEdge.c7 = front7
  362.  
  363.                 frontEdge.c1 = up1
  364.                 frontEdge.c4 = up4
  365.                 frontEdge.c7 = up7
  366.             }
  367.  
  368.             Rotation.LEFT -> {
  369.                 upEdge.c1 = front1
  370.                 upEdge.c4 = front4
  371.                 upEdge.c7 = front7
  372.  
  373.                 backEdge.c3 = up7
  374.                 backEdge.c6 = up4
  375.                 backEdge.c9 = up1
  376.  
  377.                 downEdge.c1 = back9
  378.                 downEdge.c4 = back6
  379.                 downEdge.c7 = back3
  380.  
  381.                 frontEdge.c1 = down1
  382.                 frontEdge.c4 = down4
  383.                 frontEdge.c7 = down7
  384.             }
  385.         }
  386.     }
  387.  
  388.     internal fun rotateRight(rotation: Rotation) {
  389.         rightEdge.rotateSelf(rotation)
  390.  
  391.         val up3 = upEdge.c3
  392.         val up6 = upEdge.c6
  393.         val up9 = upEdge.c9
  394.  
  395.         val back1 = backEdge.c1
  396.         val back4 = backEdge.c4
  397.         val back7 = backEdge.c7
  398.  
  399.         val down3 = downEdge.c3
  400.         val down6 = downEdge.c6
  401.         val down9 = downEdge.c9
  402.  
  403.         val front3 = frontEdge.c3
  404.         val front6 = frontEdge.c6
  405.         val front9 = frontEdge.c9
  406.  
  407.         when (rotation) {
  408.             Rotation.RIGHT -> {
  409.                 upEdge.c3 = front3
  410.                 upEdge.c6 = front6
  411.                 upEdge.c9 = front9
  412.  
  413.                 backEdge.c1 = up9
  414.                 backEdge.c4 = up6
  415.                 backEdge.c7 = up3
  416.  
  417.                 downEdge.c3 = back7
  418.                 downEdge.c6 = back4
  419.                 downEdge.c9 = back1
  420.  
  421.                 frontEdge.c3 = down3
  422.                 frontEdge.c6 = down6
  423.                 frontEdge.c9 = down9
  424.             }
  425.  
  426.             Rotation.LEFT -> {
  427.                 upEdge.c3 = back7
  428.                 upEdge.c6 = back4
  429.                 upEdge.c9 = back1
  430.  
  431.                 backEdge.c1 = down9
  432.                 backEdge.c4 = down6
  433.                 backEdge.c7 = down3
  434.  
  435.                 downEdge.c3 = front3
  436.                 downEdge.c6 = front6
  437.                 downEdge.c9 = front9
  438.  
  439.                 frontEdge.c3 = up3
  440.                 frontEdge.c6 = up6
  441.                 frontEdge.c9 = up9
  442.             }
  443.         }
  444.     }
  445.  
  446.     internal fun printCube() {
  447.         println("${upEdge.c1}${upEdge.c2}${upEdge.c3}")
  448.         println("${upEdge.c4}${upEdge.c5}${upEdge.c6}")
  449.         println("${upEdge.c7}${upEdge.c8}${upEdge.c9}")
  450.  
  451.         println("${frontEdge.c1}${frontEdge.c2}${frontEdge.c3}${rightEdge.c1}${rightEdge.c2}${rightEdge.c3}${backEdge.c1}${backEdge.c2}${backEdge.c3}${leftEdge.c1}${leftEdge.c2}${leftEdge.c3}")
  452.         println("${frontEdge.c4}${frontEdge.c5}${frontEdge.c6}${rightEdge.c4}${rightEdge.c5}${rightEdge.c6}${backEdge.c4}${backEdge.c5}${backEdge.c6}${leftEdge.c4}${leftEdge.c5}${leftEdge.c6}")
  453.         println("${frontEdge.c7}${frontEdge.c8}${frontEdge.c9}${rightEdge.c7}${rightEdge.c8}${rightEdge.c9}${backEdge.c7}${backEdge.c8}${backEdge.c9}${leftEdge.c7}${leftEdge.c8}${leftEdge.c9}")
  454.  
  455.         println("${downEdge.c1}${downEdge.c2}${downEdge.c3}")
  456.         println("${downEdge.c4}${downEdge.c5}${downEdge.c6}")
  457.         println("${downEdge.c7}${downEdge.c8}${downEdge.c9}")
  458.     }
  459. }
  460.  
  461. fun main() {
  462.     Cube.initialize()
  463.     readLine()
  464.  
  465.     readLine()!!.split(' ').forEach {
  466.         val rotation = if (it.length == 2) Cube.Rotation.LEFT else Cube.Rotation.RIGHT
  467.         when (it.first()) {
  468.             'F' -> Cube.instance.rotateFront(rotation)
  469.             'B' -> Cube.instance.rotateBack(rotation)
  470.             'U' -> Cube.instance.rotateUp(rotation)
  471.             'D' -> Cube.instance.rotateDown(rotation)
  472.             'R' -> Cube.instance.rotateRight(rotation)
  473.             else -> Cube.instance.rotateLeft(rotation)
  474.         }
  475.     }
  476.  
  477.     Cube.instance.printCube()
  478. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement