언어 버전 확인


51

다른 버전의 언어로 작동하는 폴리 글 로트를 작성해야합니다. 실행하면 항상 언어 버전이 출력됩니다.

규칙

  • 프로그램은 최소한 두 가지 언어 버전으로 작동해야합니다.
  • 프로그램의 출력은 버전 번호 여야 합니다 . 외부 데이터가 없습니다.
  • 프로그램은 버전 번호를 결정하기 위해 원하는 방법을 사용할 수 있습니다. 그러나 출력은 규칙 2를 따라야합니다. 그러나 버전 번호를 결정하면 출력은 숫자 만되어야합니다.
  • 프로그램은 언어의 주요 버전 만 출력하면됩니다. 예를 들어 FooBar 12.3.456789-beta에서 프로그램은 12 만 출력하면됩니다.
  • 언어에서 버전 번호 앞이나 뒤에 단어 나 기호를 넣으면 해당 번호 나 숫자 만 출력 할 필요가 없습니다. 예를 들어, C89에서는 프로그램 만 인쇄 89하면되고 C ++ 0x에서는 프로그램 만 인쇄하면됩니다 0.
  • C99와 달리 전체 이름 또는 부 버전 번호 (예 : C89)를 인쇄하도록 선택한 경우 이름 인쇄 해야합니다 . C89 build 32유효하지만 유효 error in C89 build 32: foo bar하지 않습니다.
  • 프로그램은 언어 버전을 확인하기 위해 내장, 매크로 또는 사용자 정의 컴파일러 플래그를 사용하지 않을 수 있습니다.

채점

당신의 점수는 코드 길이를 작동하는 버전의 수로 나눈 값입니다. 가장 낮은 점수, 승리입니다!


4
언어 버전 번호는 무엇입니까? 누가 결정합니까?
밀 마법사

9
버전 수의 역 선형은 많은 버전의 답변을 환영하지 않습니다.
user202729

6
동의합니다. 다재다능한 정수기 프린터 는 그 점수를 잘 받았습니다 (number of languages)^3 / (byte count).
Mego

6
언어 의 버전은 무엇입니까 ? 여기서 언어를 통역사 / 컴파일러 로 정의하지 않습니까? 특정 C89 코드에서 C89 사양을 위반하는 실행 파일을 생성하는 버그가있는 gcc 버전이 있으며 다음 버전의 gcc에서 수정되었습니다. 어떤 gcc 버전이 사용 중인지 알려주기 위해이 버그 동작에 대한 코드 기반을 작성한다면 이것이 유효한 솔루션을 계산해야합니까? 다른 버전의 컴파일러를 대상으로 하지만 다른 버전의 언어 는 타겟팅 하지 않습니다 .
tsh

6
나는 이것을 얻지 못한다. 먼저 "프로그램의 출력은 버전 번호 여야합니다."라고 말합니다. . 그런 다음 "C99와 달리 C89와 같이 전체 이름 또는 부 버전 번호를 인쇄하도록 선택한 경우 이름 만 인쇄해야합니다." 첫 번째 규칙은 실제로 요구 사항이 아닌가?
파이프

답변:


16

심각 하고 실제로 3 바이트, 1.5 점

'1u

온라인으로 사용해보십시오 : 실제로 , 진지하게

설명:

'1u
'1   both versions: push "1"
  u  Actually: increment character to "2"; Seriously: NOP
     (both versions: implicit print)

u그리고 D문자열에 갖는 기능성 실제로 첨가 하였다 (V2 심각하다).


3
실제로 README.md는 실제로는 심각하게 영적 후계자 라고 말합니다 . 나에게 단순한 버전 변경처럼 들리지 않습니다.
Adám

7
@ Adám 리포지토리의 분기를 보면 심각하게 분기에 상주합니다 v1. 심각하게 사용되지 않기 전에 실제로 v2지점에있었습니다. 또한 릴리스 에서는 심각하게 사용 된 1.x버전 번호가 있지만 실제로는 PyPI 모두 사용합니다 . 2.x
Mego

115

Python 3.0 및 Python 2, 6 점

(12 바이트, 2 개 버전)

print(3/2*2)

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

층 나누기를 사용하는 Python 2와 달리 Python 3+는 기본적으로 부동 나누기를 사용한다는 사실에 의존합니다.


@MaltySen Your program should work in at least two versions of your language.적어도 두 가지 버전 2.7 및 3.0에서 작동합니다. 나는을 선택했다 to print the full name or minor version numbers.
fireflame241241

아, 알 겠어요.
Maltysen

4
세상에! 불쌍한 파이썬 개발자
Regis Portalez

4
@RegisPortalez from __future__ import division, 문제 해결 :)
Łukasz Rogalski

62

자바, 189 바이트, 10 개 버전, 점수 = 18.9

지원되는 버전 : 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.89

(이전 점수 는 역사를 확인하십시오 !)

Object v(){int i=0;try{for(String[]s={"Locale","Map","Timer","Currency","UUID","Deque","Objects","Base64","zip.CRC32C"};;i++)Class.forName("java.util."+s[i]);}finally{return i<9?"1."+i:i;}}

Java 8에서
실행 Java 9 이상에서 실행

언 골프

Object v(){
  int v=0;
  try {
    for(
      String[] s={
        "Locale",          // 1.1
        "Map",             // 1.2
        "Timer",           // 1.3
        "Currency",        // 1.4
        "UUID",            // 1.5
        "Deque",           // 1.6
        "Objects",         // 1.7
        "Base64",          // 1.8
        "zip.CRC32C"       // 9
      };;v++)
      Class.forName("java.util."+s[v]);
  } finally {
    // Swallowing ClassNotFoundException when the version is not the last one
    // Swallowing ArrayIndexOutOfBoundsException that occurs after reaching the last version.
    return v < 9 ? "1." + v : v; // Return either an int or a String
  }
}

Java 1.0과 Java 1.3 사이의 모든 버전에 대해 코드 부분 return v<9?"1."+v:v;(이전 return(v<9?"1.":"")+v;)을 확인해야합니다. 이 구문을 실제로 테스트하기 위해 Java 1.3 이하 버전을 설치하지 않았습니다.

소개

Java 버전 관리에는 특별한 기록이 있습니다. 모든 버전은 역사적으로 1.x포함되어 1.0있습니다. 그러나 Java 9부터 JEP223 부터 버전 구성이 사용에서 1.x로 변경되었습니다 x. 그것은 내부적으로 알려진 버전입니다. 그래서 우리는 다음 표를 가지고 있습니다 (Javadoc 및 Wikipedia 와 함께 ) :

 java.version | Rel. name | Product name
   property   |           |
--------------+-----------+-----------------
          1.0 | JDK 1.0   | Java 1
          1.1 | JDK 1.1   |
          1.2 | J2SE 1.2  | Java 2
          1.3 | J2SE 1.3  |
          1.4 | J2SE 1.4  |
          1.5 | J2SE 5.0  | Java 5
          1.6 | Java SE 6 | Java 6
          1.7 | Java SE 7 | Java 7
          1.8 | Java SE 8 | Java 8
          9   | Java SE 9 | Java 9

이 챌린지 항목은 위 표의 버전 열과 일치하며 이는 시스템 속성에 포함되어 있습니다 "java.version".

설명

Java는 코드를 더 이상 사용하지 않지만 제거하지 않기 때문에 클래스가 존재하기 시작하는 버전을 확인하는 것이 목표입니다. JDK는 (주로) 소스 포워드 호환 이기 때문에 코드는 모든 버전과 호환되도록 Java 1.0으로 특별히 작성되었습니다 .

구현시 각 버전이 도입 한 가장 짧은 클래스 이름을 찾으려고합니다. 바이트를 얻으려면 공통 서브 패키지를 선택해야합니다. 지금까지 가장 효율적인 패키지는 java.util모든 버전의 Java에 분산 된 짧은 이름의 클래스가 여러 개 포함되어 있기 때문에 가장 효율적인 패키지라는 것을 알았습니다 .

이제 실제 버전 번호를 찾기 위해 클래스 이름은 버전을 소개하여 정렬됩니다. 그런 다음 각 클래스를 순차적으로 인스턴스화하고 배열 인덱스를 증가시킵니다. 클래스가 존재하면 다음으로 건너 뛰고, 그렇지 않으면 try-block 에서 예외를 포착합니다 . 완료되면 존재를 확인해야 할 클래스가 더 이상 없기 때문에 다른 예외가 발생합니다.

어쨌든 스레드는 try예외를 제외 하고 -block을 남깁니다 . 이 예외는 포착되지 않지만 finally-block 덕분에 보류 상태가됩니다.이 블록 은 이전에 사용 된 인덱스 가 "1."+v있는 값을 실제로 리턴하여 보류 예외를 대체합니다 v. 또한이 색인을 Java의 부 버전 번호와 일치 시켰습니다.

골프의 중요한 부분은 java.util각 버전 의 패키지 (또는 모든 하위 패키지) 에서 가장 짧은 새 클래스 이름을 찾는 것이 었습니다 . 그 비용을 계산하는 데 사용한 표는 다음과 같습니다.

Base cost: `java.util.` (10 chars)

 Version | Class name (cost in chars)     | Reduced name (cost in chars)
---------+--------------------------------+---------------------------
 9       | java.util.zip.CRC32C (20)      | zip.CRC32C (10)
 1.8     | java.util.Base64 (16)          | Base64 (6)
 1.7     | java.util.Objects (17)         | Objects (7)
 1.6     | java.util.Deque (15)           | Deque (5)
 1.5     | java.util.UUID (14)            | UUID (4)
 1.4     | java.util.Currency (18)        | Currency (8)
 1.3     | java.util.Timer (15)           | Timer (5)
 1.2     | java.util.Map (13)             | Map (3)
 1.1     | java.util.Locale (16)          | Locale (6)
 1.0     | <default>                      | <default>
---------+--------------------------------+---------------------------
Subtotal |                      144 chars |                  54 chars
    Base |                                |                  10 chars
   Total |                      144 chars |                  64 chars

크레딧

  • Kevin Cruijssen 덕분에 30 바이트가 절약되었습니다 (나는 그의 의견을 읽기 전에 그것을하고 있었지만 약속합니다!).
  • Neil 덕분에 26 바이트가 더 절약되었습니다 (아뇨, 그렇게 생각하지 않았습니다)
  • Nevay 12 바이트 감사와 좋은 아웃 오브 -box 꼬 시러 다니구 - 캐치 생각!
  • 다시 Neil의 11 바이트와 멋진 휴대용 finally트릭.
  • 로 교체하여 Kevin Cruijssen 덕분에 2 바이트 더 return(i<9?"1.":"")+i;사용 가능 return i<9?"1."+i:i;(1.4 이전에 구문 변경이 없었으므로 1.0 또는 최대 1.3에 대해 유효성 검사가 필요함)

내장으로

내장이 허용 된 경우 :

String v(){return System.getProperty("java.version");}

13 버전 (1.0 ~ 12)의 경우 54 바이트이므로 점수는 4.1538입니다.


1
@KevinCruijssen 나는 javadoc을 열고 짧은 이름으로 1부터 1까지 클래스를 실행했습니다. 그러나 ...이 페이지에서 약간의 도움을 받았습니다 : docs.oracle.com/javase/8/docs/technotes/guides/lang/…
Olivier Grégoire

1
260 바이트 아니면 하나 더, 알고하지 않는 return"...공백없이 TBH 모든 버전에서 가능하다).
케빈 Cruijssen에게

1
235 바이트 :String v(){return "1."+(e("time.Year")+e("nio.file.Path")+e("io.Console")+e("util.UUID")+e("text.Bidi")+e("util.Timer")+e("sql.Ref")+e("lang.Void"));}int e(String c){try{Class.forName("java."+c);return 1;}catch(Exception e){return 0;}}
Neil

3
216 바이트 :String v(){int i=0;try{for(String[]s={"lang.Void","sql.Ref","util.Timer","net.URI","util.UUID","net.IDN","nio.file.Path","time.Year","lang.Module"};;i++)Class.forName("java."+s[i]);}catch(Exception e){}return"1."+i;}
Nevay

1
오, 배열을 반복하고 예외를 잡는 것에 대해 궁금해했지만으로 더 잘 갈 수 있습니다 finally{return"1."+i;}.
Neil

22

Python , 606 바이트 / 15 개 버전 = 40.4 점

NoOneIsHere 덕분에 -67 바이트 (lol).

버전은 0.9.1, 2 (.0), 2.2, 2.2.2, 2.5.0, 2,5.1, 3 (.0), 3.1, 3.1.3, 3.2.1, 3.3, 3.4, 3.5 aaand 3.6입니다. .

try:eval('1&2')
except:print('0.9.1');1/0
if`'\n'`<'\'\\n\'':print(2);1/0
try:from email import _Parser;print(2.2);1/0
except:0
try:eval('"go"in""')
except:print('2.2.2');1/0
try:int('2\x00',10);print(2.5);1/0
except:0
if pow(2,100)<1:print('2.5.1');1/0
if str(round(1,0))>'1':print(3);1/0
if format(complex(-0.0,2.0),'-')<'(-':print(3.1);1/0
if str(1.0/7)<repr(1.0/7):print('3.1.3');1/0
try:eval('u"abc"')
except:print('3.2.1');1/0
try:int(base=10);print(3.3);1/0
except:0
try:import enum
except:print('3.3.3');1/0
try:eval('[*[1]]')
except:print(3.4);1/0
try:eval('f""')
except:print(3.5);1/0
print(3.6)

Sp3000의 놀라운 답변에 대한 모든 크레딧 . 후행 줄 바꿈이 필요합니다.

휘, 골프 재미 있었어. 이것은 작동해야합니다 (예,이 버전 중 하나를 모두 설치했습니다). 그러나 실수로 무언가를 망 쳤을 수도 있습니다. 누구든지 버그를 발견하면 알려주십시오.



... 아, 당연하지. Sp3000이 모든 print통화 에 괄호를 넣은 이유가 궁금합니다. 알려 주셔서 감사합니다!
완전히 인간적인

2
특정 유형의 오류를 제거하여 68 바이트를 절약 할 수 있습니다 (모두 excepts를으로 대체 except:)
NoOneIsHere 여기

x=<string inside eval>수동으로 코드를 회피하는 대신 여전히 작동 합니까?
Blue

@NoOneIs 여기서 처음에 모든 것 때문에 할 수는 없다고 생각 1/0했지만 깨달았습니다. 감사!
완전히 인간적인

21

C ++ 11/14/17, 점수 = 147/3 = 49

C ++ 11 ++ C 17분의 14을 구별하기 위해서는 기본 변화 사용 const의 네스 constexpr의 예 C ++ 14 (신용 부재와 기능 https://stackoverflow.com/questions/23980929/ -c14에 도입 된 변경 사항-잠재적으로 프로그램 작성 -c1에 포함될 수 있음 ). C ++ 14와 C ++ 17을 구별하기 위해 C ++ 17이 삼중 그래프를 비활성화한다는 사실을 사용합니다.

#include<iostream>
#define c constexpr int v
struct A{c(int){return 0;}c(float)const{return*"??="/10;}};int main(){const A a;std::cout<<11+a.v(0);}

언 골프 드 :

struct A {
    constexpr int v(int) { return 0; }
    constexpr int v(float) const {
        // with trigraphs, *"??=" == '#' == 35, v() returns 3
        // without trigraphs, *"??" == '?' == 63, v() returns 6
        return *("??=") / 10;
    }
};

int main() {
    const A a;
    std::cout << 11 + a.v(0);
}

(를 사용하여 Debian gcc 7.1.0으로 테스트했습니다 -std=c++{11,14,17}.)


1
훌륭한 첫 번째 답변! 예를 들어 include<포함 문 사이의 공백을 골프화 할 수 있습니다 #include<iostream>.
MD XF

1
흠 ... 규칙이 표준 라이브러리 차이 (이 경우 간접적으로 __cplusplus매크로를 사용함 )를 사용하지 못하도록 개정 된 경우 -C ++ 17과 C ++ 14를 구별하기 위해 범위 기반 변경을 사용하는 것에 의존합니다. 의미론을 위해. boost::integer_iterator센티넬을 이터레이터로 변환하는 것이 "놀라운"행동을 가지도록 최소한의 이터레이터 / 센티넬 클래스를 만들 수도 있습니다 .
다니엘 Schepler

4
return 0;암시 적이므로 main9 바이트를 저장할 수 있습니다. 또한 wc -c솔루션 에 따라 252 바이트가 아닌 251 바이트를 사용하고 있습니다 (편집기가 끝에 줄 바꿈을 삽입했을 수 있습니다).
nwp

1
++ (14) C에서 + 17 c를 분리 trigraph를의 부족을 사용하는 아마 짧은
Potato44

1
이게 효과가 있을까요? return *=>return*
Zacharý

19

브라우저의 EcmaScript 3/5/2015/2016/2017, 59 바이트 / 5 버전 = 11.8 포인트

alert(2017-2*![].map-2010*![].fill-![].includes-!"".padEnd)

NetScape 7 보고서 3 및 Opera 12 보고서 5

GOTO 0 덕분에 1 바이트 저장



Netscape 7은 ES3 만 지원 했습니까? 와우, 그것은 내가 생각했던 것보다 오래되었다.
Neil

1
의미있는 곳 -!대신에 몇 바이트를 절약 할 수 +!!있습니다 (숫자 상수를 적절히 변경하십시오).
GOTO 0

3
설명이 좀 있을까요? :)
Derek 朕 會 功夫

@ Derek : 설명을 보려면 내 솔루션 (위 링크)을 참조하십시오.
Shaggy

18

JavaScript (ES5 및 ES6), 14 바이트 / 2 버전 = 7

alert(5^"0o3")

0o스타일 8 진 상수는 ES6에서 새로 추가되었습니다. ES5 NaN는 비트 XOR 결과에 영향을 미치지 않는 문자열을 캐스팅합니다 .


13

자바 스크립트 (ES 2, 3 및 5-8 9), 59/6 = 9.833 75/7 = 10.714

2 버전 솔루션보다 약간 높은 점수를 주더라도 더 많은 버전으로 솔루션을 제출할 수 있습니다.

alert(9-(/./.dotAll!=0)-!"".padEnd-![].includes-![].keys-2*![].map-![].pop)

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

Array, RegExp & String 프로토 타입에 다양한 메소드가 있는지 확인하고이를 무효화하고 부울 값을 제공하며 초기 값 9에서 부울 값을 뺍니다 ![].map.

  • 정규식 의 dotAll속성 (및 관련 s플래그)은 ES2018 (v9) 에 도입되었습니다 .
  • padEnd문자열 방법에 도입 된 ES2017 (V8).
  • includes배열 방법이 도입되었다 ES2016 (V7).
  • keys배열 방법이 도입되었다 ES2015 (V6).
  • map배열 방법이 도입되었다 ES5.1 (V5).
  • pop배열 방법에 도입 된 ES3 (V3).

ES 7 또는 ES 8 이 유효한 버전 번호입니까? ES 201x로 불리어야할까요?
tsh

1
@tsh : 예, 여전히 버전 번호를 사용합니다. 그들은 단지 진짜 이름으로 몇 년을 사용 합니다 .
Shaggy


9

Befunge : 15 11 바이트 / 2 버전 = 5.5

@ Pietu1998에 의해 4 바이트 줄어듦

"89",;5-;,@  

온라인으로보십시오 :
Befunge 93
Befunge 98
Befunge 98 독점 세미콜론 연산자 ( "다음 세미콜론으로 건너 뛰기")를 사용하여 버전을 구별하십시오. 둘 다 "9"를 인쇄합니다. Befunge 93은 세미콜론을 무시하고 "8"에서 5를 빼고 (스택 상단에 남은 값) 결과 "3"을 인쇄하고 종료합니다. 반면에 Befunge 98은 건너 뛰고 "8"을 인쇄하고 종료합니다.


"89",;5-;,@11 바이트에 대 한
PurkkaKoodari

@ Pietu1998 니스! 답변으로 게시하고 싶다면 기꺼이
투표하겠습니다.

당신이 원한다면, 당신은 그 ;부분 을 알아 냈습니다 .
PurkkaKoodari

@ Pietu1998 편집. 많은 감사합니다!
karhell

참고로, 다른 접근 방식을 취하여 7 바이트로 줄였습니다. 링크
James Holderness

7

Pyth 4/5-6 바이트 / 2 버전 = 3

  5 ;4

Pyth 5에서는 줄 시작 부분의 짝수 공백이 들여 쓰기에 사용되지 않고 Pyth 4에서는 단일 공백처럼 작동하여 5. Pyth 4에서 세미콜론은 문장을 완성 4하기 만하면됩니다. Pyth 5에서는 공백과 세미콜론이 나머지 줄을 주석으로 만듭니다.


11
Pyth에 버전이 있다는 것을 누가 알았습니까?
Outgolfer Erik


7

큐빅으로, 4 바이트, 점수 4 / ∞

B3%0

시스템이 실행할 메모리가 충분한 모든 버전에서 작동합니다. 절름발이이기 때문에 비경쟁. 이 메타 게시물 당 유효합니다 .

기본적으로 B3은 왼쪽에서 윗면으로 한 행을 회전합니다. F3은 F₁3 또는 B₁3과 마찬가지로 작동합니다. 입체감의 3x3x3에 하나 개의 행이 하나 cubelet 한 3 cubelets 바와 같이,이 세두고 1그것을 3의 얼굴 합주는 상면에 's의 %0상면 합 프린트 3 입체적의 인쇄 3 x3x3한다.

큐빅 4x4x4에서 행은 4x1 큐비입니다. 4 1을 윗면에 넣고 합계 4를 산출합니다.


9
점수가 4 / ∞이 아니어야합니까?
nwp

7

x86 16/32/64 비트 머신 코드 : 11 바이트, 점수 = 3.66

이 함수는 현재 모드 (기본 피연산자 크기)를 AL의 정수로 반환합니다. 서명이있는 C에서 호출uint8_t modedetect(void);

NASM 기계 코드 + 소스 목록 (16 비트 모드에서 작동하는 방식을 보여 BITS 16줍니다. NASM에 16 비트 모드의 소스 니모닉을 어셈블하도록 지시하기 때문 입니다.)

 1          machine      global modedetect
 2          code         modedetect:
 3 addr     hex          BITS 16

 5 00000000 B040             mov    al, 64
 6 00000002 B90000           mov    cx, 0       ; 3B in 16-bit.  5B in 32/64, consuming 2 more bytes as the immediate
 7 00000005 FEC1             inc    cl          ; always 2 bytes.  The 2B encoding of inc cx would work, too.
 8                       
 9                           ; want: 16-bit cl=1.   32-bit: cl=0
10 00000007 41               inc    cx       ; 64-bit: REX prefix
11 00000008 D2E8             shr    al, cl   ; 64-bit: shr r8b, cl doesn't affect AL at all.  32-bit cl=1.  16-bit cl=2
12 0000000A C3               ret
# end-of-function address is 0xB, length = 0xB = 11

정당성 :

x86 기계 코드에는 공식적으로 버전 번호가 없지만 가장 편리한 것을 선택하는 대신 특정 숫자를 생성하여 문제의 의도를 충족한다고 생각합니다 (7 바이트 만 필요합니다 (아래 참조)).

인텔의 8086 인 원래 x86 CPU는 16 비트 머신 코드 만 지원했습니다. 80386은 32 비트 머신 코드를 도입했습니다 (32 비트 보호 모드에서 사용 가능하며 나중에 64 비트 OS에서는 호환 모드에서 사용 가능). AMD는 긴 모드에서 사용할 수있는 64 비트 머신 코드를 도입했습니다. 이것은 Python2와 Python3이 다른 언어 버전과 동일한 의미에서 x86 기계 언어 버전입니다. 그것들은 대부분 호환되지만 의도적으로 변경되었습니다. Python2 및 Python3 프로그램을 실행할 때와 같은 방법으로 64 비트 OS 커널에서 32 비트 또는 64 비트 실행 파일을 직접 실행할 수 있습니다.

작동 방식 :

로 시작하십시오 al=64. 1 (32 비트 모드) 또는 2 (16 비트 모드)만큼 오른쪽으로 이동하십시오.

  • 16/32 vs. 64 비트 : 1 바이트 inc/ dec인코딩은 64 비트의 REX 접두사입니다 ( http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix ). REX.W는 일부 명령어 (예 : a jmp또는 jcc)에 전혀 영향을 미치지 않지만이 경우 16/32/64를 얻으려면 ecx대신 에 inc 또는 dec를 원했습니다 eax. 또한 REX.B대상 레지스터를 변경하는을 설정합니다 . 그러나 다행히도 우리는 그 일을 할 수 있지만 64 비트를 설정하면 전환 할 필요가 없습니다 al.

    16 비트 모드에서만 실행되는 명령어에는를 포함 할 수 ret있지만 필요하거나 도움이되지 않았습니다. (그리고 그것을 원한다면 코드 조각으로 인라인하는 것이 불가능할 것입니다). jmp함수 내에 있을 수도 있습니다 .

  • 16 비트 vs. 32/64 : 즉시는 32 비트 대신 16 비트입니다. 모드를 변경하면 명령어의 길이가 변경 될 수 있으므로 32/64 비트 모드는 별도의 명령어가 아닌 다음 2 바이트를 즉시의 일부로 디코딩합니다. 16 비트 모드가 32/64와 다른 명령 경계에서 디코딩되도록 동기화에서 디코딩하지 않고 2 바이트 명령을 사용하여 일을 간단하게 유지했습니다.

    관련 : 피연산자 크기 접두사는 16 비트와 32/64 비트 모드의 차이와 같이 즉시 확장 길이 (부호 확장 8 비트가 아닌 한)를 변경합니다. 이것은 명령-길이 디코딩을 병렬로하기 어렵게 만든다. 인텔 CPU에는 LCP 디코딩 중단이 있습니다.


대부분의 호출 규칙 (x86-32 및 x86-64 시스템 V psABI 포함)은 좁은 리턴 값이 레지스터의 높은 비트에서 가비지를 갖도록 허용합니다. 또한 CX / ECX / RCX (및 64 비트의 경우 R8)를 클로버 링 할 수 있습니다. IDK는 16 비트 호출 규칙에서 일반적이지만 코드 골프이므로 항상 사용자 지정 호출 규칙이라고 말할 수 있습니다.

32 비트 분해 :

08048070 <modedetect>:
 8048070:       b0 40                   mov    al,0x40
 8048072:       b9 00 00 fe c1          mov    ecx,0xc1fe0000   # fe c1 is the inc cl
 8048077:       41                      inc    ecx         # cl=1
 8048078:       d2 e8                   shr    al,cl
 804807a:       c3                      ret    

64 비트 분해 ( 온라인 시도 )

0000000000400090 <modedetect>:
  400090:       b0 40                   mov    al,0x40
  400092:       b9 00 00 fe c1          mov    ecx,0xc1fe0000
  400097:       41 d2 e8                shr    r8b,cl      # cl=0, and doesn't affect al anyway!
  40009a:       c3                      ret    

관련 : 내 x86-32 / x86-64 폴리 글롯 머신 코드 Q & A on SO.

16 비트와 32/64의 또 다른 차이점은 주소 지정 모드가 다르게 인코딩된다는 것입니다. 예를 들어 lea eax, [rax+2]( 8D 40 02) lea ax, [bx+si+0x2]는 16 비트 모드에서 와 같이 디코딩 합니다. 특히 이후, 코드 골프에 사용할 분명히 어렵다 e/rbxe/rsi많은 호출 규칙에 전화 보존된다.

또한 mov r64, imm64REX + 인 10 바이트 사용을 고려했습니다 mov r32,imm32. 그러나 이미 11 바이트 솔루션을 가지고 있었기 때문에 이것은 최대 10 바이트 + 1입니다 ret.


32 및 64 비트 모드의 테스트 코드 (실제로 16 비트 모드에서 실행하지는 않았지만 디스 어셈블리는 디코딩 방법을 알려줍니다. 16 비트 에뮬레이터가 설정되어 있지 않습니다.)

; CPU p6   ;  YASM directive to make the ALIGN padding tidier
global _start
_start:
    call   modedetect
    movzx  ebx, al
    mov    eax, 1
    int    0x80        ; sys_exit(modedetect());

align 16
modedetect:
BITS 16
    mov    al, 64
    mov    cx, 0       ; 3B in 16-bit.  5B in 32/64, consuming 2 more bytes as the immediate
    inc    cl          ; always 2 bytes.  The 2B encoding of inc cx would work, too.

    ; want: 16-bit cl=1.   32-bit: cl=0
    inc    cx       ; 64-bit: REX prefix
    shr    al, cl   ; 64-bit: shr r8b, cl doesn't affect AL at all.  32-bit cl=1.  16-bit cl=2
    ret

이 Linux 프로그램은 exit-status =로 종료 modedetect()되므로 다음과 같이 실행하십시오 ./a.out; echo $?. 정적 바이너리에 모아서 연결합니다. 예 :

$ asm-link -m32 x86-modedetect-polyglot.asm && ./x86-modedetect-polyglot; echo $?
+ yasm -felf32 -Worphan-labels -gdwarf2 x86-modedetect-polyglot.asm
+ ld -melf_i386 -o x86-modedetect-polyglot x86-modedetect-polyglot.o
32
$ asm-link -m64 x86-modedetect-polyglot.asm && ./x86-modedetect-polyglot; echo $?
+ yasm -felf64 -Worphan-labels -gdwarf2 x86-modedetect-polyglot.asm
+ ld -o x86-modedetect-polyglot x86-modedetect-polyglot.o
64

## maybe test 16-bit with BOCHS somehow if you really want to.

버전 1, 2, 3의 번호를 지정할 수있는 경우 7 바이트 (점수 = 2.33)

다른 x86 모드에 대한 공식 버전 번호는 없습니다. 나는 asm 답변을 쓰는 ​​것을 좋아합니다. 방금 모드 1,2,3 또는 0,1,2를 호출하면 문제의 의도를 위반한다고 생각합니다. 그러나 그것이 허용된다면 :

 # 16-bit mode:
42                                  detect123:
43 00000020 B80300                      mov ax,3
44 00000023 FEC8                        dec al
45                                  
46 00000025 48                          dec ax
47 00000026 C3                          ret

32 비트 모드에서 다음과 같이 디코딩

08048080 <detect123>:
 8048080:       b8 03 00 fe c8          mov    eax,0xc8fe0003
 8048085:       48                      dec    eax
 8048086:       c3                      ret    

64 비트

00000000004000a0 <detect123>:
  4000a0:       b8 03 00 fe c8          mov    eax,0xc8fe0003
  4000a5:       48 c3                   rex.W ret 

이것들이 다른 버전으로 계산되는지 잘 모르겠습니다 . 그들은 단지 다른 시스템 구성과 상관되지 않습니까?
Uriel

1
@Uriel 16 비트 모드, 32- 비트 모드, 또는 64- 비트 모드에서 CPU와 머신 코드의 블록을 실행하는 실행하는 기계 코드 동등한 python2python3같은 파이썬 프로그램에 해석기. 새로운 x86 CPU에는 항상 구형 CPU와 호환되는 모드가 포함되어 있습니다 (이러한 복잡한 해독하기 어려운 기계 코드 형식을 사용하는 유일한 이유입니다) .386의 32 비트 보호 모드와 x86-64의 긴 모드는 실제로 x86 머신 코드의 새로운 버전. 긴 모드는 일부 opcode를 제거하여 무효화했습니다.
Peter Cordes

5

Brachylog / Brachylog v1 , 5/2 = 2.5

2,1hw

온라인으로 사용해보십시오! (브라질 로그)

온라인으로 사용해보십시오! (브라질 로그 v1)

Brachylog에 대한 설명 :

?2,1hw.
?2      Unify ? (input) with 2 (no input so it succeeds)
  ,1    Append 1 (21)
    h   First element/head (2)
     w. Write to STDOUT and unify with output (not displayed)

Brachylog v1에 대한 설명 :

?2,1hw.
?2      Unify ? (input) with 2 (no input so it succeeds)
  ,     Break implicit unification/logical AND
   1h   Take first element/head of 1 (1)
     w. Write to STDOUT and unify with output (not displayed)

큰! (!) 참고로, 2,1Brachylog의 V2의 목록 구성하지 않습니다 [2,1](이 2;1오히려 번호 것)를하지만, 21(당신이 직장에 답을 구성하는 방식을 변경하지 않습니다).
페이탈 라이즈

@Fatalize Ooh 고맙습니다. Jelly와 혼동을
일으켰습니다

@Fatalize BTW 2;1는 Brachylog v1에서 ;논리적 OR 을 의미하는 것으로 작동하지 않았을 것입니다.
아웃 골퍼 Erik 14

5

C89 / C99, 25 바이트, 2 개 버전, 점수 = 12.5

#include <stdio.h>

int main() {
    int v = 11 //**/ 11
            + 88;
    printf("C%d\n", v);
    return 0;
}

// C89에서는 스타일 주석이 인식되지 않습니다.

골프 버전 :

v(){return 20//**/2
+79;}

온라인으로 사용해보십시오 : C89 , C99


대신 int v()main(), 그것은 짧은이고 실제로 완전한 프로그램으로 컴파일!
Andrea

@ 안드레아 감사합니다. AFAIK, 기능 또는 전체 프로그램을 게시 할 수 있습니다.
nwellnhof

당신은 맞습니다.
안드레아

5

Perl 5 및 Perl 6, 23 바이트 19 바이트, 점수 9.5

print 6-grep '.',''

Perl 5의 grep첫 번째 op는 항상 Perl 6이 아닌 정규식으로 처리됩니다.


점수는 19/2입니다 = 9.5
Daniel Vestøl

5

배쉬, 모든 4 가지 버전, 72 71 32 바이트 ⇒ 점수 = 8

s=$'\ua\xa\n';expr 5 - ${#s} / 2

이 코드는 $'...'각 버전의 Bash에서 서로 다른 문자열 해석을 사용 합니다.
메이저 버전 번호를 출력합니다.

문서가 여기에 있습니다 .

언 골프 드 :

s=$'\ua\xa\n';
expr 5 - ${#s} / 2
# Bash v4 sees three linefeeds => length of 3 => 5 - 3 / 2 = 4
# Bash v3 sees the literal '\ua' + two linefeeds: 5 chars in length
#    => 5 - 5 / 2 = 3
# Bash v2 sees '\ua\xa' + linefeed, 7 chars: 5 - 7 / 2 = 2
# Bash v1 does not even interpret $'..' strings, and sees literally '$\ua\xa\n' of length 9 => 5 - 9 / 2 = 1

이 답변은 반쯤 추측입니다. 나는 bash 4와 3에서만 테스트했지만 다른 버전에서도 작동해야합니다.

그것이 있거나없는 경우 알려주세요, 나는 다른 버전을 사용할 수있는 즉시 시도합니다.

Jens 덕분에 -1 문자.
Digital Trauma (전체 expr아이디어) 덕분에 -29 바이트 !


쉘 문법은 ;;마지막 대안에서 필요하지 않습니다 . ;바이트를 면도하는 데 사용 합니다.
Jens

1
방금 bash-2.05a (지금 Cygwin 용으로 컴파일)에서이 작업을 시도했는데 "2"가 아니라 "3"이 잘못보고됩니다. (
Jason Musgrove

1
해석 $'\xN기능이 2.01.1에 추가 된 것 같습니다 ... 답변을 업데이트해야합니다. 작업 중
joH1

이걸 해봐도 될까요? s="$'\ua\xa\n'";case ${#s} in 3)echo 4;;5)echo 3;;7)echo 2;;9)echo 1;esac
joH1

1
이 같은 골프를 할 수 있습니다 s=$'\ua\xa\n';expr 5 - ${#s} / 2. 이것은 v3 및 v4에서 작동합니다. 지금 시도 할 이전 버전은 없습니다.
디지털 외상

4

R, 버전 2 및 3, 10.5 점

cat(exists("cite")+2)

이 명령은 2R 2.xx 및 3R 3.xx에 대해 리턴 합니다. 이 기능 cite은 R 버전 3.0.0에서 추가되었습니다. 따라서 명령 exists("cite")FALSER 2.xx 및 TRUER 3.xx에 대해 리턴 합니다.

R, 모든 버전 (1, 2 및 3), 점수 : 12⅓

e=exists;cat(e("cite")+e("eapply")+1)

이 기능 eapply은 R 2.0.0에서 도입되었습니다.


R.version$major. 15 자 언제부터 존재하지 않습니다.
Rui Barradas

@RuiBarradas OP를 인용하겠습니다. " 프로그램에서 언어 버전을 확인하기 위해 내장, 매크로 또는 사용자 정의 컴파일러 플래그를 사용할 수 없습니다. "
Sven Hohenstein

알았어, 미안, 나는 그 부분을 놓쳤다. 댓글을 삭제해야합니까?
Rui Barradas

@RuiBarradas 문제 없습니다. 주석을 삭제할 필요가 없습니다.
스벤 호헨 슈타인

결과 인쇄를 처리해야합니다. 현재 전체 프로그램으로 실행하면 아무것도 인쇄되지 않습니다.
JAD

4

Python , 196 바이트 / 16 개 버전 = 12.25 점

버전은 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5 및 3.6입니다.
불행히도 모듈이 없기 때문에 2.7을 생략해야했습니다. 2.6에 없지만 3.0에있는 것은 (내가 알 수있는 한).

i=15
try:
 for m in'os.atexit.os.os.os.warnings.cgitb.heapq.collections._ast.abc.queue.os.os.os.importlib.argparse.lzma.asyncio.zipapp.secrets.'.split('.'):__import__(m);i=i+1
except:print(i/10.)

우리는 다른 버전의 파이썬에서 소개 된 많은 모듈을 반복하고 첫 번째 오류에서 종료하고 버전을 반환합니다. 주요 버전 사이의 간격은 반복적으로 가져 와서 채워집니다 os. 파이썬 1.5 테스트는 string.split1.6까지 존재하지 않는 것에 의존합니다 .

에 신용 올리비에 그레 구 아르의 대답 루프에서 새로운 클래스 / 모듈에 대한 테스트의 아이디어.

나는 마침내 모든 관련 파이썬 버전을 테스트했다.


4

Windows의 배치 파일 , 35 바이트 / 2 버전 = 점수 17.5

@if /i Z==z @echo NT&exit
@echo DOS

DOSMS-DOS (duh)NTWindows NT에서 인쇄 합니다 . (두)

이제 몇 가지 설명을하겠습니다.

Windows는 MS-DOS 이후로 배치 스크립팅을 해왔으며 그 이후로 많이 바뀌지 않았습니다. 그러나 Windows NT 가 나왔을 때 Microsoft는 배치 스크립트의 기본 인터프리터를에서 COMMAND.COM로 변경했습니다 cmd.exe(이제 .cmd원래 확장 의 대안으로 확장도 허용 함 .bat).

이를 통해 조건부에서 문자열 대 / 소문자를 무시 하는 플래그 와 같은 몇 가지 변경 사항 도 구현했습니다 /i. 즉, Z==z거짓이지만 /i Z==z사실입니다.

우리는 DOS가 대소 문자를 구분하지 않고 대문자 Z와 소문자를 비교한다는 것을 이용합니다 z. /i플래그 를 사용하면 Z==zDOS에서는 조건 이 (false z==z), NT에서는 (true)가됩니다.

이제 도전 과제는 버전 번호를 인쇄해야한다는 것을 알고 있습니다. 그러나 내가 아는 한 배치 스크립팅에는 '버전 번호'가 없으므로 이것이 내가 얻을 수있는 가장 가까운 것입니다.


Windows 10, DOSBox 및 vDos에서 테스트되었습니다.

윈도우 10:

윈도우 10

(에서 cmd /k창을 닫는 것을 방지하기 위해 실행 exit)

DOSBox :

도스 박스

vDos :

vDos


Windows 7가 Windows 보다 짧습니다 NT.
user202729 년

2
@ user202729 나는 다시 한 번 7언어 버전이 아니라고 생각합니다. 3.1 이후 모든 Windows에서 동일했습니다. 그래서 나는 7그것이 어쩌면 그럴지도 모릅니다.3.1
Matheus Avellar

3

Wolfram 언어 / 수학 10/11, 37 바이트 / 2 버전 = 18.5

고려 (Length@DateRange[{1},{1}][[1]]+27)/337 바이트에서 2 개 버전 작업, 나에게 18.5의 점수를 제공합니다.

In[1]:= $Version

Out[1]= "10.4.1 for Microsoft Windows (64-bit) (April 11, 2016)"

In[2]:= (Length@DateRange[{1}, {1}][[1]] + 27)/3

Out[2]= 10

In[1]:= $Version

Out[1]= "11.1.1 for Microsoft Windows (64-bit) (April 18, 2017)"

In[2]:= (Length@DateRange[{1}, {1}][[1]] + 27)/3

Out[2]= 11

더 효율적인 방법이 있다고 확신하지만 DateRange 출력 간의 불일치가 최근에 저를 물었습니다. 그래서 사용했습니다.

후속 조치로 누군가 Mathematica 버전 1 ~ 8에서 Length@DateRange[{1}, {1}][[1]]평가하는 이점을 활용할 수 1있었지만 그것을 통합 할 시간이 없었습니다.


2
답이 프롬프트의 요구 사항, 즉 다음을 사용한 마지막 규칙을 충족하지 않는지 확인하십시오 $Version.Your program may not use a builtin, macro, or custom compiler flags to determine the language version.
Amndeep7

7
나는 $Version그것이 올바른 버전으로 올바른 결과를 출력하고 $Version내 대답의 일부가 아님 을 증명하기 위해 사용 하고 있습니다 ...
user6014

모든 좋은 친구-문제는, 당신은 같은 것을 사용하고 $VersionNumber있지만 대신에 당신이 그것을 부르는 것 $Version입니다. 내 생각에, 프로그램의 Length@DateRange핵심 은 $Version중요하지만 처리 한 전체 버전 정보를 제공 하지 않으면 작동하지 않으므로 규칙을 위반합니다.
Amndeep7 '

4
@ Amndeep7 제출은 첫 번째 단락에 인라인 된 37 바이트 코드입니다. 코드 블록은 출력 데모 일뿐입니다.
PurkkaKoodari

3
설명 : 다른 버전에서 다른 시간 형식을 사용합니다. 즉, 이상 golfed 수 {1} Tr[1^#&@@%~DateRange~%]/3+9(31 바이트), 또는 7+Length@Now(12 바이트)
user202729

3

Ruby 1.x 및 2.x, 20 바이트, 10 점

p [].to_h&&2rescue 1

Ruby 2 to_h에서 Array클래스에 도입 된 방법을 기반으로합니다 .


좋은 첫 번째 대답. 테스트하기에 편리한 1.x는 없지만 p [].to_h&&2rescue 1조금 더 짧습니다.
manatwork

@manatwork Great, 3 바이트를 절약하고 매력처럼 작동
Philipp Frank

3

얼랭, 180 바이트, 11 개 버전, 16.36 점

20-length([A||A<-[schedulers,c_compiler_used,cpu_topology,snifs,dynamic_trace,port_count,nif_version,end_time,max_heap_size,atom_count],{'EXIT',_}<-[catch erlang:system_info(A)]]).

들여 쓰기 및 줄 바꿈 :

20-length([A||A<-
                  [schedulers,
                   c_compiler_used,
                   cpu_topology,
                   snifs,
                   dynamic_trace,
                   port_count,
                   nif_version,
                   end_time,
                   max_heap_size,
                   atom_count],
              {'EXIT',_}<-[catch erlang:system_info(A)]]).

10 이후 각 주요 버전의 부 릴리스 하나에서 테스트되었습니다.

  • R10B-9
  • R11B-5
  • R12B-5
  • R13B04
  • R14B04
  • R15B03
  • R16B03
  • 17.5.6.2
  • 18.2.1
  • 19.2
  • 20.0

모든 주요 릴리스에는 함수에 대해 허용 가능한 새로운 인수가 하나 이상 추가 erlang:system_info되었으므로 목록의 항목을 시도하고 실패 횟수를 세고 실패한 횟수를 20에서 빼십시오 (현재 버전).


3

Julia 0.4, 0.5, 46 바이트, 22 점

f(::ASCIIString)=.4
f(::String)=.5
f()=f("")

Julia는 콘크리트 및 추상 문자열 유형의 유형 이름을 여러 버전에서 변경했습니다.

이 코드는 특히 다음을 활용합니다.

줄리아 0.4 :

  • 콘크리트는 ASCIIString,
  • 초록은 공식적 AbstractString으로
  • 초록이에 별칭이 사용되지 않습니다 String.
  • 콘크리트는 초록보다 가장 구체적이므로 파견됩니다

줄리아 0.5 :

  • 콘크리트는 공식적 String으로
  • 콘크리트가에 대한 별칭이 더 이상 사용되지 않습니다 ASCIIString.
  • 초록은 AbstractString(여기서는 중요하지 않지만)
  • 구체적인 문자열 유형에 대해 두 가지 방법이 정의되었으므로 후자가 전자를 덮어 씁니다.

다른 원칙을 기반으로 한 더 새로운 최신 솔루션 참조


3

apt (1 & 2), 8 6/2 = 4 3

'1r\S2

테스트 v1  |   테스트 v2

  • Oliver 덕분에 2 바이트 절약

설명

v2 이전에는 Japt가 사용자 정의 된 RegEx 구문을 사용 했으므로이를 활용할 수 있습니다.

'1

문자열로 숫자 1입니다.

 r  2

r아래의를 ( )로 교체하십시오 2.

\S

JAPT 2는 정규식으로 이것을보고 /\S/g성냥, 1. Japt 1은 \이스케이프 문자를 무시하고 S공백 문자에 대한 Japt 상수 인을 보았으며 분명히와 일치하지 않습니다 1.


3

Befunge, 점수 = 3.5

7 바이트, 2 개 버전

"]"'b.@

Befunge-93
에서 온라인으로 사용해보십시오. Befunge-98에서 온라인으로 사용해보십시오.

"]"는 두 버전 모두에서 문자열 리터럴이며 [스택에 93 (ASCII 값 )을 푸시합니다. 'b는 Befunge-98에서 문자 리터럴로 98 (ASCII 값 b)을 눌렀지만 Befunge-93에서는 유효하지 않은 명령이므로 간단히 무시됩니다. 따라서 Befunge-93의 스택 맨 위에 93과 Befunge-98의 98로 끝납니다. .@스택 맨 위에 값을 쓴 다음 종료합니다.


]".@.b'또는 ]g.@.b'
MildlyMilquetoast

3

루비 1.x (<1.9) 및 2.x, 10 8 바이트, 점수 = 4

$><<?2%7

시도 해봐:

이것은 ?xRuby 1.x와 2.x 사이 의 다른 동작을 이용하여 작동합니다 . ?A예를 들어 Ruby 1.x에서는 ( 65문자의 ASCII 값 )을 반환 A하지만 Ruby 2.0에서는 1 자 문자열을 반환합니다 "A".

위의 코드는 다음과 같습니다.

val = ?2
$> << val % 7

Ruby 1.x (<1.9)에서 값은 Fixnum 인 valis 50(문자의 ASCII 값)입니다 2. Fixnum#%는 모듈로 연산자이므로를 50 % 7반환합니다 1.

Ruby 2.x val에서 문자열은 "2"입니다. String#%의 접두사 버전 sprintf이므로 형식 문자열이있는 곳 "2" % 7과 같습니다 . 형식 문자열에는 형식 순서 (예 :)가 포함되지 않으므로 후속 인수는 무시되고 반환됩니다.sprintf("2", 7)"2"%d"2"

마지막으로 $>의 별칭 $stdout이므로 $> << ...결과를 인쇄합니다.


1
오, 좋아! 나는 ?A==66?1:2당신의 답변을 발견하기 전에 같은 일을하려고했습니다
Piccolo

3

Python 2Python 3 , 36 34 바이트, 점수 18 17

print(str(hash(float('-inf')))[1])

에서 파이썬이 , 음의 무한대의 해시 -271828하지만에 파이썬 3 는 -314159를합니다. 편집 : @ArBo 덕분에 2 바이트, 1 점의 점수가 절약되었습니다.


곁눈질 이것은 의도적 인 e 대 pi 일입니까?
조 왕

@ 조킹 네; hash부동 소수점 무한대로 작업하도록 처음 수정 되었을 때 관련 개발자는 pi * 1e5 및 e * -1e5를 해시 값으로 사용했습니다. 파이썬 3의 어느 시점에서 음의 무한대에 대한 값이 무한대에 대한 해시 값의 부정으로 변경되었습니다.
Neil

2

Python 3 , Python 2 , 17.5 점

(35 바이트, 2 개 버전)

try:exec("print 2")
except:print(3)

파이썬 2 , 35 바이트

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

파이썬 3 , 35 바이트

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

ETH 프로덕션 덕분에 5 바이트 절약

좋은 코드 골프 답변은 아니지만 큰 변화입니다!


흠, 당신은 이전 줄에 각 진술을 넣을 수 있습니까? 즉try:exec("print 2")\nexcept:print(3)
ETHproductions

@ETHproductions 감사합니다! 나는 이길 것으로 기대하지 않아서 약간 산만했다. 나는 주로 파이썬 2와 3 사이 커다란 변화 에 초점을 맞추고 싶었다.
jferard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.