CSES - Datatähti 2024 alku - Results
Submission details
Task:Käännöt
Sender:rottis
Submission time:2023-11-09 09:05:55 +0200
Language:Ruby
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED13
#2ACCEPTED19
#3ACCEPTED33
#4ACCEPTED35
Test results
testverdicttimegroup
#1ACCEPTED0.07 s1details
#2ACCEPTED0.07 s1details
#3ACCEPTED0.07 s1details
#4ACCEPTED0.08 s1details
#5ACCEPTED0.08 s1details
#6ACCEPTED0.07 s2details
#7ACCEPTED0.07 s2details
#8ACCEPTED0.07 s2details
#9ACCEPTED0.07 s2details
#10ACCEPTED0.07 s2details
#11ACCEPTED0.10 s2details
#12ACCEPTED0.10 s2details
#13ACCEPTED0.10 s2details
#14ACCEPTED0.10 s2details
#15ACCEPTED0.07 s2details
#16ACCEPTED0.15 s2details
#17ACCEPTED0.07 s3details
#18ACCEPTED0.07 s3details
#19ACCEPTED0.15 s3details
#20ACCEPTED0.14 s3details
#21ACCEPTED0.15 s3details
#22ACCEPTED0.15 s3details
#23ACCEPTED0.17 s3details
#24ACCEPTED0.16 s3details
#25ACCEPTED0.23 s3details
#26ACCEPTED0.07 s4details
#27ACCEPTED0.07 s4details
#28ACCEPTED0.14 s4details
#29ACCEPTED0.14 s4details
#30ACCEPTED0.14 s4details
#31ACCEPTED0.14 s4details
#32ACCEPTED0.07 s4details
#33ACCEPTED0.19 s4details
#34ACCEPTED0.19 s4details

Code

class Array
  def swap(index, size, flag="none")
    if index < 0 || (index + size) > self.length
      raise IndexError.new("index = #{index}, flag=#{flag}")
    end
    self[index...(index+size)] = self[index...(index+size)].reverse
  end

  def is_possible(size)
    case size
    when 3
      self.each_with_index do |val, ind|
        if (val + ind) % 2 == 0
          return false
        end
      end
      return true
    when 5
      return self.is_possible(3)
    end
  end
end

def sort(array, size)
  continue = true
  index = 0
  max_index = array.length - size + 1
  ops = []
  while continue
    continue = false
    while index < max_index
      if array[index] > array[index + size - 1]
        ops << index + 1 # shift index for the "correct index"
        array.swap(index, size)
        continue = true
      end
      index += 1
    end
    index = 0
    max_index -= 1
  end
  return ops
end

def sort_4(array, size = 4)
  max = array.length
  ops = []
  
  if array.length == 5
    20.times do |n|
      move = n % 2
      array.swap(move, size)
      ops << move + 1
      if array == array.sort
        return ops
      end
    end
    return nil
  end


  while max > 3
    index = array.index(max)
    delta = max - index - 1
    
    while delta >= 3
      ops << index + 1
      array.swap(index, size)
      index = array.index(max)
      delta = max - index - 1
    end

    # delta = 1, ind = 5, len = 6
    # [0, 1, 0, 2, 0, 1, 0]
    # -5, -4, -5, -3, -5, -4, -5 ## ?shift?<<
    # delta = 2, ind = 4, len = 6
    # [1, 0, 2, 1, 0, 1, 0, 2]
    # -3, -4, -2, -3, -4, -3, -4, -2 ## ?shift?<<
    # delta = 1, ind = 2, len = 6
    # [2, 1, 0, 2, 0, 1, 2]
    # 0, -1, -2, 0, -2, -1, 0
    # delta = 2, ind = 1, len = 6
    # [0, 2, 1, 0, 2, 0, 1, 2]
    # -1, +1, 0, -1, +1, -1, 0, +1

    if delta == 1 && index >= 4 #(6)
      moves = [index-4, index-3, index-4, index-2, index-4, index-3, index-4]
      moveflag = 1
    elsif delta == 2 && index >= 3 #(6)
      moves = [index-2, index-3, index-1, index-2, index-3, index-2, index-3, index-1]
      moveflag = 2
    elsif delta == 1 && index >= 2 && (index + 4 <= array.length) #(6) 
      moves = [index, index-1, index-2, index, index-2, index-1, index]
      moveflag = 3
    elsif delta == 2 && index >= 1 && (index + 5 <= array.length) #(6)
      moves = [index-1, index+1, index, index-1, index+1, index-1, index, index+1]
      moveflag = 4
    else
      moves = []
    end

    #puts "moves = #{moves.to_s}"
    moves.each do |move|
      ops << move + 1
      array.swap(move, size, moveflag)
      #puts array.to_s
    end

    #puts array.to_s
    #puts "--"
    max -= 1
  end

  if array[0...4] == array[0...4].sort
    return ops
  elsif array[0...4].reverse == array[0...4].sort
    return ops + [1]
  elsif array[0...4] == [2, 3, 1, 4]
    return ops + [2, 3, 2, 3, 1, 2, 1, 3] # from 23e_calc
  elsif array[0...4] == [3, 1, 2, 4]
    return ops + [3, 1, 2, 1, 3, 2, 3, 2]
  else
    #puts array.to_s
    return nil
  end
end

def sort_5(array, size = 5)
  if array.length == 5
    if array.sort == array.reverse
      return [1]
    elsif array.sort == array
      return []
    else
      return nil
    end
  elsif array.length == 6
    ops = []    
    50.times do |num|
      move = num % 2
      ops << move + 1
      array.swap(move, size)
      if array == array.sort
        return ops
      end
    end
    return nil
  end

  continue = true
  max = array.length
  ops = []
  while max > 4
    index = array.index(max)
    delta = max - index - 1
    moves = []
    while delta >= 4
      ops << index + 1
      array.swap(index, size)
      index = array.index(max)
      delta = max - index - 1
    end

    # swap 0, 2 and 1, 3
    # [0, 1, 2, 0, 2] s = irrelevant
    # swap 2, 4 and 1, 3
    # [0, 2, 0, 2, 1] s = 4
    # end: swap -3, -1 and -4, -2
    # [0, 2, 0, 1, 2] s = 4
    # -4, -2, -4, -3, -2
    
    if delta == 2
      if max < (array.length - 4)
        moves = [index - 2, index, index - 2, index, index - 1]
      elsif index >= 4
        moves = [index - 4, index - 2, index - 4, index - 3, index - 2]
      else
        return nil
      end
    end
    moves.each do |move|
      ops << move + 1
      array.swap(move, size)
    end
    max -= 1
  end
  
  if array[0...4] == array[0...4].sort
    return ops
  else
    moves = [0, 1, 2, 0, 2]
    moves.each do |move|
      ops << move + 1
      array.swap(move, size)
    end
    if array[0...4] == array[0...4].sort
      return ops
    else
      return nil
    end
  end
end

def func(swap = gets.chomp.split(" ").map(&:to_i)[1], arr = gets.chomp.split(" ").map(&:to_i), return_bool = false)
  #_, swap = gets.chomp.split(" ").map(&:to_i)
  #arr = gets.chomp.split(" ").map(&:to_i)

  output = ""
  case swap
  when 2
    if return_bool
      return true
    end
    puts "YES"
    sorted = sort(arr, 2)
    puts sorted.length
    puts sorted.join(" ")
  when 3
    if arr.is_possible(3)
      if return_bool
        return true
      end
      puts "YES"
      sorted = sort(arr, 3)
      puts sorted.length
      puts sorted.join(" ")
    else
      if return_bool
        return false
      end
      puts "NO"
    end
  when 4
    sorted = sort_4(arr, 4)
    if sorted.nil?
      if return_bool
        return false
      end
      puts "NO"
    else
      if return_bool
        return true
      end
      puts "YES"
      puts sorted.length
      puts sorted.join(" ")
    end
  when 5
    if arr.is_possible(5)
      sorted = sort_5(arr)
      if sorted.nil?
        if return_bool
          return [false, arr]
        end
        puts "NO"
      else
        if return_bool && sorted.length < 1000000
          return true
        elsif return_bool 
          return "errrrrrorrr! len too long"
        end
        puts "YES"
        puts sorted.length
        puts sorted.join(" ")
      end
    else
      if return_bool
        return false
      end
      puts "NO"
    end
  end
end

if __FILE__ == $0
  func
end

Test details

Test 1

Group: 1

Verdict: ACCEPTED

input
5 2
1 2 3 4 5

correct output
YES
0

user output
YES
0

Test 2

Group: 1

Verdict: ACCEPTED

input
5 2
2 1 3 4 5

correct output
YES
1
1

user output
YES
1
1

Test 3

Group: 1

Verdict: ACCEPTED

input
20 2
6 20 18 2 16 13 19 17 8 14 11 ...

correct output
YES
366
2 3 4 5 6 7 8 9 10 11 12 13 14...

user output
YES
132
2 3 4 5 6 7 8 9 10 11 12 13 14...
Truncated

Test 4

Group: 1

Verdict: ACCEPTED

input
100 2
100 92 62 88 12 7 43 31 19 72 ...

correct output
YES
2876
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
YES
2438
1 2 3 4 5 6 7 8 9 10 11 12 13 ...
Truncated

Test 5

Group: 1

Verdict: ACCEPTED

input
100 2
100 99 98 97 96 95 94 93 92 91...

correct output
YES
5248
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
YES
4950
1 2 3 4 5 6 7 8 9 10 11 12 13 ...
Truncated

Test 6

Group: 2

Verdict: ACCEPTED

input
5 3
1 2 3 4 5

correct output
YES
0

user output
YES
0

Test 7

Group: 2

Verdict: ACCEPTED

input
5 3
3 5 4 1 2

correct output
NO

user output
NO

Test 8

Group: 2

Verdict: ACCEPTED

input
5 3
5 2 1 4 3

correct output
YES
8
1 2 1 3 1 2 3 1

user output
YES
2
1 3

Test 9

Group: 2

Verdict: ACCEPTED

input
20 3
19 14 1 18 3 4 11 20 13 6 17 8...

correct output
YES
52
8 10 12 14 16 18 1 3 5 7 9 11 ...

user output
YES
42
1 3 4 5 7 8 9 10 11 12 13 14 1...
Truncated

Test 10

Group: 2

Verdict: ACCEPTED

input
20 3
9 6 13 18 5 10 3 2 7 20 1 4 19...

correct output
YES
50
10 12 14 16 18 13 15 17 4 6 8 ...

user output
YES
34
3 4 5 6 7 9 10 12 13 14 15 16 ...

Test 11

Group: 2

Verdict: ACCEPTED

input
500 3
53 52 21 76 25 142 5 4 83 176 ...

correct output
YES
15194
334 336 338 340 342 344 346 34...

user output
YES
15174
1 3 5 6 10 11 12 13 14 15 16 1...
Truncated

Test 12

Group: 2

Verdict: ACCEPTED

input
500 3
51 44 147 172 1 28 27 82 233 1...

correct output
YES
15565
366 368 370 372 374 376 378 38...

user output
YES
15543
3 4 5 6 8 10 11 12 13 15 16 17...
Truncated

Test 13

Group: 2

Verdict: ACCEPTED

input
500 3
75 46 179 62 221 14 67 154 89 ...

correct output
YES
15920
454 456 458 460 462 464 466 46...

user output
YES
15902
4 5 7 9 10 11 12 13 14 15 16 1...
Truncated

Test 14

Group: 2

Verdict: ACCEPTED

input
500 3
161 54 285 12 71 142 111 94 97...

correct output
YES
15931
408 410 412 414 416 418 420 42...

user output
YES
15907
2 3 5 6 7 8 9 10 11 13 15 16 1...
Truncated

Test 15

Group: 2

Verdict: ACCEPTED

input
500 3
122 260 455 113 315 276 433 43...

correct output
NO

user output
NO

Test 16

Group: 2

Verdict: ACCEPTED

input
500 3
499 500 497 498 495 496 493 49...

correct output
YES
62264
2 4 6 8 10 12 14 16 18 20 22 2...

user output
YES
62250
1 2 3 4 5 6 7 8 9 10 11 12 13 ...
Truncated

Test 17

Group: 3

Verdict: ACCEPTED

input
5 4
1 2 3 4 5

correct output
YES
0

user output
YES
10
1 2 1 2 1 2 1 2 1 2

Test 18

Group: 3

Verdict: ACCEPTED

input
5 4
5 1 2 3 4

correct output
YES
4
1 2 1 2

user output
YES
4
1 2 1 2

Test 19

Group: 3

Verdict: ACCEPTED

input
500 4
58 14 107 124 4 113 24 290 56 ...

correct output
YES
15698
389 392 395 398 401 404 407 41...

user output
YES
16416
389 392 395 398 401 404 407 41...
Truncated

Test 20

Group: 3

Verdict: ACCEPTED

input
500 4
113 187 278 242 23 67 48 298 3...

correct output
YES
15004
480 481 480 482 485 488 491 49...

user output
YES
15658
484 487 490 493 496 495 496 49...
Truncated

Test 21

Group: 3

Verdict: ACCEPTED

input
500 4
5 233 199 35 213 354 11 134 30...

correct output
YES
16770
458 461 464 467 470 473 476 47...

user output
YES
17460
458 461 464 467 470 473 476 47...
Truncated

Test 22

Group: 3

Verdict: ACCEPTED

input
500 4
169 47 21 137 57 138 360 147 4...

correct output
YES
15889
497 371 372 371 373 376 379 38...

user output
YES
16595
497 375 378 381 384 387 390 39...
Truncated

Test 23

Group: 3

Verdict: ACCEPTED

input
500 4
493 409 291 313 156 443 496 40...

correct output
YES
22886
480 481 480 482 485 488 491 49...

user output
YES
23608
484 487 490 493 496 495 496 49...
Truncated

Test 24

Group: 3

Verdict: ACCEPTED

input
500 4
137 99 100 226 326 298 140 340...

correct output
NO

user output
NO

Test 25

Group: 3

Verdict: ACCEPTED

input
500 4
500 499 498 497 496 495 494 49...

correct output
YES
41458
1 2 1 2 5 8 11 14 17 20 23 26 ...

user output
YES
43781
1 4 7 10 13 16 19 22 25 28 31 ...
Truncated

Test 26

Group: 4

Verdict: ACCEPTED

input
5 5
1 2 3 4 5

correct output
YES
0

user output
YES
0

Test 27

Group: 4

Verdict: ACCEPTED

input
5 5
5 4 3 2 1

correct output
YES
1
1

user output
YES
1
1

Test 28

Group: 4

Verdict: ACCEPTED

input
500 5
145 26 285 154 147 314 141 40 ...

correct output
YES
13786
216 220 224 228 232 236 240 24...

user output
YES
14026
216 220 224 228 232 236 240 24...
Truncated

Test 29

Group: 4

Verdict: ACCEPTED

input
500 5
137 22 399 292 249 6 51 224 42...

correct output
YES
13465
456 460 464 468 472 476 480 48...

user output
YES
13719
456 460 464 468 472 476 480 48...
Truncated

Test 30

Group: 4

Verdict: ACCEPTED

input
500 5
153 52 85 100 329 60 433 468 4...

correct output
YES
13642
377 378 377 380 384 388 392 39...

user output
YES
13792
382 386 390 394 398 402 406 41...
Truncated

Test 31

Group: 4

Verdict: ACCEPTED

input
500 5
267 326 95 108 189 32 291 366 ...

correct output
YES
14639
213 214 213 216 220 224 228 23...

user output
YES
14863
218 222 226 230 234 238 242 24...
Truncated

Test 32

Group: 4

Verdict: ACCEPTED

input
500 5
15 450 272 80 321 101 247 438 ...

correct output
NO

user output
NO

Test 33

Group: 4

Verdict: ACCEPTED

input
499 5
497 498 499 496 495 494 493 49...

correct output
YES
30886
3 7 11 15 19 23 27 31 35 39 43...

user output
YES
30876
3 7 11 15 19 23 27 31 35 39 43...
Truncated

Test 34

Group: 4

Verdict: ACCEPTED

input
500 5
499 500 497 498 495 496 493 49...

correct output
YES
30919
1 4 8 12 16 20 24 28 32 36 40 ...

user output
YES
32245
2 6 10 14 18 22 26 30 34 38 42...
Truncated