source

v = (v == 0 ? 1 : 0 )로 표기하는 더 좋은 방법이 있습니까?

nicesource 2022. 11. 15. 21:39
반응형

v = (v == 0 ? 1 : 0 )로 표기하는 더 좋은 방법이 있습니까?

변수를 0과 1 사이에서 전환하고 싶다.0이면 1로 설정하고 1이면 0으로 설정합니다.

이것은 매우 기본적인 조작이기 때문에, 가능한 한 가장 짧고 명확한 방법을 조사하고 싶다고 생각하고 있습니다.지금까지의 저의 장점은 다음과 같습니다.

v = (v == 0 ? 1 : 0);

당신은 이것을 개선할 수 있습니까?

편집: 질문은 위의 문장을 명확성을 유지하면서 가장 적은 문자로 작성하는 방법을 묻는 것입니다. '실제 질문이 아닌' 이유는 무엇입니까?이것은 코드 골프 연습이 의도된 것은 아니지만, 비록 골프라고 접근하는 사람들로부터 몇 가지 흥미로운 답변이 나왔지만, 골프가 건설적이고 생각을 불러일으키는 방식으로 사용되는 것을 보는 것은 좋은 일이다.

다음과 같이 간단하게 할 수 있습니다.

v = 1 - v;

이것은 물론 변수가 올바르게 초기화되었다고 가정합니다. 즉, 변수의 값은 0 또는 1뿐입니다.

더 짧지만 덜 일반적인 연산자를 사용하는 다른 방법:

v ^= 1;

편집:

확실히 하자면, 나는 이 질문을 코드 골프로 접근한 적이 없다. 단지 오퍼레이터의 부작용과 같은 애매한 속임수를 쓰지 않고 작업을 수행할 수 있는 간단한 방법을 찾기 위해서다.

★★0는 입니다.false 및 ""1는 입니다.truediscloss.discloss 。

v = (v ? 0 : 1);

이 좋으시다면, 사용하실 수 있습니다.true ★★★★★★★★★★★★★★★★★」false

v = !v;

또는 숫자여야 하는 경우:

v = +!v; /* Boolean invert v then cast back to a Number */

v = (v + 1) % 2더 많은 해야 할 해 주세요.2★★★★★★에(n + 1)1, 0, 1, 2를 하면 됩니다v = (v + 1) % 3.

함수를 작성하여 다음과 같이 사용할 수 있습니다.

v = inv(v)

1 이외의 가능성에 관심이 없는 경우:

v = v ? 0 : 1;

위의 경우 v가 0이면 v가 1이 되고 false, undefined 또는 null이면 v가 1이 됩니다.이러한 접근 방식을 사용하여 주의해야 합니다. v가 "hello world"인 경우에도 v는 0이 됩니다.

「 」의 v = 1 - v , 「」v ^= 1 ★★★★★★★★★★★★★★★★★」v= +!v한 효과를 입니다.이것은 아름다운 코드 라인이 아니라 의도된 효과를 얻기 위한 값싼 속임수입니다. 1 - v 「1 한다」, 「0」1로 .이로 인해 코드의 표현력이 떨어지고 다른 개발자가 코드를 해석해야 하는 장소(작은 장소이긴 하지만)가 도입됩니다.

'하다'와 같은 있습니다.v = toggle(v)을 사용하다

(이 "답변"에 대한 투표 수를 감안할 때 정직성과 수학적 진실성이 제가 답을 편집하게 만들었습니다. 나는 그것이 "깊이"가 아니라 짧은 비꼬는 것을 의도했기 때문에 가능한 한 오래 보류했다. 그래서 어떠한 설명도 그 목적에 반하는 것처럼 보였다. 하지만, 코멘트는 오해를 피하기 위해 명확하게 해야 한다는 것을 분명히 하고 있습니다.)

저의 원래 답변은:

사양서 이 부분의 문구:

0이면 1로 설정하고, 그렇지 않으면 0으로 설정합니다.

가장 정확한 솔루션은 다음과 같습니다.

v = dirac_delta(0,v)

첫 번째 고백은 다음과 같습니다.델타 함수가 헷갈렸네요크로네커 삼각주는 조금 더 적절했을 것이다.그러나 내가 원하는 만큼은 아니다(크로네커 삼각주는 주로 정수에만 사용된다).하지만 델타 함수는 전혀 사용하지 말았어야 했어요.

v = characteristic_function({0},v)

분명히 해두죠.함수는 트리플(X,Y,f)이며, 여기X와 Y는 세트(각각 도메인코드메인이라고 함)이며, f는 X의 각 요소에 Y의 요소를 할당하는 규칙입니다.우리는 종종 트리플(X,Y,f)을 f:X Y로 쓴다. 예를 들어 X의 부분 집합인 A가 주어졌을 때, 함수A θ:X → {0,1}인 특성 함수가 있다(이것은 또한 θ나 δ와 같은 큰 공역 함수로 생각할 수도 있다).이 함수는 규칙에 의해 정의됩니다.

θA(x) = x a A의 경우 1A, x a A의 경우 θ(x) = 0.

진실 표를 좋아하면 "X의 요소 x가 부분 집합 A의 요소인가?"라는 질문에 대한 진실 표입니다.

따라서 이 정의에서 특성 함수가 필요한 것이 분명합니다. X에는 0과 A = {0}이(가) 포함되어 있습니다.그렇게 적었어야 했는데.

델타 함수도 마찬가지입니다.이를 위해서는 통합에 대해 알아야 합니다.이미 알고 있거나 모르거나 둘 중 하나야그렇지 않으면 이론의 복잡성에 대해 여기서 할 수 있는 말은 없지만 한 문장으로 요약할 수 있습니다.집합 X에 대한 척도는 본질적으로 "평균을 작동시키는 데 필요한 것"입니다.즉, 집합 X와 집합에 측정값 μ가 있다면, X → δ라는 함수의 클래스가 있다는 것입니다. 이 함수는 식 Xθ f 의미가 있고, 어떤 의미에서는 f/X의 "평균"입니다.

세트에 대한 측정값을 지정하면 해당 세트의 하위 집합에 대한 "측정값"을 정의할 수 있습니다.이는 특성 함수의 적분을 서브셋에 할당함으로써 이루어집니다(측정 가능한 함수라고 가정).이것은 무한 또는 정의되지 않은 경우가 있습니다(두 가지는 미묘하게 다릅니다).

주변에는 여러 가지 대책이 있지만, 여기서 중요한 것은 두 가지가 있습니다.하나는 실선상의 표준 척도인 δ입니다.이 측정에서 θ f dμ는 학교에서 배우는 것과 거의 같다(미적분학은 지금도 학교에서 가르치는가?). 작은 직사각형을 합산하여 점점 더 작은 폭을 취한다.이 측정에서 간격의 척도는 폭입니다.점의 측정값은 0입니다.

모든 세트에 적용되는 또 다른 중요한 척도는 포인트 측정이라고 불립니다.함수의 적분이 해당 값의 이 되도록 정의됩니다.

X f dμ =x ∈X f f(x)

이 측정치는 각 싱글톤 세트에 측정값 1을 할당합니다.즉, 서브셋 자체가 유한한 경우에만 측정값이 유한하다는 것을 의미합니다.그리고 유한 적분을 갖는 함수는 거의 없습니다.함수에 유한 적분이 있는 경우 수 있는 점 개수에서만 0이 아니어야 합니다.따라서 여러분이 알고 있는 대부분의 함수는 이 측정치에 따라 유한 적분이 아닙니다.

이제 델타 함수로 넘어가죠.매우 넓은 정의를 내려보자.측정 가능한 공간(X, μ)과 원소 a x X가 있습니다. 우리는 (a에 따라) 델타a 함수를 ((x) = 0 if x a a 및 Xa = 1의 성질로 "함수"가a 되도록 "수정"합니다.

이에 대한 가장 중요한 사실은 다음과 같습니다.델타 함수는 함수일 필요는 없습니다.적절하게 정의되어 있지 않습니다.나는a ((a)가 무엇인지 말하지 않았다.

이 시점에서 당신이 무엇을 할지는 당신이 누구냐에 달려있다.이곳의 세계는 두 가지 범주로 나뉜다.수학자인 경우 다음과 같이 말할 수 있습니다.

델타 함수는 정의되지 않았을 수 있습니다.그 가상의 성질을 살펴보고 그것이 정의된 곳에 적절한 집을 찾을 수 있는지 알아보겠습니다.그렇게 할 수 있고, 결국 분배를 하게 됩니다.이것들은 (필연적으로) 기능이 아니라 조금 기능적으로 동작하는 것으로, 기능인 것처럼 취급할 수 있는 경우가 많습니다만, 없는 것(예를 들면 「값」)도 있기 때문에 주의가 필요합니다.

수학자가 아닌 경우 다음과 같이 말할 수 있습니다.

델타 함수가 제대로 정의되지 않았을 수 있습니다.누가 그래?수학자 무리?무시해!그들은 무엇을 알까?

청중의 기분을 상하게 했으니 계속하겠습니다.

dirac delta는 일반적으로 표준 측정값과 함께 실제 라인에서 점(종종 0)의 델타 함수로 간주됩니다.그래서 제 삼각주를 모른다고 댓글에 불평하는 사람들은 이 정의를 사용하고 있기 때문에 그렇게 하고 있습니다.그들에게 사과한다: 수학자의 변호(Humpty Dumpty에 의해 대중화된 것처럼: 단순히 그것이 맞도록 모든 것을 재정의함)를 사용함으로써 나는 꿈틀거릴 수 있지만, 뭔가 다른 것을 의미하기 위해 표준 용어를 사용하는 것은 잘못된 형식이다.

하지만 내가 원하는 기능을 하는 델타 함수가 있고, 이것이 내가 여기서 필요로 하는 것이다.집합 X에 대해 점측정을 하면 델타함수의 기준을 만족시키는 순함수 : : X → whicha 있다.왜냐하면 함수 X θ는 a를 제외하고 0이고 모든 값의 합이 1인 함수 X → δ를 찾고 있기 때문입니다.이러한 함수는 간단합니다. 유일하게 누락된 정보는 a에서의 이며, 합계가 1이 되도록 하려면 값 1을 할당합니다.이것은 다름 아닌 {a}의 특성 함수입니다.그 후, 다음과 같이 입력합니다.

X δa dμ =x ∈ X ( δaa = ((x) = ((a) = 1이다.

이 경우, 싱글톤 집합의 경우 특성 함수와 델타 함수가 일치합니다.

결론적으로, 여기에는 세 가지 '기능' 패밀리가 있습니다.

  1. 싱글톤 세트의 특징적인 기능,
  2. 델타 기능은
  3. 크로네커 삼각주는 기능한다.

이 중 두 번째는 가장 일반적인 것으로, 다른 것은 포인트 측정치를 사용할 때의 예입니다.그러나 첫 번째와 세 번째 기능은 항상 진정한 기능이라는 장점이 있습니다.세 번째는 특정 도메인 패밀리(정수 또는 일부 도메인)에 대한 첫 번째 특수한 경우입니다.

그래서 마지막으로, 제가 처음에 답을 썼을 때, 저는 제대로 생각하지 않았습니다(먼저 생각했을 때 제가 무슨 말을 하고 있는지 알고 있다는 을 증명하고 싶었기 때문에, 저는 혼란스러웠다고까지는 말하지 않았습니다만, 그다지 많이 생각하지 않았습니다).디락 델타(dirac delta)의 통상적인 의미는 여기서 원하는 것이 아닙니다만, 제 답변의 요점 중 하나는 입력 도메인이 정의되지 않았기 때문에 크로네커 델타(Kronecker delta)도 맞지 않았을 것입니다.따라서 (내가 목표로 하고 있던) 가장 좋은 수학 은 특징적인 함수였을 것이다.

이 모든 것이 명확해졌으면 좋겠고, TeX 매크로 대신 HTML 엔티티를 사용하여 수학적인 글을 쓸 필요가 없어졌으면 좋겠습니다.

일반적으로 두 값 간에 전환이 필요할 때마다 두 개의 전환 값 합계에서 현재 값을 뺄 수 있습니다.

    0,1 -> v = 1 - v
    1,2 -> v = 3 - v
    4,5 -> v = 9 - v 

할 수 있다

v = Math.abs(--v);

을 0 0을 -1로 설정합니다.Math.abs을 +변환합니다1을 +1로 변환합니다.

1 또는 0 정수여야 하는 경우 괄호는 필요 없지만 수행 방법은 문제가 없습니다.이러한 a를 부울런으로 사용하는 경우는, 다음의 조작을 실시합니다.

v = !v;
v = v == 0 ? 1 : 0;

그만해!

솔루션 목록

제가 제안하고 싶은 세 가지 해결책이 있습니다. 어떤 이라도 두모 any any any any any any any all all all any any any any로 합니다.0 ( ( ( )1,true( (등)1 ( ( ( )0,false,null 삭제:

  • v = 1*!v
  • v = +!v
  • v = ~~!v

한, 이미, ,, 언, 언, 개, 개, 개, 개, 개, 개, 개, 개, 개, 개, 개, 개, 개, 개, 개, 개, 개, 개, for, for, for, for, for, for, for, for, , for,0 §1s):

  • v = 1-v

솔루션 1

다음 솔루션을 사용할 수 있습니다.

v = 1*!v

부울('부울')로됩니다.0로로 합니다.True도 '''로 지정합니다.False됩니다.1결과적으로.0 will will will will will will 로 변환됩니다.1도 '''로 지정합니다.0.

그 증거로서 이 jsfiddle을 참조하여 테스트하고 싶은 값을 입력합니다.jsfiddle.net/rH3g5/

결과는 다음과 같습니다.

  • -123됩니다.0 ,
  • -10됩니다.0 ,
  • -1됩니다.0 ,
  • 0됩니다.1 ,
  • 1됩니다.0 ,
  • 2됩니다.0 ,
  • 60됩니다.0 ,

솔루션 2

mblase75가 지적한 바와 같이, jandy는 제 솔루션과 같은 다른 솔루션을 가지고 있었습니다.

v = +!v

, " "는 "를 사용합니다.+1*정수로 변환합니다.이치노

솔루션 3

은 '보다 낫다'입니다.~~★★★★★★★★★★★★★★★★★★:

v = ~~!v

이는 매우 드물며 항상 부울에서 정수로 변환됩니다.

또 다른 답변, 코멘트, 그리고 제 의견을 종합하면, 저는 두 가지를 조합할 것을 제안합니다.

  1. 전환 기능을 사용합니다.
  2. 이 기능에서는, 보다 읽기 쉬운 실장을 사용합니다.

이것은 라이브러리에 배치하거나 다른 Javascript Framework용 플러그인으로 래핑할 수 있는 기능입니다.

function inv(i) {
  if (i == 0) {
    return 1
  } else {
    return 0;
  }
}

용도는 다음과 같습니다.

v = inv(v);

장점은 다음과 같습니다.

  1. 코드 중복 없음
  2. 나중에 이 내용을 다시 읽으면 최소한의 시간 내에 코드를 이해할 수 있습니다.

다음 항목이 누락되었습니다.

v = [1, 0][v];

라운드 로빈으로도 동작합니다.

v = [2, 0, 1][v]; // 0 2 1 0 ...
v = [1, 2, 0][v]; // 0 1 2 0 ...
v = [1, 2, 3, 4, 5, 0][v]; // 0 1 2 3 4 5 ...
v = [5, 0, 1, 2, 3, 4][v]; // 0 5 4 3 2 1 0 ...

또는

v = {0: 1, 1: 0}[v];

마지막 솔루션의 특징은 다른 모든 값과 함께 작동합니다.

v = {777: 'seven', 'seven': 777}[v];

과 (변화)값, (변화)값, (변화)값, (변화)값, (변화)값 을 얻습니다.undefined을 사용하다

v = { undefined: someValue }[v]; // undefined someValue undefined someValue undefined ...

왜 스스로 불란을 만들고 싶어 하는지 모르겠군요?펑키한 구문은 좋지만, 왜 이해할 수 있는 코드를 쓰지 않는가?

이것은 최단/최고속은 아닙니다만, 가장 알기 쉬운(모든 사람이 읽을 수 있는) 것은, 잘 알려진 if/else 스테이트를 사용하고 있습니다.

if (v === 0)
{
  v = 1;
}
else
{
  v = 0;
}

확실히 하고 싶다면 숫자 대신 부울란을 사용해야 합니다.대부분의 경우 속도가 충분히 빠릅니다.부울란에서는 다음 구문만 사용하면 됩니다.이 구문에서는 단축성이 우수합니다.

v = !v;

기존 솔루션의 또 다른 형태:

v = Number(v == 0);

편집: TehShrike와 Guffa가 원래 솔루션의 오류를 지적해 주셔서 감사합니다.

좀 더 분명하게 말할게요.

무인 does does 가 뭐죠?v

예를 들어 v가 어떤 상태일 때.오브젝트 Status를 만듭니다.DDD의 값 객체.

이 값 객체에 로직을 구현합니다.그런 다음 보다 읽기 쉬운 방법으로 코드를 작성할 수 있습니다.상태를 전환하려면 현재 상태에 따라 새 상태를 만듭니다.그런 다음 if 문/로직이 오브젝트에 캡슐화되며, 이를 해제할 수 있습니다.valueObject는 항상 불변하기 때문에 ID가 없습니다.따라서 가치를 변경하려면 새 값을 생성해야 합니다.

예:

public class Status
{
    private readonly int _actualValue;
    public Status(int value)
    {
        _actualValue = value;
    }
    public Status(Status status)
    {
        _actualValue = status._actualValue == 0 ? 1 : 0; 
    }

    //some equals method to compare two Status objects
}

var status = new Status(0);

Status = new Status(status);

JavaScript이기 할 수 .+ int로 :

v = +!v;

은 논리적으로 타당할 것이다.NOT의 의 값vtruev == 0 ★★★★★★★★★★★★★★★★★」falsev == 1그런 다음 반환된 부울 값을 대응하는 정수 표현으로 변환합니다.

또 다른 방법:

v = ~(v|-v) >>> 31;

더 : 나나: :v=++v%2

(C 서 단 단 단 단 ( ( ( ( ( ( ( ( ( ( ) 。++v%=2)

ps. 네, 이중 할당인 것은 알지만, 이것은 C 메서드의 미가공 개서일 뿐입니다(현재로서는 동작하지 않기 때문에 JS 프리 인크리먼트 연산자는 lvalue를 반환하지 않습니다).

입력이 1 또는 0임을 보증하는 경우 다음을 사용할 수 있습니다.

v = 2+~v;

: ★★★★★★★★★★★★★★★★:v = Math.pow(v-1,v)1로 0으로 하다

어레이 {1,0}을(를) 정의하고 v를 v[v]로 설정합니다. 따라서 값이 0인 v는 1이 되고 vica는 1이 됩니다.

또 다른 창의적인 방법으로는v모든 값과 같으면 항상 반환됩니다.0또는1

v = !!v^1;

v의 가능한 값이 0과 1일 경우 정수 x에 대해 v = Math.pow(((Math.pow(x, v) - x), v););는 값을 바꿉니다.

이게 추악한 해결책이라는 걸 알아요 작전본부는 이걸 찾고 있지 않았어요화장실에 있을 때 다른 해결책을 생각하고 있었어요.p

테스트 안 해봤지만 부울을 찾는다면var v = !v과가있있 있있있다다

참고 자료: http://www.jackfranklin.co.uk/blog/2011/05/a-better-way-to-reverse-variables

v=!v;

v=0 및 v=1에서 작동하며 상태를 전환합니다.

이 경우(0, 1)와 같이 2개의 값만 있으면 int를 사용하는 것은 낭비라고 생각합니다.오히려 부울을 선택하고 비트 단위로 작업합니다.추측하는 것은 알지만 두 상태 간에 전환이 가능한 경우에는 부울이 이상적인 선택인 것 같습니다.

v = 번호(!v)

Inverted Boolean 값을 원하는 출력인 Number로 입력합니다.

자, Javascript에서는 Boolean 비교만이 예상된 결과를 얻을 수 있다는 것을 알고 있습니다.

ㅇㅇㅇ.v = v == 0그걸로 충분해.

그 코드는 다음과 같습니다.

var v = 0;
alert("if v  is 0 output: " + (v == 0));

setTimeout(function() {
  v = 1;
  alert("if v  is 1 Output: " + (v == 0));
}, 1000);

JSFiddle:https://jsfiddle.net/vikash2402/83zf2zz0/

도움이 되기를 바랍니다:)

언급URL : https://stackoverflow.com/questions/6911235/is-there-a-better-way-of-writing-v-v-0-1-0

반응형