"편리한 회문"검사기


39

이전에 회문 코드를 작성해 본 적이 있다면 얼마나 많은 괄호가 방해가되는지 알 것입니다. ()()이 수, 동안해야처럼 좀 보인다하더라도, 회문없는 ())(()(모두 회문 찾고 모두 매우 바보입니다. 다른 방법이라면 편리하지 않습니까?

문자열에 리버스에 괄호 ( ), 괄호 ( ) 및 괄호 ( ) 가 모두 바뀔 때 파생 된 문자열과 같으면 문자열이 편리합니다 . 다른 캐릭터는 특별하지 않으며 뒤집을 필요가 있습니다. ( 때로는 짝 지어 ​​지지만 종종 빠지지 않습니다.)()[]{}<>

당신의 임무 는 언어로 프로그램 (STDIN에 입력을 받음) 또는 (a) 인수가 편리하게 회 문적이며 다른 일관된 거짓 일 때 일관된 참값을 제공하는 함수 (단일 문자열 인수를 취함)를 작성하는 것입니다. 그렇지 않으면 (b) 그 자체가 편리하게 회문이다.

예를 들어, 다음 입력은 편리하게 회 문형입니다.

racecar
(a)(bb)(a)
void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov

그리고 다음은 아닙니다 :

non-palindrome
A nut for a jar of tuna?
(old [style] parens) )snerap ]elyts[ dlo(
ingirumimusnocte)etconsumimurigni

인터프리터 / 컴파일러 플래그를 제외한 외부 상태 (특정 파일 이름, 디렉토리 구조, 기타 사용자 입력, 웹 액세스 등)에 의존해서는 안됩니다.

또한 언어의 주석 기능을 활용하여 주석 처리하거나 일부 코드 조각을 사용하지 않는 "댓글 트릭"을 사용할 수 없습니다. 예를 들어, 다음은 모두 안전하게 제거하거나 파괴 할 수있는 비 기능적 부품을 포함하고 있기 때문에 허용되지 않습니다.

{some code} // {edoc emos}
{some code} NB.BN {edoc emos}
"n\" ;{edoc emos} ;"; {some code}; "\n"

분명히 이것은 모든 경우를 다룰 수는 없지만 여기서 도전 과제는 주석 처리 및 구문 분석되지 않은 ** 코드를 사용하여 회담을 달성하는 대신 수정 된 parens 및 괄호를 사용하는 것입니다. 당신을보고 있어요, LISP, Brainfuck.

이것은 이므로 가장 짧은 코드가 승리하지만 모든 코드 길이를 환영합니다.

* 일관된 true 및 false 값으로, 이러한 값이 서로 다르고 서로 다르지 않는 한 true 및 false 또는 true 및 false 1와 같은 값 쌍 중 하나를 반환 할 수 있습니다. 프로그램 실행에서 변경. 당신에게 문자를 저장 무엇이든 사용하십시오.0False"no"

** 실행되지 않은 것과 혼동 하지 마십시오. 유효하고 이상한 일을 할 수 있지만 결코 호출되지 않는 코드입니다.


유사 if(false){some code}하거나 사용하지 않는 변수는 어떻습니까? 그들은 허용됩니까?
ace_HongKongIndependence

@ace 언어가 실행되지 않은 코드에서 형식 일치 또는 구문 유효성을 구문 분석하거나 검사하는 경우 괜찮습니다. 언어가 해당 블록의 내부를 검사하지 않기 때문에 주석과 일치하면 구문 오류가 발생하면 좋지 않습니다. 당신이에 대한 유효한 사용을 찾을 수 있다면 (eslaf)fi, 당신은 사용할 수 있다고 생각합니다 if(false).
algorithmshark

58
()()회문이 아닌 이유를 알아내는 데 시간이 너무 오래 걸렸습니다
Reinstate Monica

코드가 여러 줄로 입력되어야합니까?
Ventero

@Ventero 줄 바꿈 및 캐리지 리턴은 문자이며 뒤집을 쌍이 없으므로 일반 문자로 간주됩니다.
algorithmshark

답변:


13

J (60)

(|.-:'())([]][{}}{'&charsub) :: (busrahc&'}{{}][[])(()':-.|)

이것은 인수를 취하는 함수입니다.

   (|.-:'())([]][{}}{'&charsub) :: (busrahc&'}{{}][[])(()':-.|) 'ingirumimusnocte)etconsumimurigni'
0
   (|.-:'())([]][{}}{'&charsub) :: (busrahc&'}{{}][[])(()':-.|) '(a)(bb)(a)'
1

설명:

  • f :: gf입력에 대해 함수 를 실행하고 오류없이 리턴되면 결과를 리턴합니다. 경우 f에 실패, 그것은 실행 g대신.

  • f여기에 (|.-:'())([]][{}}{'&charsub)실제 작업을 수행하는 :

    • |.: 역
    • -:: 와 동등하다
    • '())([]][{}}{'&charsub: 각 브래킷을 반대쪽 브래킷으로 교체
  • g함수는 (busrahc&'}{{}][[])(()':-.|)의미가 없지만 구문 상 유효합니다. busrahc정의되지 않았지만 실행될 때만 해결되므로 (그리고 실행되지 않기 때문에) 중요하지 않습니다.

당신은 당신의 돌려 문자를 저장할 수 있습니다 f :: g로를 g@-@f. g후크 동등 (-.|)때문에 :출력이 지도록 -1 편리 팔린 드롬 아니라, 각각에 대한 빈리스트.
algorithmshark

34

골프 스크립트, 107 91

.4:ab-1:ba=;1
%ba%{...fi@@=
c43.=;)('"([{
}])"'~?~'"([{
}])"')(;=.34c
=@@if...}%ab%
1;=ab:1-ba:4.

줄 바꿈은 예술적입니다. fi, c43cnoops하지만, 전체 코드가 실행된다.

그렇지 않으면 -3-1-1편리한 회문을 위해 인쇄 합니다 -4-1-1. 온라인으로 사용해보십시오!

대체 버전, 155 바이트

64 바이트의 비용으로 다음을 개선 할 수 있습니다.

0!*1{!}\;:);0:f;0:i;-1:ab;9:ba;
...=;1%ab%{....i@f@@fi@@=@.=@\)
+""'"([{}])"'~+?+~'"([{}])"'""+
(\@=.@=@@if@@f@i....}%ba%1;=...
;ab:9;ba:1-;i:0;f:0;(:;\{!}1*!0

이전과 마찬가지로 전체 코드가 실행되고 모든 단일 바이트가 출력에 영향을줍니다.

그렇지 않으면 010편리한 회문을 위해 인쇄 합니다 -100. 온라인으로 사용해보십시오!

테스트 및 예제

$ base64 > palindrome.gs -d <<< LjQ6YWItMTpiYT07MSViYSV7Li4uZmlAQD1jNDMuPTspKCciKFt7fV0pIid+P34nIihbe31dKSInKSg7PS4zNGM9QEBpZi4uLn0lYWIlMTs9YWI6MS1iYTo0Lg==
$ wc -c palindrome.gs
91 palindrome.gs
$ rev palindrome.gs | tr '([{}])' ')]}{[(' | diff - palindrome.gs
$ echo -n 'r(a[c{"e"}c]a)r' | golfscript palindrome.gs
-3-1-1
$ echo -n 'totallynotapalindrome' | golfscript palindrome.gs
-4-1-1
$
$ base64 > pal.gs -d <<< MCEqMXshfVw7Oik7MDpmOzA6aTstMTphYjs5OmJhOy4uLj07MSVhYiV7Li4uLmlAZkBAZmlAQD1ALj1AXCkrIiInIihbe31dKSInfis/K34nIihbe31dKSInIiIrKFxAPS5APUBAaWZAQGZAaS4uLi59JWJhJTE7PS4uLjthYjo5O2JhOjEtO2k6MDtmOjA7KDo7XHshfTEqITA=
$ wc -c pal.gs
155 pal.gs
$ rev pal.gs | tr '([{}])' ')]}{[(' | diff - pal.gs
$ echo -n 'r(a[c{"e"}c]a)r' | golfscript pal.gs
010
$ echo -n 'totallynotapalindrome' | golfscript pal.gs
-100
$ for i in {1..154}; do head -c $i pal.gs > tmp.gs; tail -c +$[i+2] pal.gs >> tmp.gs
> [ "$(echo -n 'r(a[c{"e"}c]a)r' | golfscript tmp.gs 2> /dev/null)" = "010" ] && echo $i
> done; rm tmp.gs
1
for i in {1..154}; do head -c $i pal.gs > tmp.gs; tail -c +$[i+2] pal.gs >> tmp.gs
>  [ "$(echo -n '42' | golfscript tmp.gs 2> /dev/null)" = "-100" ] && echo $i
> done | grep '^1$'; rm tmp.gs

작동 원리

.             # Duplicate the input string.
4:ab-1:ba     # Save 4 in “ab” and -1 in “ba”.
=;            # Compare 4 to -1 and discard the result.
1%            # Save every element from the input string in a new string.
ab%           # Reverse the input string.
{             # For each character in the input string:
  ...         # Duplicate the character thrice.
  fi          # Variable “fi” is undefined; this does nothing.
  @@=         # Verify that the character is equal to itself; push 1.
  c43         # Variable “c43” is undefined; this does nothing.
  .=;         # Verify that 1 is equal to itself and discard the result.
  )(          # Increment and decrement the character.
  '"([{}])"'~ # Push that string and evaluate it. Result: '([{}])'
  ?           # Retrieve the character's position in '([{}])'. -1 means not found.
  ~           # Negate the position.. Examples: -1 -> 0    0 -> -1    2 -> -3
  '"([{}])"') # Push that string and pop its last element. Result: '"([{}])' 34
  (;          # Decrement 34 (the ASCII code of a double quote) and discard.
  =           # Retrieve the corresponding character.
  .34         # Duplicate the character and push 34.
  c           # Variable “c” is undefined; this does nothing.
  =           # If the character is a double quote, the index was -1.
  @@if        # In that case, replace the double quote with the original character.
  ...         # Duplicate the new character thrice.
}%            #
ab%           # Save every fourth element in a new string to discard dummy values.
1;            # Push 1 and discard.
=             # Push 1 if the modified string matches the original, 0 otherwise.
ab:1-         # Save 4 in “1” and subtract.
ba:4.         # Save -1 in “4” and duplicate.

0!*           # Pop and push the input string.
1{!}\;:);     # Make “)” an alias for “!”.
0:f;0:i;      # Variables.
-1:ab;9:ba;   # Moar variables.
...=;         # Duplicate the input string.
1%ab%         # Reverse the copy.
{             # For each character in the input string:
  ....        # Duplicate the character four times.
  i@          # Push 0 and rotate a string copy on top of it.
  f@@fi@@     # Push 0 and rotate 0 on top of it.
  =@          # Push 1 and rotate a string copy on top of it.
  .=@         # Push 1 and rotate 1 on top of it.
  \)+         # Negate a 1 and add. Result: 1
  ""          # Push that string.
  '"([{}])"'  # Push that string.
   ~+         # Evaluate the second string and concatenate. Result: '([{}])'
   ?          # Retrieve the characters position in '([{}])'. -1 means not found.
   +~         # Add 1 to the position and negate. Ex.: -1 -> -1 | 0 -> -2 | 1 -> -3
  '"([{}])"'  # Push that string.
  ""          # Push that string.
  +           # Concatenate. Result: '"([{}])"' 
  (\          # Pop the first double quote and swap it with the rest of the string.
  @=.         # Retrieve the corresponding character and duplicate it.
  @=          # If the character is a double quote, the index was -1.
  @@if        # In that case, replace the double quote with the original character.
  @@          # Rotate the modified character to the bottom.
  f@i....     # Push dummy values.
  }%          #
  ba%         # Save every ninth element in a new string to discard dummy values.
  1;          # Push 1 and discard.
  =           # Push 1 if the modified string matches the original, 0 otherwise.
  ...;        # Duplicate thrice and discard the last copy.
  ab:9;ba:1-; # Variables.
  i:0;f:0;    # Moar variables.
  (:;\        # Negate, override “;” and swap.
  {!}1*!0     # Negate twice and push 0.

13

루비, 110

(z=gets;r=z.tr *["([{}])",")]}{[("];p *z==r.reverse;1)||(1;esrever.r==z* p;[")]}{[(","([{}])"]* rt.z=r;steg=z)

true입력이 편리한 회문인지 아닌지 인쇄 합니다 false. 이 솔루션은 입력이 개행으로 끝나지 않는다고 가정하므로 다음을 사용하여 테스트하십시오 echo -n.

echo -n '(a)(bb)(a)' | ruby convpal.rb
true

echo -n '(a)(bb()a(' | ruby convpal.rb
false

# note that for this to work, the file must not contain a newline
# to remove a trailing newline, pipe it through tr -d $'\n'
cat convpal.rb | ruby convpal.rb
true

이것은 다소 간단 포트입니다 내 대답상동 회문 검사기 (그리고 정말 golfed 지금까지). 사용되는 주요 요령은 첫 번째 괄호로 묶은 표현식이 항상을 반환 1하므로 부울 식의 후반은 평가되지 않지만 구문 분석됩니다.

이 적응의 유일한 어려움에 전화를 추가하는 방법을 파악하고 z.tr그 "편리한 반대"는 문법적으로 유효하다고 그래서 -하지만 난 그저 내가 이미 박았을 사용하는 같은 트릭을 사용할 수 있습니다 *, 상반기로 해석됩니다 splat 연산자 (배열 내용을 함수 매개 변수로 사용) 및 후반에는 배열 곱셈 (또는 회귀) 연산자로 사용합니다.

루비, 157 297모든 코드 실행

w=tsoh=gets p
o=rt=esrever=Gem
q=tsoh.tr *["([{}])",")]}{[("]
q==esrever.host=w=tsoh.reverse==q
[")]}{[(","([{}])"]* rt.host=q
meG=reverse=tr=o
p steg=host=w

이 (약간 더 긴) 버전은 모든 코드를 실행 하며 , 두 줄을 제외한 모든 줄은 출력에 영향을 미치며 마지막 줄에 인쇄되지만 모든 줄은 오류없이 구문 분석되고 실행됩니다. 이 버전은 후행 줄 바꿈을 입력의 일부로 해석하므로이를 사용 echo -n하여 입력하거나 줄 바꿈을 입력하십시오. true입력이 편리한 회 문인 경우 인쇄 합니다 false.

설명

# Read the input by calling gets(nil), which is achieved by passing the return
# value of a call to Kernel#p (which returns nil if no argument is supplied) to
# gets.
w=tsoh=gets p
# Assign the global Gem module to three variables.
# The variable names are the reversed names of methods we have to call later.
# This doesn't necessarily have to be the Gem module, any global module/variable
# (or class that allows object creation through a call to the module itself,
# e.g. Hash or GC) with a writable property would do, but Gem#host was
# the shortest one I could find. This is necessary because Ruby doesn't
# allow setting previously undefined properties through the dot syntax.
o=rt=esrever=Gem
# Replace the parentheses with the corresponding flipped one.
# sserts is the reverse of the property name we're going to use later.
q=tsoh.tr *["([{}])",")]}{[("]
# Do the convinient palindrome check and assign its result to a few variables
# and Gem's host property.
q==esrever.host=w=tsoh.reverse==q
# Here, the * is parsed as array join operator.
[")]}{[(","([{}])"]* rt.host=q
# Nothing special here.
meG=reverse=tr=o
# Print the result of the palindrome check, which was stored in w.
p steg=host=w

9

GolfScript, 61 자

여기 GolfScript의 기본 솔루션이 있습니다. 더 향상 될 수 있다고 확신합니다.

{.-1%{"([{}])".2$?~@[.]@+=}%=}~{=%{=+@[.]@~?$2."([{}])"}%1-.}

GolfScript의 경우와 마찬가지로이 프로그램은 stdin에서 입력을 읽습니다. 출력합니다 :

1{=%{=+@[.]@~?$2."([{}])"}%1-.}

입력이 위의 문제에서 정의 된 편리한 회 문인 경우 :

0{=%{=+@[.]@~?$2."([{}])"}%1-.}

그렇지 않다면.

설명 : 이 프로그램은 구문 분석 될 때 실행되지 않은 코드가 정상 이라는 판결에 크게 의존합니다 . 중괄호 ( { })로 구분 된 두 개의 코드 블록으로 구성되며 서로 거울 이미지입니다.

첫 번째 코드 블록은 ~다음 코드 블록에 의해 실행되며 입력이 편리한 회문인지 확인하여 입력 여부와 출력 1여부를 출력 합니다 0. 두 번째 코드 블록은 실행 되지 않으므로 프로그램이 종료되고 스택의 모든 내용이 GolfScript 인터프리터에 의해 자동으로 문자열 화되고 인쇄 될 때까지 스택에 그대로 남아 있습니다.

GolfScript 인터프리터가하는 것을 주목해야한다 매우 (그 문제에 대해, 지금까지 이상) 구문 분석시에 몇 가지 구문 검사를; GolfScript 코드 블록 리터럴은 실행될 때 충돌이 발생하더라도 거의 모든 것을 포함 할 수 있습니다. 여전히 종료되지 않은 문자열 리터럴과 같은 몇 가지 구문 오류는 실행되지 않은 코드에서도 오류가 발생 하므로이 솔루션은 (거의) 규칙에 속한다고 생각합니다.

추신. 실제 실행 된 코드를 살펴보면 @[.]@, 문자열 리터럴 "([{}])"및 루프와 같은 편리한 회문 요소가 포함되어 있습니다 %{ ... }%. 이것은 완전한 palindromic 프로그램이 실행되고 기능적 일 수있는 "본질적으로 palindromic"GolfScript 솔루션이 실제로 가능할 수 있다는 감탄적인 제안을 제공합니다. 내가 직접 생산하지 못 했으므로 , 1 명을 만들어 낸 사람에게 +100의 보상 현상금 을 제공합니다 !


3
잠깐, 당신의 코드는 회문 자체입니까? : O
Fabricio

이 솔루션을 "n\";X;";X;"\n"일종의 주석 과 같은 것으로 생각 하고 싶지만 의심의 여지가 있습니다. 그러나 실제로는 "내재적으로 회문"솔루션을 찾고 있었거나 블록의 실행이 조금 더 진행된 솔루션을 찾고있었습니다.
algorithmshark

내 대답에는 noop (정의되지 않은 변수)과 아무것도 달성하지 못하는 부분 (예 :)이 1;있습니다. 그래도 여전히 완벽하게 작동합니까?
Dennis

@ 데니스 : 예, 그렇게 생각합니다. 축하합니다. 충분히 인상적입니다. 이 질문은 아직 바운티를 게시 할 수 없을 정도로 새로운 것 같지만 며칠 안에 질문이있을 것입니다.
Ilmari Karonen

1
출력 형식 leeway abuuuse :-)
John Dvorak

4

자바 스크립트 (ES6), 245 바이트

브라우저에서 실행할 수있는 JS 답변을 원했기 때문에 여기에 있습니다.

eurt=>eurt==(("",eurt))["split"||"nioj"]("")["map"||"esrever"](x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x||[x]({')':'(','(':')',']':'[','[':']','}':'{','{':'}'})>=x)["reverse"||"pam"]("")["join"||"tilps"]((true,""))==true>=true

실제로 실행되지 않은 모든 코드를 제거하면 다음과 같은 결과를 얻습니다.

eurt=>eurt==(("",eurt))["split"||"nioj"]("")["map"||"esrever"](x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x||[x]({')':'(','(':')',']':'[','[':']','}':'{','{':'}'})>=x)["reverse"||"pam"]("")["join"||"tilps"]((true,""))==true>=true
eurt=>eurt==(("",eurt))["split"        ]("")["map"           ](x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x                                                           )["reverse"       ]("")["join"         ]((true,""))==true>=true

이것으로 단순화 할 수 있습니다 :

eurt=>eurt==eurt.split("").map(x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x).reverse("").join("")

true / eurt 대신 n1 / 1n을 사용하고 || 대신 쉼표를 사용하고 괄호 스위처를 사용하여 60 바이트를 절약 할 수 있습니다. n1=>n1==(('',n1))['nioj','split']``['esrever','map'](c=>`()[]{}`[`()[]{}`['indexOf'](c)^1]||c||[1^(c)['fOxedni']`{}[]()`]`{}[]()`>=c)['pam','reverse']``['tilps','join']((1n,''))==1n>=1n(185 바이트)
Yair Rand

3

자바 스크립트 (ES6) 288

Spidermonkey 명령 행 쉘 에서 실행됩니다 . STDIN에서 단일 라인을 읽고 출력 이 입력이 편리한 회문 true인지 false에 따라 출력 됩니다.

((print)((eval)('r=readline()')==([0]['map']['call'](r,x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x)['reverse']()['join']('')))&&((('')['nioj']()['esrever'](x||[x]({')':'(','(':')',']':'[','[':']','}':'{','{':'}'})>=x,r)['llac']['pam'][0])==('()enildaer=r')(lave))(tnirp))

이 코드는 구문 상 유효하지만 함수가 잘못된 값을 반환하므로 이후의 모든 것이 &&실행되지 않습니다 print.

이 코드를 먼저 실행하여 readlineprint기능 을 에뮬레이션하여 Firefox 콘솔에서이 코드를 실행할 수 있습니다 . readline필요에 따라 내부 입력을 편집하십시오 .

readline = function(){ 
    return "void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov"; 
}, print = console.log.bind(console);

다음은 출력에 대한 간단한 예입니다.

명령 행 예


이용 촬영 &&정말 영리를, 나는 (그러나 조금 cheaty을 보인다) 당신에게 칭찬
MayorMonty

2

05AB1E, 35 바이트

"{[()]}"DRr‡`rJ¹Q,Q¹Jr`‡rRD"{[()]}"

온라인으로 사용해보십시오!

설명:

                     # Implicit input
 "{[()]}"            # Push "{[()]}" onto the stack
         DR          # Pushes a reversed copy onto the stack
           r         # Reverse the order of the stack
            ‡        # Transliterate
             `       # Flatten array on stack
              r      # Reverse order of stack
               J     # Join stack
                ¹Q   # Check equality with first input
                  ,  # Print
                     # Everything after is still syntactically correct, but just does not print anything.

나는 대답이 유효하지 않기 때문에 이것이 도움이 될 것이라고 생각하지 않지만 "()[]{}"당신 대신 할 수 있습니다žu„<>-
acrolith

@daHugLenny 지금 유효합니다
Oliver Ni

q구문의 유효성을 위해 최소한 구문 분석 된 후 프로그램의 나머지 부분이 있습니까? 그렇지 않다면이 tantamount를 코드의 후반부에 주석 처리하는 것으로 간주합니다.
algorithmshark

@algorithmshark 수정되었습니다.
Oliver Ni

1

CJam, 38 바이트

Q~"=re%W_@%W_q"`{[()]}`"q_W%@_W%er="~Q

"=re%W_@%W_q"1입력이 편리하게 회문 식인 경우 인쇄 합니다 "=re%W_@%W_q"0.

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

Q~                                     e# Evaluate an empty string.
  "=re%W_@%W_q"                        e# Push that string.
               `                       e# Inspect. Pushes "\"=re%W_@%W_q\"".
                {[()]}                 e# Push that block.
                      `                e# Inspect. Pushes "{[()]}".
                       "           "~  e# Push and evaluate.
                        q              e# Read from STDIN.
                         _W%           e# Push a reversed copy.
                            @          e# Rotate "{[()]}" on top of the stack.
                             _W%       e# Push a reversed copy.
                                er     e# Perform transliteration.
                                  =    e# Compare to the input string.
                                     Q e# Push an empty string.

CJam은 프로그램을 실행 한 후 검사 된 문자열, 문자열 비교의 부울 및 빈 문자열의 세 항목을 자동으로 스택에 인쇄합니다.


0

펄, 83 + 2 = 85 바이트

로 실행 -nl

say$_~~reverse y-"({[]})"-")}][{("-r;exit;tixe;r-")}][{("-"({[]})"-y esrever~~_$yas

입력의 진실성을 인쇄 한 후 코드가 종료됩니다. 세미콜론 뒤의 모든 것이 해석되고 (스크립트가 해당 지점에 도달하면 충돌하지 않음) 스크립트는 exit실행되지 않습니다. 내가두면 exit;tixe;코드 밖으로, 그것은 여전히 추락 제대로하기 전에 결과를 인쇄 할 것이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.