for문과if문을 한 줄로 합치다

최근에 Atcorder가 시작되었다.다른 분들은 어쨌든 짧아요!
오늘 이 문제를 풀 때 코드를 최대한 줄였다.
https://atcoder.jp/contests/abc068/tasks/abc068_b

문제문


고교는 2로 파열된 수를 좋아한다.정수 n을 주었기 때문에 1 이상 n 이하의 정수에서 최대 2로 분할하는 횟수를 구하세요.답은 틀림없이 하나일 것이다.
또 2를 제외하고 몇 번 안 나와 파열되는 것을 2로 파열 횟수라고 한다.
입력 예
15
샘플 출력
8
8은 3번 2로 나눌 수 있는데 이것은 1, 2...15중에서 가장 많다.

정답: 1


정상이었어


우선 보통 쓰는 코드는 여기 있습니다.
n = int(input())
x = 1
for i in range(1,7):
  if 2**i > n:
    break
  x = 2**i
print(x)
상당히 깔끔한 느낌.
나는 단축 시스템으로 이 코드를 다시 써 보았다.

버전 단축


n = int(input())
x = 1
x = x if 2**i > n else 2**i for i in range(1,7)
print(x)
길이가 반으로 바뀌었어요.
for문의 4행을 1행으로 줄일 수 있는 것은 세 가지 연산자 덕분이다.

삼원 연산자 xfor 문장


for i in range(1,7):
  if 2**i > n:
    break
  x = 2**i
위의 네 줄을 아래의 한 줄로 바꾸다.내용이 조금 다른 경우if 2**i > n가 트루인 경우다.
x = x if 2**i > n else 2**i for i in range(1,7)
일반적으로 쓰는 사람은 빼고break하지만 단축판에서 x는 스스로 대입한다.
단축판은 전체 순환이 필요하기 때문에 처리 속도가 매우 느리다.breakcontinue라는 표현은 공식이 아니기 때문에 세 가지 연산자를 사용할 수 없다.

Summary


이번 for문과if문의 조합 코드는 매우 짧지만 여러 가지 제한이 있다.실제로 방금 Atcorder에 단축판 코드를 제출했는데 런타임 에로르가 나온 거예요.
앞으로도 적극적으로 사용해 짧아질 수 있는 장면과 열심히 써야 할 장면을 똑똑히 보도록 하겠습니다.

좋은 웹페이지 즐겨찾기