언어 쇼케이스


507

노트

  • 이 스레드는 커뮤니티가 예외를 만들기로 결정한 경우에만 개방 및 잠금 해제됩니다 . 제발 하지 않는 당신이 여기에 비슷한 질문을 할 수 증거로이 질문을 사용합니다. 제발 하지 않습니다 추가로 만들 질문.

  • 이것은 더 이상 가 아니고 투표 집계에 의해 스 니펫 길이가 제한되지 않습니다. 이전부터이 스레드를 알고 있다면 변경 사항을 숙지하십시오.

이 글은 여러분이 선호하는 프로그래밍 언어가 제공해야하는 흥미롭고 유용하며 모호하고 독특한 특징을 보여줍니다. 이것은 도전이나 경쟁이 아니라 가능한 많은 프로그래밍 언어를 가능한 한 많이 선보이는 공동 노력입니다.

작동 원리

  • 모든 답변에는 게시물 맨 앞에 프로그래밍 언어 이름이 포함되어야하며 앞에 접두사가 붙습니다 #.

  • 답은 하나의 사실 만, 즉 언어를 설명하는 코드가없는 몇 개의 문장을 포함 할 수 있습니다.

  • 사실과는 별도로 프로그램이나 함수일 수는 있지만 코드 조각으로 구성되어야합니다.

  • 스 니펫은 관련 될 필요가 없습니다. 실제로 너무 관련된 스 니펫은 중복 될 수 있습니다.

  • 이것은 컨테스트가 아니므로 모든 프로그래밍 언어는 생성 될 때마다 환영합니다.

  • 소수의 코드 스 니펫을 포함하는 답변은 스택 스 니펫을 사용 하여 팩트와 스 니펫 중 하나를 제외한 모든 항목을 축소 해야합니다 .

  • 가능할 때마다 프로그래밍 언어 당 하나의 답변 만 있어야합니다. 이것은 커뮤니티 위키이므로 스 니펫을 직접 만들지 않은 경우에도 답변에 추가 할 수 있습니다. 게시물을 압축하기위한 스택 스 니펫 이 있으며 이는 30,000 자 제한의 영향을 완화해야합니다.

이 지침 이전의 답변은 편집해야합니다. 필요에 따라 업데이트하십시오.

언어 이름별로 알파벳순으로 정렬 된 현재 답변

$.ajax({type:"GET",url:"https://api.stackexchange.com/2.2/questions/44680/answers?site=codegolf&filter=withbody",success:function(data){for(var i=0;i<data.items.length;i++){var temp=document.createElement('p');temp.innerHTML = data.items[i].body.split("\n")[0];$('#list').append('<li><a href="/a/' + data.items[i].answer_id + '">' + temp.innerText || temp.textContent + '</a>');}}})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><base href="http://codegolf.stackexchange.com"><ul id="list"></ul>

답변:


414

매스 매 티카

이 순서는 작성된 순서이므로 아래에서 위까지 읽을 수 있으며 일부 설명은 이전 스 니펫을 참조하거나 아래에서 설명합니다.

목록이 꽤 길어지고 있습니다. 덜 흥미로운 스 니펫을 제거하기 시작했고 이제 스 니펫을 건너 뛰기 시작합니다. 최대 41 개 스 니펫의 전체 목록은 개정 히스토리 를 참조하십시오. 일부 실제 보석의 경우 스 니펫 81 , 64 , 44 , 23 , 19 , 128을 확인하십시오 .

길이 143 및 144 스 니펫

마지막으로 ... 나는 이것을 잠시 기다렸다 (그리고 오랫동안 골프를해서 더 이상 기다릴 필요가 없다). 앞에서도 수치 적으로 방정식을 사용할 수 있으며 미분 방정식을 해결할 수도 있다고 언급했습니다. 나는 그에 대한 사소한 예를 보여주고 싶었다.

막대에 이중 진자를 고려하십시오 (예 : 진자에 다른 진자 부착). 각 막대는 단위 길이를 가지며 두 진자 무게 각각은 단위 질량을가집니다. 또한 단위 중력을 사용하여 방정식을 단축했습니다. 다음 143 자 코드 스 니펫 은 이러한 시스템에 대한 라그랑지안 운동 방정식 (진자 각도 및 각 운동량 a)을 해결합니다. Lagrangian 역학에 익숙하다면 상당히 간단한 연습이지만 이 PDF에서 파생물을 찾을 수 있습니다 .

골프를 많이 치기 때문에 읽을 수 없습니다.

d@t@t;NDSolve[{#''@t==-#4#2''[t]Cos@d-##3#2'@t^2Sin@d-Sin@#@t&@@@{{θ,φ,1,.5},{φ,θ,-1,1}},θ@0==2,φ@0==1,θ'@t==φ'@t==0/.t->0},{θ,φ},{t,0,60}]

깔끔한 점은 Mathematica가 솔루션의 대략적인 모양을 즉시 표시한다는 것입니다.

여기에 이미지 설명을 입력하십시오

알았어.하지만 약간 절름발이입니다. 우리는 pendula의 움직임이 실제로 어떻게 보이는지 알고 싶습니다. 따라서 여기에 144 자 스 니펫이 있습니다.

Graphics@{Line@{{0,0},p=θ~(h={Sin@#@#2,-Cos@#@#2}&)~t,p+φ~h~t},White,{0,0}~Circle~2.2}~Show~ParametricPlot[θ~h~u+φ~h~u,{u,0,t}]~Animate~{t,0,60}

결과 애니메이션은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

나는 약간의 속임수했다 : 당신이 넘어 플롯 경우 t = 30ParametricPlot기본적으로는 너무 적은 플롯 포인트를 사용하고 라인이 매우 들쭉날쭉하게된다. 그러나 대부분의 흥미로운 역학은 그 시간 이후에 발생하므로 PlotPoints -> 200애니메이션의 후반부를 매끄럽게 보이게 하는 옵션 을 사용했습니다 . 그것은 실질적으로 다르지 않으며, 전반부는 어쨌든 구별 할 수 없을 것입니다.

나는 정말로 마음에 드는 것을 생각해 내지 않으면 이것이 마지막 스 니펫이 될 것이라고 생각합니다. 당신이 이것을 즐기시기 바랍니다!

길이 100 스 니펫

GeoGraphics[{GeoStyling[Opacity[0.5]], NightHemisphere[]}, GeoBackground -> GeoStyling["ReliefMap"]]

Geo100 스 니펫에 대한 멋진 기능에 대해 생각하고 있었지만 궁극적 으로 훔쳐 야 할 Tweet-a-Program 에서 정말 멋진 것을 발견했습니다 . 위의 그림은 구호지도 위에 반구형 밤 반구 모양을 겹쳐서 현재 시간과 낮 동안 지구의 매우 멋진 태양지도를 생성합니다.

여기에 이미지 설명을 입력하십시오

길이 81 스 니펫

CellularAutomaton[{{0,2,3,If[0<Count[#,1,2]<3,1,3]}[[#[[2,2]]+1]]&,{},{1,1}},i,n]

이것이 마지막 셀룰러 오토 마톤임을 약속드립니다. 그러나 바로 81 자로 된 Wireworld 가 있습니다. 이번에는 규칙을 단일 숫자로 인코딩하지 않았습니다 CellularAutomaton. 이번에는 규칙이 단순 함수로 지정되어 셀 주변을 수신하고 셀의 새 값을 리턴합니다. 이것은 2 가지 이상의 색상 / 상태를 가진 셀룰러 오토마타에 대해 훨씬 더 실행 가능한 접근법입니다.

어쨌든, 나는 Wikipedia의 예제 i(신호를 생성하는 두 개의 클럭 및 XOR 게이트)를 설정하고 약 50 단계로 실행하도록했습니다.

여기에 이미지 설명을 입력하십시오

관심이 있다면 실제 플로팅과 애니메이션은 스 니펫 77 일 수 있습니다.

ListAnimate[ArrayPlot[#,ColorRules->{0->Black,1->Blue,2->Red,3->Yellow}]&/@w]

길이 69 스 니펫

DSolve[r^2*R''[r]+2r*R'[r]-R[r]==0&&(R[r]==1&&R'[r]==2/.r->1),R[r],r]

유용한 무언가로 돌아 가기 Mathematica는 일반적인 방정식 시스템 외에도 미분 방정식 시스템을 풀 수 있습니다. 위는 기술적으로 경계 조건이있는 하나의 미분 방정식이지만 세 개의 방정식 시스템으로 제공 할 수도 있습니다. 통합 기능과 유사하게 DSolve정확한 솔루션 NDSolve을위한 것이며 시스템을 수치 적으로 해결할 것입니다. 위의 단일 솔루션을 생성합니다

{{R[r] -> 1/2 r^(-(1/2) - Sqrt[5]/2) (1 - Sqrt[5] + r^Sqrt[5] + Sqrt[5] r^Sqrt[5])}}

이제 추가 계산에 쉽게 사용하거나 플롯 할 수 있습니다.

길이 64 스 니펫

CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},i,n]

나는 당신에게 더 많은 CellularAutomaton마법을 약속했습니다 ! 이 스 니펫은 단계에 대한 초기 조건으로 Conways의 Game of Life 를 계산 하고 모든 중간 시간 단계에 대한 결과를 제공합니다.in

매개 변수에 대한 몇 마디 : 2셀 상태의 수입니다. {{2,2,2},{2,1,2},{2,2,2}}3x3 이웃의 9 개 셀에 가중치를 부여합니다. 셀 자체가 8 개 이웃의 합과 구별되도록합니다. {1,1}CA 규칙은 어느 방향 으로든 1 단계 떨어진 셀에 의존한다고 말합니다. 마지막으로 224실제 업데이트 규칙은 단일 숫자로 인코딩됩니다. 이 숫자를 알아내는 것은 약간 까다로울 수 있지만 설명서 에는 상당히 유용한 자습서가 있습니다 . 더 복잡한 오토마타의 경우, 단일 숫자는 자르지 않습니다 (숫자가 너무 커서). 어쩌면 내일 도착할 것입니다! ;)

어쨌든 랜덤 그리드를 i200에 넣고 n애니메이션을 통해 결과를 보내면 ArrayPlot실제로 작동한다는 것을 알 수 있습니다.

여기에 이미지 설명을 입력하십시오

길이 59 스 니펫

SphericalPlot3D[Re[Sin[θ]Cos[θ]Exp[2I*φ]],{θ,0,π},{φ,0,2π}]

스 니펫 26의 극좌표를 기억하십니까? 우리는 3D로 같은 일을 할 수 있습니다! (실제로, RevolutionPlot3D원통형 극과 SphericalPlot3D구형 극에 대한 두 가지 기능이 있습니다 .) Graphics3DMathematica에서 모든 3 차원 플롯이 자동으로 회전 할 수있는 것처럼, 좋은 카메라 각도에 대해 걱정할 필요가 없습니다. 위의 내용은 구형 고조파와 같으며 (아직 그렇지는 않음) 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

길이 52 스 니펫

Manipulate[Plot[x^2a+x*b,{x,-3,3}],{a,.1,3},{b,0,3}]

이것은 꽤 근사하다. 모든 표현식을 Manipulate가져 와서 여러 변수로 매개 변수화 한 다음 매개 변수를 조정하고 표현식이 어떻게 변경되는지 실시간으로 볼 수있는 위젯을 제공합니다. 표현으로는 일반적으로 어떤 종류의 줄거리가 있습니다. 이는 강의에서 Mathematica를 사용하여 솔루션 패밀리가 매개 변수 수정에 응답하는 방법을 보여줄 때 특히 유용합니다. 위의 방법 과 계수가 포물선의 스케일과 시프트를 보여줍니다 .ab

여기에 이미지 설명을 입력하십시오

길이 48 스 니펫

Import["http://www.google.com/doodles","Images"]

Import꽤 강력한 명령입니다. 디스크와 웹에서 파일을로드하는 데 모두 사용됩니다. 그것은 매우 다른 파일 형식을 많이 알고 있으며, HTML 페이지와 같은 일부 파일의 경우 실제로 데이터를 즉시 추출 할 수 있습니다. 위는 Google의 기념일 로고 페이지에서 모든 이미지를 다운로드합니다.

길이 45 스 니펫

EdgeDetect@ExampleData@{"TestImage","Splash"}

일부 이미지 처리 시간. Mathematica에는 이미지 (Lena와 같은), 텍스처, 3D 모델 및 오디오 스 니펫을 포함한 전체 예제 데이터가 포함되어 있습니다. 먼저 다음 중 하나를로드합니다.

여기에 이미지 설명을 입력하십시오

가장자리를 감지하고 싶습니까? 단일 함수 호출입니다.

여기에 이미지 설명을 입력하십시오

길이 44 스 니펫

ArrayPlot@CellularAutomaton[110,{{1},0},100]

마지막으로 사용하기에 충분한 문자가 CellularAutomaton있고 결과를 렌더링합니다. :) 내가 아는 한, CellularAutomatonCA와 관련된 Mathematica의 유일한 기능입니다. 그러나 스티븐 볼프람 (Stephen Wolfram)은 셀룰러 오토마타 (automata)에 관해서는 자신을 1 인자로 생각하는 것 같습니다. 따라서이 기능은 엄청나게 강력합니다. 위의 가장 간단한 사용법을 보여줍니다. 이를 통해 1 단계 셀룰러 오토 마톤을 100 단계 시뮬레이션 할 수 있으며 실제로 각 단계에서 오토 마톤 상태를 반환하므로 결과는 2 차원입니다. 규칙은 첫 번째 매개 변수로, 목록을 통해 세부적으로 지정하거나 단일 숫자로 인코딩 할 수 있습니다. 이 예제에서는 다소 유명한 Turing complete Rule 110을 선택했습니다 . {{1},0}초기 조건을 정의합니다 : 단일10의 배경 앞에. CellularAutomaton더 많은 문자를 사용할 수있게되면 앞으로 더 많은 기능을 보여줄 것입니다. 더 큰 이웃과 두 개 이상의 상태를 사용하여 더 높은 차원에서 CA를 시뮬레이션 할 수 있습니다.

ArrayPlot2D리스트를 그 값을 나타내는 단색의 그리드로 플롯하는 또 다른 멋진 플로팅 유틸리티입니다. 가장 간단한 경우에는 0흰색과 1검은 색으로 매핑됩니다 . 스 니펫의 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

길이 43 스 니펫

HighlightGraph[graph,FindVertexCover@graph]

그래프를 언급한지 오래되었습니다. 멋진 시각화 도구와 함께 Mathematica에 내장 된 일반적인 그래프 이론적 문제가 많이 있습니다. 위의 주어진 graph에 대해 그래프의 최소 정점 커버를 찾은 다음 해당 정점을 높게 그래프로 렌더링합니다. 경우 예 graph이다 PetersenGraph[7,2]다시 조각 (18)에서, 우리가 얻을 :

여기에 이미지 설명을 입력하십시오

길이 42 스 니펫

Animate[Plot[Sin[t-x],{x,0,10}], {t,0,10}]

Mathematica에서 사물을 애니메이션하는 것은 매우 간단합니다 (그리고 이미지 일 필요도 없습니다). 각 프레임에 대해 평가할 표현식과 프레임에 따라 달라지는 매개 변수를 제공합니다. 위는 단순히 움직이는 사인파의 플롯을 애니메이션으로 만듭니다. 애니메이션은 다음 GIF와 같습니다.

여기에 이미지 설명을 입력하십시오

길이 40 스 니펫

SortBy[PlanetData[#, "EscapeVelocity"]&]

SortBy원하는 것을 수행합니다 : 주어진 함수를 각 목록 요소에 매핑하여 얻은 값을 기준으로 목록을 정렬합니다. 그러나 위의 호출에는 목록이 전혀 포함되어 있지 않습니다. Mathematica 10부터는 일부 기능에 대한 카레 또는 부분 적용 이 지원 됩니다. 이것은 더 순수한 기능적 언어와 같은 언어 기능은 아니지만 종종 유용한 여러 기능에 대해 수동으로 구현됩니다. 위의 스 니펫은 새 함수를 반환합니다.이 함수 는 목록 가져 와서 주어진 함수별로 정렬합니다. 이 정렬 순서가 코드 전체에서 더 자주 사용되는 경우 매우 유용 할 수 있습니다.

그리고 네, 또 다른 멋진 *Data기능이 있습니다-위의 행성 이름은 행성의 탈출 속도로 정렬됩니다 .

길이 39 스 니펫

f[1]=1
f[2]=1
f[n_]:=f[n]=f[n-1]+f[n-2]

피보나치 기능을보다 효율적으로 만들겠다고 약속했습니다. 이 스 니펫은 Mathematica에서 사소한 메모가 어떻게 이루어지는 지 보여줍니다. 변경된 모든 것은 f[n]=세 번째 줄에 추가 된 것입니다. 그래서 때 f새 값 (예를 들어 호출됩니다 f[3]), 다음 f[3]=f[3-1]+f[3-2]평가됩니다. 이 계산 f[2]+f[1]다음에 할당, f[3](함께 =하지으로 :=!), 그리고 궁극적으로 우리의 초기 호출에 대한 값을 반환합니다. 따라서이 함수를 호출하면이 값에 대한 새로운 정의가 추가됩니다.이 규칙은 일반적인 규칙보다 더 구체적이므로 f해당 값으로의 모든 향후 호출에 사용됩니다 .

다른 피보나치 함수는 30 개의 값으로 4 초가 걸렸다는 것을 기억하십니까? 300,000 개의 값에 3 초가 필요합니다.

길이 37 스 니펫

l//.{a___,x_,b___,x_,c___}:>{a,x,b,c}

마지막 스 니펫에서 패턴을 언급했습니다. 이것들은 규칙 에서 가장 자주 사용되며 , 특정 패턴과 일치하는 구조를 수정하는 데 사용될 수 있습니다. 이 스 니펫을 살펴 보겠습니다.

{a___,x_,b___,x_,c___}:>{a,x,b,c}규칙입니다. x_하나의 밑줄이있는 것은 임의의 단일 값 (그 자체가 목록이거나 유사 할 수 있음)을 나타내는 패턴입니다. a___시퀀스 패턴 (스 니펫 15 참조)이며 0 이상의 값 시퀀스를 나타냅니다. x_두 번 사용 하고 있습니다. 이는 목록의 두 부분이 동일한 값이어야 함을 의미합니다. 따라서이 패턴은 두 번 값이 포함 된 목록과 일치하는 요소를 호출 x하고 그 두 가지 요소 주위의 세 가지 시퀀스를 호출 a, b하고 c. 이것은 {a,x,b,c}두 번째 x로 삭제됩니다.

이제 //.패턴이 더 이상 일치하지 않을 때까지 규칙을 적용합니다. 따라서 위의 스 니펫은 목록에서 모든 중복 항목을 제거합니다 l. 그러나 그것은 그것보다 조금 더 강력 //.합니다. 모든 수준에서 규칙을 적용하십시오. 따라서 l자체에 목록이 포함 된 경우 (하위 깊이까지) 해당 하위 목록의 복제본도 제거됩니다.

길이 36 스 니펫

f[1]=1
f[2]=1
f[n_]:=f[n-1] + f[n-2]

새로운 언어 기능을위한 시간! Mathematica에는 함수 정의에 대한 몇 가지 좋은 점이 있습니다. 시작을 위해, 동일한 이름, 다른 숫자 또는 유형의 인수에 대해 여러 함수 정의를 제공 할 수 있습니다. 패턴 을 사용 하여 정의가 적용되는 인수의 종류를 설명 할 수 있습니다 . 또한 단일 값에 대한 정의를 추가 할 수도 있습니다. Mathematica는 모든 함수 호출에 대해 가장 구체적인 적용 가능한 정의를 선택하고 정의되지 않은 호출은 평가하지 않습니다. 이를 통해 If베이스 케이스용 스위치를 사용하는 것보다 훨씬 더 자연스럽게 재귀 함수를 작성할 수 있습니다.

위의 스 니펫에 대해 알아야 할 또 다른 사항은 및를 모두 사용 =하고 있다는 것 :=입니다. 차이점은 =정의시 오른쪽이 한 번만 평가되는 반면 :=왼쪽을 참조 할 때마다 다시 평가된다는 것입니다. 실제로 :=변수를 할당 할 때도 작동하며 동적 값을 갖습니다.

위의 것은 물론 피보나치 함수입니다. 그리고 매우 비효율적 인 것입니다. 처음 30 개의 숫자를 계산하려면 컴퓨터에서 약 4 초가 걸립니다. 우리는 재귀 적 정의를 제거하지 않고도 성능을 향상시킬 수있는 방법을 곧 보게 될 것입니다.

길이 35 스 니펫

StreamPlot[{x^2,y},{x,0,3},{y,0,3}]

매우 깔끔한 플롯으로 2D 벡터 필드의 유선형을 출력합니다. 이는 각 화살표가 벡터 필드에 접한다는 점에서 일반 벡터 플롯과 유사합니다. 그러나 화살표는 고정 그리드에 배치되지 않지만 선 (유선)으로 결합됩니다. 이 선의 의미는 벡터 필드가 속도 필드 인 경우 입자의 궤적 (예 : 유체)을 나타냅니다. 위의 입력은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

길이 34 스 니펫

Solve[a*x^4+b*x^3+c*x^2+d*x==0, x]

Mathematica는 또한 방정식 (또는 방정식 시스템)을 풀 수 있지만 지금은 너무 많은 문자가 있습니다. 결과는 평소와 같이 상징적입니다.

{
  {x -> 0}, 
  {x -> -(b/(3 a)) - (2^(1/3) (-b^2 + 3 a c))/(3 a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) + (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)/(3 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 + I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 - I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/(6 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 - I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 + I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/( 6 2^(1/3) a)}
}

솔루션은 규칙 으로 제공되며 , 향후 스 니펫에 자세히 표시 될 것입니다.

길이 33 스 니펫

Dynamic@EdgeDetect@CurrentImage[]

이 아이디어에 감사드립니다. CurrentImage[]웹캠의 현재 이미지를로드합니다. EdgeDetect이미지가 가장자리가 흰색이고 나머지가 검은 색인 흑백 이미지로 바꿉니다 (예제 스 니펫 45 참조). Dynamic표현 자체를 업데이트하는 재미가 함께 제공 됩니다. 따라서이 결과는 실제로 웹캠에서 사진을 스트리밍하고 실시간 감지 기능을 수행합니다.

길이 32 스 니펫

NumberLinePlot[x^2<2^x,{x,-2,5}]

다소 특이한 유형의 줄거리. 그것은 숫자 라인을 따라 점과 간격과 같은 여러 가지 다른 것들을 그릴 수 있습니다. 조건을 제공 할 수 있으며 해당 조건이 맞는 지역이 표시됩니다.

여기에 이미지 설명을 입력하십시오

화살표는 영역이 계속 무한대임을 나타냅니다. 흰색 원은 해당 구간이 열린 구간임을 나타냅니다 (종료 점이 구간의 일부가 아님). 닫힌 끝의 경우 원이 채워집니다.

길이 28 스 니펫

Graphics3D@{Sphere[],Cone[]}

일부 3D 그래픽을위한 시간입니다. 위의 수정 구슬과 같은 기본 매개 변수를 사용하여 중첩 된 구와 원뿔을 렌더링합니다.

여기에 이미지 설명을 입력하십시오

Mathematica에서는 실제로이 작은 위젯을 클릭하고 드래그하여 회전시킬 수 있습니다.

길이 27 스 니펫

CountryData["ITA", "Shape"]

*Data! CountryData꽤 미쳤다. 국가의 모양을 얻는 것은 빙산의 일각이 아닙니다. 국가에 대한 데이터가 너무 많기 때문에이 기능에 대한 전체 책을 쓸 수 있습니다. 처럼 ...있다 FemaleLiteracyFraction. 다른 시점에 대해 해당 데이터를 쿼리 할 수도 있습니다. 전체 목록은 참조를 참조하십시오.

여기에 이미지 설명을 입력하십시오

길이 26 스 니펫

PolarPlot[Sin[5θ],{θ,0,π}]

더 흥미로운 줄거리를위한 시간. PolarPlot극좌표의 플롯입니다. 주어진 x에 y를 지정하는 대신 주어진 각도 θ에 반경 r을 지정합니다.

여기에 이미지 설명을 입력하십시오

길이 25 스 니펫

{{1,5},{2,3},{7,4}}.{8,9}

우리는 마침내 일부 벡터 수학을위한 충분한 문자를 얻었습니다. 위는 2x3 행렬과 행 2- 벡터의 행렬 곱셈을 계산합니다.

{53, 43, 92}

길이 23 스 니펫

Rotate[Rectangle, Pi/2]

허. 헤헤 당신은 이것이 무엇인지 알고 있다고 생각합니다. 그러나 당신은하지 않습니다. Rectangle그 자체만으로도 명명 된 함수일뿐입니다. 실제로 사각형을 나타내는 객체를 얻으려면 일부 매개 변수를 사용하여 해당 함수를 호출해야합니다. 회전하려고하면 Rectangle어떻게 될까요? 이:

여기에 이미지 설명을 입력하십시오

길이 22 스 니펫

30~ElementData~"Color"

또 다른 내장 *Data함수. 예, 화학 ​​원소의 경우 원자 번호, 녹는 점 및 이름과 같은 것을 얻는 것이 아니라 실제로 실온에서 색상을 얻을 수 있습니다. 위의 아연 색상은 다음과 같습니다.

SlateGray

길이 21 스 니펫

Integrate[E^(-x^2),x]

우리는 얼마 전에 차별화를 가졌습니다. 통합을위한 시간. Mathematica는 유한 분과 무한 분을 모두 다룰 수 있습니다. 특히 Integrate정확한 솔루션을 제공하며 수많은 표준 적분 및 통합 기술을 처리 할 수 ​​있습니다 (숫자 결과는 NIntegrate). 당신이 당신의 수학을 알고 있다면, 당신은 당신이 생각하지 않는 한 위의 가우스 적분 실제로 ... 부정적분 닫힌 형태가없는 것을 눈치 챘을 것이다 오차 함수가 양식을 폐쇄, 즉. Mathematica는 다음을 반환합니다.

1/2 Sqrt[π] Erf[x]

길이 20 스 니펫

"Sun"~StarData~"Age"

돌아 가기 내장에 데이터 . *Data당신이 생각할 수있는 모든 것에 대해 최소한 24 개의 함수 가 있어야합니다 . 이들 각각은 데이터를 원하는 대상에 대한 식별자와 검색 할 속성 (또는 속성 목록)을 가져옵니다. 위는 당신이 얻을 수있는 가장 짧은 중 하나입니다 Sun, Star그리고 Age나는이 기능을 보여주기 위해 기다릴 수 있기 때문에 모두가 매우 짧은 것을.

예, Mathematica (9 이후)가 단위 수량을 지원한다고 언급 했습니까? (나중에 더 자세히 설명) 위의 내용은 다음과 같습니다.

Quantity[4.57*10^9, "Years"]

로 표시됩니다

여기에 이미지 설명을 입력하십시오

길이 19 스 니펫

MandelbrotSetPlot[]

네 ... 매우 유용한 기능입니다. 나는 항상 사용합니다 . (때로는 계산 가능한 것을 지원하려는 욕구가 조금 멀어 질 수도 있습니다 ...)

Mathematica 그래픽

방어에서 함수는 그보다 약간 더 유용합니다. 플롯하려는 그래프의 특정 섹션을 제공 할 수 있습니다.

길이 18 스 니펫

PetersenGraph[7,2]

Mathematica 8부터는 그래프가 무엇인지 이해하므로 모든 종류의 그래프 이론 관련 기능이 제공됩니다. 그리고 내장 된 톤이 포함되어 있지 않으면 Mathematica가 아닙니다. 위의 일반화 된 Petersen 그래프에 대한 그래프 데이터를 생성합니다 . 그것은 조작 할 수있는 실제 데이터 구조를 생성하지만 Mathematica는 즉시 그래프 데이터를 그래픽으로 표시합니다 :

Mathematica 그래픽

길이 17 스 니펫

Plot[x^x,{x,0,2}]

마지막으로 플로팅을하기에 충분한 캐릭터. 위의 내용은 실제로 가장 간단한 1 차원 도표입니다. 나중에 더 멋진 음모를 과시하겠다고 약속합니다

Mathematica 그래픽

길이 15 스 니펫

{##4,#,#2,#3}&

이것은 두 가지 더 강력한 기능 (골프에 유용한 기능)을 보여줍니다. 모든 것은 명명되지 않은 순수 함수 이며 lambda파이썬의 s 또는 Ruby의 Procs 와 비교할 수 있습니다. 순수 함수는 단순히로 종료됩니다 &. 이 연산자는 우선 순위가 매우 낮아서 거의 남은 모든 것을 포함합니다. 순수한 함수의 인수는로 언급되고 #때로는 다른 것들이 뒤 따릅니다. 첫 번째 인수는 #or #1이고 두 번째 인수는 #2입니다.

다른 기능은 Sequences입니다. 이들은 기본적으로 다른 언어의 표시와 같습니다. 시퀀스는 목록이없는 목록과 같습니다. 문자 그대로 값, 시퀀스, 함수 인수 등에서 사용할 수있는 일련의 값 ##입니다. 특히 모든 순수 함수 인수의 시퀀스입니다. ##2두 번째부터 시작하는 모든 인수의 순서입니다. 우리는 위의 함수라는한다면 f, 그리고처럼라는

f[1,2,3,4,5]

우리는 얻을 것이다

{4,5,1,2,3}

따라서 함수는 입력 인수를 3 요소 왼쪽으로 회전시킵니다. 참고 ##4함하는 4,5목록으로 평평하게 된.

길이 12 스 니펫

D[x^y^x,x,y]

부분적 분화. D다른 주장과 관련하여 첫 번째 표현을 순차적으로 차별화하여 결과적으로 상징적 표현을 제공합니다. 따라서 위의 d² (x ^ y ^ x) / dxdy ( d 는 부분적 임)이며 Mathematica는

x^y^x (y^(-1 + x) + y^(-1 + x) Log[x] + x y^(-1 + x) Log[x] Log[y]) + 
  x^(1 + y^x) y^(-1 + x) Log[x] (y^x/x + y^x Log[x] Log[y])

길이 9 스 니펫

Exp[I*Pi]

아직 복잡한 산술을하지 않았습니다! 보다시피 π실제로는에 대한 별칭 일뿐입니다 Pi. 어쨌든 위의 내용은 실제로 integer를 올바르게 반환합니다 -1.

길이 8 스 니펫

Sunset[]

네. 미친 내장에 대해 이야기하십시오. 실제로 현재 위치에서 다음 일몰의 날짜 / 시간 객체를 제공하는 매개 변수가 없습니다. 다른 날짜, 다른 위치 등에 대한 매개 변수도 사용합니다. 다음은 현재 나와 같은 모양입니다.

여기에 이미지 설명을 입력하십시오

길이 7 스 니펫

9!/43!!

이 스 니펫은 몇 가지 멋진 것을 보여줍니다.

Mathematica에는 내장 요인 연산자 !가있을뿐만 아니라 이중 요인도 있습니다 !!(이는 다른 모든 숫자에 n아래 에서 로 곱함 1). 또한 임의 정밀도 정수를 지원합니다. 는 43!!마지막 숫자까지 정확하게 평가됩니다. 또한 합리적인 숫자도 정확하게 평가됩니다. 따라서 분자와 분모 모두 정수가 있기 때문에 Mathematica는 분수를 가능한 한 줄인 다음

128/198893132162463319205625

물론 원할 때마다 float를 사용할 수 있지만 일반적으로 입력에 float가 없으면 결과는 정확합니다.

길이 4 스 니펫

Here

이제 Mathematica의 다양한 내장 기능이 시작되었습니다. 위의 내용은 주석에 대해 말하고 (나를 위해) 평가합니다 GeoPosition[{51.51, -0.09}].

길이 3 스 니펫

x-x

원래 Factoid 를 보여주기 위해 : 위의 내용은 x아직 정의되지 않은 경우에도 작동 하며 실제로는 그 결과가 0됩니다.

길이 2 스 니펫

3x

병치를 통한 곱셈! 식별자가 끝나고 다른 식별자가 시작되는 것이 확실하다면, *그것들을 곱하기 위해 공백이 필요하지 않습니다 . 이것은 아직 값이없는 문자열과 변수를 포함하여 거의 모든 작업에서 작동합니다. 골프에 매우 편리합니다. ;)

길이 1 스 니펫

π

맞춰봐, 파이야 사실, 그것은 대략적인 부동 소수점 표현이 아니며, 정확히 Pi입니다. 그래서 이것이 사용되는 모든 종류의 복잡한 삼각 함수는 정확한 결과를 얻을 수 있습니다.

팩 토이 드

Mathematica는 기호 조작을 수행 할 수 있으므로 변수에는 값을 사용할 필요가 없습니다.


19
스 니펫 23은 매우 궁금합니다. 당신이 그랬다면 Translate[Scale[Rectangle, 80], {0, 0, 100}]거대한 단어는 것입니다 Rectangle모니터 앞에 떠 나타 납니까?
Calvin 's Hobbies

53
@ Calvin'sHobbies 방금 시도해 보았습니다 ... 불행한 z오프셋을 골랐습니다 ... 얼굴이 맞았습니다.
Martin Ender

45
공식 Mathematica 웹 사이트는 이것에 절대적으로 연결되어야합니다.
Caridorc

7
@ durron597 기호로 유지하고 모든 삼각 함수와 복잡한 함수가 π로 수행 할 작업을 인식하게합니다.
Martin Ender

16
전설적인 Martin Büttner가 Mathematica 답변을 게시 한 것을 보았을 때, 나는 인기 콘테스트에서 우승 할 기회가 없다는 것을 알았습니다. 당신은 진정한 마법사입니다.
Alex A.

187

악명 높은 셰익스피어 프로그래밍 언어

셰익스피어 프로그래밍 언어는 2001 년 스웨덴의 두 명의 학생 Karl Hasselström과 Jon Åslund에 의해 만들어졌으며 저자가 선포 한대로 ,

어셈블리 언어의 사용자 친화 성과 BASIC의 표현성.

답은 위에서 아래로 진행됩니다. 또한 이전 또는 이전 스 니펫을 참조하는 것이 일반적입니다.

( 나 자신을위한 링크 : 편집 )

사실 :

셰익스피어의 코드는 셰익스피어 연극과 유사합니다. 셰익스피어 연극은 변수가 연극의 등장 인물이며 "모욕되거나"칭찬 될 때 그 가치가 바뀝니다.

길이 1 스 니펫 :

I

셰익스피어의 코드는 사도 행전 (Acts)으로 나뉘어져 있으며, 그 행위는 "점프 투"인과 관계를 위해 장면 (Scene)으로 나뉩니다. 액트를 정의하는 것은 액티비티 Act I가 예를 들어 실행되는 첫 번째 코드가 될 것임을 의미합니다.

길이 2 스 니펫 :

as

두 "문자"를 비교하는 데 사용됩니다.

길이 3 스 니펫 :

day

지금까지 SPL이 매우 장황한 느낌이들 수 있습니다. 그리고 이상하다. 그리고 당신은 아직 아무것도 보지 못했습니다. daySPL에서 1은 1입니다. 모든 "긍정적 인"및 "중립적 인"명사는 1모두 "음성"인 것으로 간주됩니다 -1.

길이 4 스 니펫 :

rich

무엇입니까 rich? 형용사. SPL에서 형용사는 붙인 명사의 값에 2를 곱합니다. 스 니펫 14 구현을 참조하십시오.

길이 5 스 니펫 :

Act I

첫 번째 스 니펫 구현 Act I: Hamlet must die!로마 숫자 뒤의 모든 것이 파서에 의해 무시되므로 모든 행위에 제목이 주어질 수 있습니다 .

길이 6 스 니펫 :

better

모든 언어에는 조건이 있으며 SPL도 예외는 아닙니다. 단, 이것은 긴 구문을 가진 언어이기 때문에 (그리고 이상하다고 언급 했습니까?) 조건문은 길어질 것입니다. 오펠리아가 줄리엣에게 묻는 것은 대부분의 "일반"언어 Am I better than you?를 사용 if (Ophelia > Juliet)하는 것과 같습니다 . : 그리고, 물론, 당신은 다른 방법으로 주위가 요청할 수 Am I not better than you?에 해당합니다 if (Ophelia < Juliet). 그리고 당신은 이미 =SPL로 어떻게 번역 되는지 추측 할 수 있습니다 : as good as-코드 스 니펫 2 사용법.

그러나이 good/bettershakesperian 언어로 비교하는 유일한 방법은 아니지만 모든 형용사를 사용할 수 있습니다. "스 니펫 3"의 동일한 원리가 여기에도 적용되며, "긍정적 인"형용사에는 가치 >가 있지만 "부정적인" 형용사는 의미 <합니다.

길이 7 스 니펫 :

Juliet:

이것은 변수의 호출입니다. 그 후, 그 / 그녀의 지시 / 선언 / 따라 무엇이든.

SPL의 한계는 변수의 수가 제한되어 있다는 것입니다. Romeo, Juliet, Hamlet, Ophelia, MacBeth 등은 셰익스피어 프로그램에 나타나는 "문자"의 몇 가지 예입니다.

길이 8 스 니펫 :

[Exeunt]

[Exeunt]모든 "문자"가 "무대"를 떠날 때 배치됩니다. 문자 사이의 상호 작용에 대해 나중에 좀 더 자세히 설명 할 수 있기를 바랍니다. 일반적으로 [Exeunt]언어의 터미널 "문자"는 아니지만 SPL 프로그램의 마지막 명령입니다 . 다른 예는 스 니펫 27을 참조하십시오.

길이 9 스 니펫 :

as bad as

=스 니펫 2를 사용하여 단순히 9 개 문자 만 표시 합니다. SPL이 이상하다고 언급 했습니까? 예제는 스 니펫 30을 참조하십시오. (예, 출력하는 방법은 여러 가지가 있습니다)

길이 10 스 니펫 :

difference

-빼기 를 표현하는 멋진 방법 . SPL에 수학 연산을 할 수 있지만, 하루 종일 제대로 계산해야 할 수도 있습니다.

팩 토이 드 (어떻게 든 열 스 니펫 코드에 도달하기 때문에 약간의 휴식을 취하고 SPL에 대해 또 다른 사실을 보자)

shakesperian 코드를 모든 영광으로 돌리고 싶다면 이 사이트가 있습니다 .5 분 전에도 발견하지 못했기 때문에 여전히 테스트 중입니다. 사용하여 C로 번역 할 수있는 방법도있다 번역자가 .

SPL 코드를 실행하기위한 또 다른 사이트는 이 하나의 오라클 PL / SQL을 : 내부적으로 다른 난해한 언어로 SPL 코드를 변환하여 작동합니다.

길이 11 스 니펫 :

[Exit Romeo]

예! 마침내 나는 캐릭터 간의 상호 작용에 대해 이야기 할 수 있습니다! 값을 변경하거나 다른 사람과 상호 작용하려면 "캐릭터"가로 무대에 들어가야합니다 [Enter Romeo]. 문자가 지정되었지만 존재하지 않으면 런타임 오류가 발생하고 프로그램이 중지됩니다. SPL에서 변수의 값은 스테이지의 다른 캐릭터가 칭찬하거나 모욕하는 이름의 양으로 설정되기 때문입니다. 나는 절름발이 설명이 만들 수있는 혼란을 분명히하기 위해 예를 들어야한다고 생각하지만 아마도 몇 가지 스 니펫을 지연시키는 것이 가장 좋습니다.

길이 12 스 니펫 :

Remember me.

SPL은 꽤 "기본"입니다. 그러나 스택이 있습니다! 예를 들어, 로미오는 줄리엣에게 "그를 기억하라고"말할 때 실제로 사랑하는 사람에게 로미오의 가치를 그녀의 스택에 밀어 넣으라고 말하고 있습니다. 값을 파는 것은 Recall your happy childhood!, 또는 Recall your love for me, 또는 기본적으로 시작되는 문장으로 이루어집니다 Recall. 나머지는 스 니펫 22와 같이 예술적입니다.

길이 13 스 니펫

Let us return

데의 Shakesperian 방법 goto. 그리고 이것이 사도 행전과 장면이 유용한 곳입니다. 로미오가 줄리엣에게 말하면 we shall return to Act II(다시 말해 여러 가지 방법이 있습니다) 프로그램은 코드의 특정 부분으로 넘어갑니다. 조건문과 함께 표시됩니다.

길이 14 스 니펫

my little pony

예, 그것은 80 년대의 시리즈였습니다. 여기는 2*1입니다. 왜? 왜냐하면 a pony는 (어떤) 긍정적 인 명사이고 little형용사이기 때문입니다. 스 니펫 3과 4를 기억하면 little = "2 *"및이 pony = "1"있습니다.

길이 15 스 니펫

Speak thy mind!

SPL 프로그램에서는이 (또는 Speak your mind!같은) 많은 것을 볼 수 있습니다. 기본적으로 컴퓨터에서 사용하는 문자 집합에 따라 숫자, 문자 또는 기타로 각 "문자"값을 출력합니다. 이 또한있어 Open your mind.그는 숫자 형태로 출력이기는하지만, 거의 같은 일을한다.

길이 16 스 니펫

You are nothing!

누군가가 실생활에서이 사실을 말해 주면 우울해집니다. 오펠리아가 셰익스피어 프로그래밍에서 햄릿에게 이것을 말하면, 햄릿은 무가치하다고 느낀다. 이것은 무엇을 의미 하는가? 그건 Hamlet = 0.

길이 17 스 니펫

Ophelia, a wench.

시나리오에서 실제 재생을 시작하기 전에 캐릭터를 제시해야합니다. 대부분의 프로그래밍 언어에서 변수는 사용하기 전에 선언해야합니다. SPL이 시나리오와 유사한 프로그래밍 언어임을 알면 프로그램 중에 나타나는 변수를 지정하여 변수를 선언하는 방법입니다.

그러나 "바다"는 무엇을 의미합니까? 특정 (그리고 멋진) 데이터 유형 이름이라는 것을 의미합니까? 글쎄 ... 난 당신을 실망시키는 것이 싫지만 아무 의미도 없습니다. 쉼표 뒤의 모든 것은 파서에 의해 무시됩니다.

길이 18 스 니펫

lying sorry coward

-4세상의 모든 피조물들에게. 왜? 왜냐하면 2*2*(-1) = -4.

길이 19 스 니펫

Romeo:
 Remember me.

마침내 !!! 마지막으로 완전한 올바른 구문 명령을 출력 할 수 있습니다 (짧은 명령이지만)! 스 니펫 12를 사용하는 방법은 다음과 같습니다. 먼저 누가 말을하는지 선언하고 다음 줄에는 "대화"를 작성합니다. 일반적으로 파서는 슬프고 혼동되지 않도록 두 개의 "문자"만 무대에 있습니다. 다른 "캐릭터"가 필요하면 무대에서 하나를 가져와 새로운 캐릭터로 교체하십시오.

길이 20 스 니펫

cube of thy codpiece

나는 이것에 대해 조금 더 자세히 설명하고 싶었지만, 사실, 내가 생각해내는 것은이 발췌 문장 길이에 비해 너무 짧습니다. 그래서, 나는 이것을 당신에게 가져옵니다. -1왜냐하면 (-1) 3 = -1 codpiece이기 때문입니다. SPL은 몇 가지 더 정교한 산술 연산을 이해 몇 가지 지수와 제곱근.

팩 토이 드 (아직 이정표에 도달 했으므로 아직 하나)

셰 익스 페리 안의 "Hello World Program"에는 여기에 표시된대로 89 줄과 2400 자 이상의 문자가 있습니다 .

길이 21 스 니펫

Listen to your heart.

스 니펫 15에서는 무언가를 출력했습니다. 여기에서 프로그램에 숫자를 입력합니다. 문자를 입력하려면 Open your mind.대신 사용하십시오. 말할 필요도없이,이 값은 말하는 "캐릭터"에 저장됩니다.

길이 22 스 니펫

Recall your childhood!

스 니펫 12에 설명 된대로 스택에서 정수를 제거하는 작업은이 작업으로 수행됩니다. 예를 들어, Ophelia는 Hamlet에게 위에서 언급 한 문장을 알려 주면 Hamlet이 스택에서 정수를 가져와 해당 값을 가정하게합니다.

물론, 단어 recall가 문장을 시작하는 한, 당신은 창조적 인 셰 익스 페리 안의 마음이 원하는 거의 모든 것을 나머지를 채울 수 있습니다.

길이 23 스 니펫

Are you better than me?

스 니펫 구현 6. "캐릭터"가 다른 사람에게 이와 같은 질문을 할 때, 자신이하고있는 일은 if (x > y)더 일반적인 프로그래밍 언어 와 동일합니다 . 더 많은 문자를 사용할 수있을 때까지이 명령의 후속 조치를 지연시켜야합니다.

길이 24 스 니펫

[Enter Romeo and Juliet]

예, "문자"는 쌍으로 입력 할 수 있습니다. 무대에 한 "캐릭터"가 없어도되고 다른 캐릭터가있을 필요는 없습니다.

길이 25 스 니펫

remainder of the quotient

25 자만 쓰면 %됩니다. 나눗셈의 나머지는 25 자입니다. 그리고 그것을 사용하려면? 글쎄, 그것은 더 큽니다. 스 니펫 75를 참조하십시오.

길이 26 스 니펫

Let us return to scene II.

여기 gotoSPL은 프로그래밍 언어에서 기대하는대로 작동합니다. 문제는 : 같은 행위에서 장면들 사이에서 그리고 행위들 사이에서 점프 할 수 있습니다. 그러나 다른 행동으로 장면 사이를 이동할 수는 없습니다.

길이 27 스 니펫

[Exeunt Ophelia and Hamlet]

둘 이상의 "캐릭터"가 대신 무대를 떠나 ExitSPL의 연극 적 특성을 유지하면서 라틴어 "Exeunt"가 사용됩니다. 때로는 스 니펫 8로 대체 될 수 있습니다.

길이 28 스 니펫

Scene I: Ophelia's flattery.

장면 선언. 당신이 나에게 대처하고 있다면 이미 예상 할 수 있듯이 중요한 것은 Scene I입니다. 나머지는 예술적 보풀입니다.

Act / Scene 번호 매기기 후 텍스트를 참조하는 컴파일러 (예 : SPL에서 C로 컴파일하고 Python으로 작성 ) 와 같은 일부 컴파일러가 있습니다 . 좀 더 논리적이지만 (연극 중에는 "Act I로 돌아 가자"와 같은 줄을 말하는 캐릭터가 바보로 간주 될 수 있지만) 원래의 방식을 고수하고 있습니다.

길이 29 스 니펫

You pretty little warm thing!

예, 또 다른 상수 ( 산술 연산을 위해서는 더 많은 문자 가 필요 하기 때문에). 이 8때문에 2*2*2*1 = 8.

길이 30 스 니펫

You are as cowardly as Hamlet!

예를 들어 로미오에게 이것을 말하는 것은 그 의미합니다 Romeo = Hamlet. 스 니펫 9처럼.

사실 (예, 다른 랜드 마크에 도달했습니다!)

이 언어는 구문 분석 과정에서 할당을 위해 작성되었으므로 작성자가 SPL 컴파일러를 작성하지 않았습니다. 더 : SPL의 저자는 2001 년부터 언어에서 아무것도 수정되지 않은 것으로 보이므로 창조와의 관계를 단절시킨 것처럼 보입니다 ...

길이 31 스 니펫

Am I as horrid as a flirt-gill?

예, 저는 약간 반복되는 스 니펫 23이지만, 여기서는 "갈등"과 말하는 "캐릭터"를 비교하고 있습니다 (원하는 경우 if (Ophelia == -1)). 문제는 ...

길이 32 스 니펫

If so, let us return to scene I.

... 이제 thenSPL, 조건부 점프 및 루프를 구현하는 Shakesperian 방법을 소개 할 수 있습니다. 예를 들어 Romeo가 값을 가정하도록 0하고 다른 작업을 수행하는 동안 값을 늘리고 10에 도달하면 중지하고 나중에 프로그램을 진행할 수 있습니다.

길이 33 스 니펫

If not, let us return to scene I.

테스트 한 조건 이 false 인 경우 대신 다른 장면으로 진행할 수 있습니다 .

길이 34 스 니펫

Open your mind! Remember yourself.

연속으로 두 가지 명령, yippie! 첫 번째 문자는 문자를 읽고 두 번째 문자는 다른 문자의 메모리 스택으로 밀어 넣습니다.

길이 35 스 니펫

Act I: Death!

Scene I: Oh, shit.

행위와 장면을 선언하는 올바른 방법. 예술적 무스를 세련되게 추가하십시오.

길이 36 스 니펫

Thou art as sweet as a summer's day!

1여름의 날이 좋고 즐겁기 때문에 말하는 "캐릭터"가 가치를받을 것이라고 말하는 또 다른 방법 .

길이 37 스 니펫

Art thou more cunning than the Ghost?

오펠리아 (Ophelia)는이 질문을 햄릿 (Hamlet)에 묻는 것은 이것을 읽기 어려운 프로그래밍 언어로 번역하는 것을 의미 if (Hamlet > the Ghost)합니다. 스 니펫 23은 다시 한 번입니다. 그러나 "문자"가 서로보다 나은지 물어볼 필요가 없음을 보여줍니다. 다른 질문도 효과가 있습니다.

길이 38 스 니펫

[Enter the Ghost, Romeo and the Ghost]

예, 프로그램에 오류가 생기도록하기 위해 "문자"를 두 번 호출합니다. 이미 무대에있는 "문자"를 호출하거나 종료하지 않은 문자를 호출하면 파서 / 컴파일러에 큰 슬픔이 발생합니다.

길이 39 스 니펫

the sum of a fat lazy pig and yourself!

전체 명령이 더 나아질 것입니다. 나는 당신에게 그것을 줄 것입니다, 그러나 ... 여기 우리의 첫 번째 산술 연산이 있습니다! 실제로 무엇을 의미합니까? 글쎄요, pig더러운 동물입니다 (맛 있음에도 불구하고).와 동등한 -1두 형용사 fat lazy pig를가 2*2*(-1) = -4집니다. 그러나 어떻 yourself습니까? 이름이나 형용사가 아닌 반사 대명사입니다. SPL은 "캐릭터"간의 대화를 기반으로합니다. 따라서 yourself무대에서 다른 "문자"를 참조하십시오. 그래서, 우리는 끝에 도착했고 우리는 "뚱뚱한 게으른 돼지와 자신의 합계"가 실제로는 것을 발견합니다 -4 + x.

길이 40 스 니펫

the sum of a squirrel and a white horse.

네, 다른 합계이지만, 이것은 스 니펫 39보다 간단 합니다. 이것은 내 수학이 정확하다면, 단지 1 + 2- 3입니다.

팩 토이 드 (여전히 예술적 보풀의이 40 조각 후에도 나와 함께? 당신은 상을받을 가치가있다.)

버전 1.2.1의 SPL은 여기에서 다운로드 할 수 있습니다 .

길이 41 스 니펫

Juliet:
 Speak thy mind!

[Exit Romeo]

때때로, "캐릭터"는 무대에서 단지 그들의 가치가 바뀌도록 부름을받습니다. 실제 플레이에서는 상당히 기괴한 것입니다. 어쨌든, 줄리엣은 그녀의 사랑하는 로미오가 자신의 저장 가치를 인쇄하게 한 후 무대를 빠져 나옵니다.

길이 42 스 니펫

Speak YOUR mind! You are as bad as Hamlet!

다시 한 줄에 두 개의 명령이 있습니다 (여러 개를 가질 수 있지만 스 니펫 길이는 아직 허용하지 않습니다). 여기에 다른 사람에게 그 값을 출력하고 Hamlet이 가지고있는 값을 가정하도록 지시하는 "문자"가 있습니다. 혼란 스러운가? 아마도

길이 43 스 니펫

Am I as horrid as a half-witted flirt-gill?

줄리엣이 이것을 요구한다고해서 그녀가 낮은 평가를 받았음을 의미하지는 않습니다 (실제로있을 수도 있음). if스 니펫 23 및 37과 같은 또 다른 것입니다. 거의 잊어 버렸습니다 if (Juliet == -2).

길이 44 스 니펫

You are as evil as the square root of Romeo!

예, 제곱근은 악합니다. 몰랐습니까? 어쨌든,이 명령은 그것이 무엇을하는지 이해하기에 충분히 간단합니다. "문자"가 Romeo에 저장된 값의 제곱근의 값에 해당하는 속성입니다.

길이 45 스 니펫

Hamlet:
 Art thou more cunning than the Ghost?

스 니펫 37은 회선을 말하는 캐릭터로 올바르게 작성되었습니다.

길이 46 스 니펫

the product of a rural town and my rich purse.

어쨌든, SPL은 도시에 지갑을 곱할 수있는 유일한 언어 일 수 있습니다. 이것은 (2*1)*(2*1)내가 잘못 생각하지 않으면과 같습니다 4.

길이 47 스 니펫

Romeo:
 Speak your mind.

Juliet:
 Speak YOUR mind!

나는 당신에게 그것을 줄 것입니다 : 그것은 역사상 가장 기괴한 대화 중 하나 일 수 있습니다. 그러나 그것은 당신이 보여줄 이상한 언어를 선택할 때 얻는 것입니다. 로미오와 줄리엣은 짧게 서로의 가치를 산출하라고 말합니다.

길이 48 스 니펫

You lying fatherless useless half-witted coward!

직접 번역하는 중 2*2*2*2*(-1)입니다. -16, 권리?

길이 49 스 니펫

Scene V: Closure.

Hamlet:
 Speak your mind!

[Exeunt]

SPL에서 프로그램을 종료하는 방법의 예. 장면을 구체적으로 선언 할 수 있지만 (필요하지는 않지만) 햄릿은 다른 "문자"에게 값을 출력하도록 요청한 다음 모두 스테이지를 종료합니다. 그리고 예, 그들 모두가 무대에서 내려야합니다.

길이 50 ​​스 니펫

Othello, a young squire.
Lady Macbeth, an old fart.

적절한 지침 전에 더 많은 "문자"프리젠 테이션. 언제나 그렇듯이 컴파일러에게 중요한 것은 Othelloand입니다 Lady Macbeth. 그래서 나머지 줄은 움켜 쥐고 있습니다.

한 가지 더 : "문자"는 SPL 프로그램에 나타나기 위해 서로 관련 될 필요가 없습니다. 따라서 같은 플레이에서 Romeo, Othello 및 Hamlet을 가질 수 있습니다.

Factoid (이것들 중 반세기? 휴!이 후에 나는 윌리엄 셰익스피어를 혐오 할 것 같다 ...)

얼마 전에 언급되어 SPL 제작자가 개발 한 SPL-C 변환기는 FlexBison 기반이었습니다 .

길이 51 스 니펫

Othello:
 Recall your great dreams. Speak your mind!

(로미오, 줄리엣, 햄릿이 너무 아프다. 오델로를 데려 와서 변경하자!)

Recall당신이 짐작할 수 있듯이, 여기가 열쇠입니다. 오델로가 다루고있는 "캐릭터"는 자신의 스택에서 값을 가져 와서 그 값을 가정 한 후 출력합니다.

길이 52 스 니펫

Thou art as pretty as the sum of thyself and my dog!

또 다른 합계. 입을 크게 벌림. 이 주소가 Hamlet에 있다고 가정하면 의미합니다 Hamlet = Hamlet + 1. 또는 Hamlet += 1. 또는 Hamlet++.

길이 53 스 니펫

Romeo:
 You are as vile as the sum of me and yourself!

아, 그렇습니다, 내가 전에 언급했던 것을 잊어 버린 것 : 말하기 "문자들"은 그들 자신의 라인에서 그들 자신을 언급 할 수 있습니다.

길이 54 스 니펫

Juliet:
 Is the sum of Romeo and me as good as nothing?

조건에 포함 된 이전 스 니펫의 다른 예입니다. 우리가 여기있는 것은입니다 if (Romeo + Juliet == 0).

길이 55 스 니펫

Juliet:
 You are as lovely as the sweetest reddest rose.

따라서 Juliet는 자신이 말하는 "캐릭터"를 찬양하고 있습니다 (Shakespeare를 위해 Romeo라고 가정).

길이 56 스 니펫

Othello:
 You lying fatherless useless half-witted coward!

"문자"로 스 니펫 48이 올바르게 수행되었습니다. 위로 올라 가기에는 너무 게으르다면 (이것처럼) 모욕을당하는 사람이 -16 값을 받고 있음을 의미합니다.

길이 57 스 니펫

Romeo:
 If not, let us return to Act I. Recall thy riches!

SPL에서 일반적인 조건이 어떻게 작동하는지 설명했습니다. 그러나 더 많은 인라인 분석이 필요합니다. 우리는 else여기에 없습니다 : 예를 들어,이 예제에서 조건이 실패하면 프로그램은 Act I로 돌아갑니다. 그러나 그것이 사실이라면, 그것은 다음 명령으로 계속 될 것입니다 Recall- 그것은 스택에서 나온 팝입니다.

길이 58 스 니펫

Romeo:
 You are as disgusting as the square root of Juliet!

스 니펫 (44)을 잡고 명령이 제시되는 방법을 제시한다. 이것이 Romeo와 Othello 사이의 대화 였다면, 이것을로 Java로 번역 할 수 Othello = Math.sqrt(Juliet)있습니다.

길이 59 스 니펫

Othello:
 You are as vile as the sum of yourself and a toad!

오델로가 로미오와 대화를 나눈다면 이것과 같습니다 Romeo+(-1). Romeo--짧게 말하면 아주 기본 이지요? 그것은 당신을위한 SPL입니다.

길이 60 스 니펫

Is the quotient between the Ghost and me as good as nothing?

간단히 말해 if (The Ghost/Hamlet == 0)"me"는 Hamlet에 속한다고 가정합니다.

길이 61 스 니펫

Thou art as handsome as the sum of yourself and my chihuahua!

일단 단어와 모욕의 레이어와 레이어를 벗기면 SPL이 멋진 기능과 물건이없는 거의 기본적인 것임을 알 수 있습니다. 그래서 우리는 프로그램 본문에 많은 양의 산술 함수를 가지고 있습니다. 따라서이 주소가 Juliet에게 전달 된 경우와 같습니다 Juliet++.

길이 62 스 니펫

twice the difference between a mistletoe and a oozing blister!

예, 더 많은 산술 연산. 대략 62 바이트의 SPL을로 변환 할 수 있습니다 2*(1-2*(-1)). 이것은 꽤 멋진 골프 언어 일 것입니다. 권리.

길이 63 스 니펫

You lying stupid fatherless rotten stinking half-witted coward!

스 니펫 48이 -16을 출력했는데이 값은 -64와 같습니다 2*2*2*2*2*2*(-1).

길이 64 스 니펫

your coward sorry little stuffed misused dusty oozing rotten sky

내가 SPL에 대해 이해 한 바에 따르면 이것은 완벽하게 합법적입니다. 당신은 "긍정적 인"명사로 진행되는 모욕적 인 형용사를 많이 가지고 있습니다. 형용사는 부정적이든 아니든 특별한 구별이 없기 때문에 (그들의 가치에만 오른쪽 숫자에 2를 곱하는 것), 우리는 이와 같은 어리석은 문장을 가질 수 있습니다. 어느 것이 256에 해당합니다 2*2*2*2*2*2*2*2*1=256.

길이 65 스 니펫

You are nothing! You are as vile as the sum of thyself and a pig.

흠, 너무 싫어? 그래서 우리가 여기있는 것은 y=0; y=y+(-1);아마도 "골프"되었을 수 You are a pig!있지만, 그렇습니다 .

길이 66 스 니펫

You are as beautiful as the difference between Juliet and thyself.

그래서, 줄리엣을 자신에게서 빼십시오. 이것은 Romeo=Juliet-Romeo;말하는 사람이 Romeo라고 가정하면 해독하기가 매우 간단 합니다.

길이 67 스 니펫

Juliet:
 Am I better than you?

Romeo:
 If so, let us proceed to Act V.

SPL에서 대부분의 조건이 작동하는 방식. 표현식을 테스트하고, 그것이 사실이라면 (또는 스 니펫 33 참조) 프로그램의 다른 부분으로 이동합니다. 그렇지 않으면 다음 문장으로 넘어갑니다.

길이 68 스 니펫

The Ghost:
 You are as small as the sum of yourself and a stone wall!

예, 조금 단조롭습니다. 그러나 SPL은 그런 식입니다. 조금 더 일찍 언급했듯이, 그 표현은 산술 연산의 혼합입니다. 따라서 이것은 또 다른 증분입니다. 왜냐하면 stone wall중립적 인 "명사" 이기 때문 입니다.

길이 69 스 니펫

Thou art as disgusting as the difference between Othello and thyself!

합산 대신, 우리는 두 캐릭터, 오델로와 말을하는 사람 사이에 빼기가 있습니다.

길이 70 스 니펫

You are as handsome as the sum of Romeo and his black lazy squirrel!

우리는 첨가물로 돌아갑니다. 네, 저를 공식이라고 부릅니다. 이것을로 번역합니다 Romeo + 2*2*1.

길이 71 스 니펫

Scene I: Dialogues.

[Enter Juliet]

Othello:
 Speak your mind!

[Exit Juliet]

장면은 이만큼 작을 수 있습니다. Juliet무대에 들어 오면 오델로가 저장된 값을 출력하라고 지시 한 다음 다시 무대에서 내려옵니다.

길이 72 스 니펫

twice the difference between a mistletoe and an oozing infected blister!

한 번 더 산술 연산-SPL이 수수께끼이기 때문에. 이것을로 번역 할 수 있습니다 2*(1-2*2*(-1)).

길이 73 스 니펫

You are nothing! Remember me. Recall your unhappy story! Speak your mind!

네 개의 명령이 연속?! 사실 나는 정말 자랑 스럽습니다. 어쨌든 이것이 로미오와 줄리엣 사이의 대화라고 가정 해 보자 (그리고 그가 말하고 있음). 이것은 줄리엣의 가치가 0에서 시작한다는 것을 의미한다. 그런 다음 Juliet는 Romeo의 가치를 메모리 스택에 밀어 넣고 입력 한 형식으로 출력합니다. 간단 하죠?

길이 74 스 니펫

You are as sweet as the sum of the sum of Romeo and his horse and his cat!

예, 예, 지루한 예입니다. 그러나 이것은입니다 X = (Romeo + 1) + 1.

길이 75 스 니펫

Is the remainder of the quotient between Othello and me as good as nothing?

글쎄, 이것은 매우 간단합니다. 디코딩 기술이 제대로 작동하지 않으면로 번역됩니다 if (Othello % X == 0).

길이 76 스 니펫

Thou art as rich as the sum of thyself and my dog! Let us return to scene I.

스 니펫 (26)에서식이 앞에옵니다. goto물론, 이런 종류의, 그리고 - SPL에 항상 조건 근처에서 발견되지 않는,이처럼 될 수 있습니다 goto항상 후 지시하기 때문에, 행위 또는 장면의 끝에서 찾을 수는 / 컴파일되지 수행 않습니다. 첫 번째 명령은 매우 간단 x=x+1합니다.

길이 77 스 니펫

[Exit Hamlet]

[Enter Romeo]

Juliet:
 Open your heart.

[Exit Juliet]

[Enter Hamlet]

그래서 줄리엣과 햄릿이 무대에 있습니다. 그러나 우리는 로미오의 가치가 필요합니다. 따라서 매우 심한 두통에서 컴파일러를 절약하기 위해 먼저 스테이지에서 햄릿을 제거합니다 (줄리엣이 갈 수는 있었지만). 로미오에게 무대에 오르라고 지시합니다. 숫자 (스 니펫 21의 설명 참조)를 입력하면 로미오가 무대에서 나와 햄릿이 돌아옵니다. 매우 간단하고 간단합니다.

길이 78 스 니펫

The Ghost:
 Speak thy mind.

Lady Macbeth:
 Listen to thy heart! Remember thyself.

그래서 고스트 (Hamlet의 사망 한 아버지)는 맥베스 여사에게 값을 출력하라고 말하면서 고스트에게 숫자를 읽어서 스택에 넣도록 명령합니다.


32
이것은 매우 흥미롭고 귀하의 프로필 사진은 완벽하게 맞습니다. 그는 SPL 프로그래머가 어떻게 생겼는지 상상할 수 있습니다.
overactor

3
@overactor 나는 Gumby에 비유되는 것을 모욕하거나 자랑스럽게 여길 지 모른다. ^ _ ^
Rodolfo Dias

9
기괴하게도 여기 예제를 읽는 것이 가장 모호한 것은 아니며 "가장 실용적"으로 묶인 것 같습니다.
HRRambler

6
ROFL은 여기에 당신을 도와 줄 +1입니다-Rodolfo 위반에 다시 한번!
HRRambler

3
@RodolfoDias 시작할 수 있습니다. 나는 그들을 기다리고 있습니다. 당신은 120 투표권이 있습니다.
ghosts_in_the_code

176

피에트

팩 토이 드

Piet은 소스 코드가 이미지로 구성된 프로그래밍 언어입니다. 프로그램 흐름은 왼쪽 상단 픽셀부터 시작하여 픽셀과 픽셀 그룹 사이에서 이미지 주위에서 끝날 때까지 이동합니다.

가독성을 위해 Piet 프로그램은 일반적으로 확대 버전으로 표시됩니다. 그러한 경우,이 용어 codel는 소스 이미지에서 개별 픽셀에 대응하는 동일한 컬러 픽셀 그룹을 설명하는 데 사용된다.

이 과제를 위해 Piet는 문자를 사용하지 않기 때문에 샘플 프로그램에 투표 당 하나의 코덱이 사용됩니다.

1 코델

1 코델

이것은 유효한 프로그램이며 아무것도하지 않고 종료됩니다. 제어 흐름은 왼쪽 상단 (유일) 픽셀에서 시작하여 빠져 나갈 수 없으므로 프로그램이 종료됩니다.

이 경우 픽셀은 동일한 효과를 내기 위해 어떤 색상이든 사용할 수 있습니다.

2 개의 코덱

2 개의 코덱

이것은 stdin에서 지속적으로 문자를 읽고 총 유니 코드 값의 총계를 유지합니다 (이 총계로 아무것도 수행되지 않고 표시되지는 않음).

Progam 흐름은 두 개의 코덱 사이에서 앞뒤로 움직입니다. 각 코드에서 유일한 방법은 다른 코드로 들어가기 때문입니다. piet의 명령은 두 영역의 색조와 밝기의 차이에 따라 한 코덱 또는 영역에서 다른 코덱 또는 영역으로 이동하여 실행됩니다. 는 input왼쪽에서 오른쪽으로 이동 명령 된 후는 add오른쪽에서 왼쪽이다. 첫 번째 add명령에서는 스택에 하나의 값만 있기 때문에 아무 일도 일어나지 않으며 사양에 사용 가능한 값이없는 명령은 무시됩니다.

이 프로그램은 대부분의 piet 프로그램의 크기가 매우 작기 때문에 절대로 끝나지 않는 루프입니다. 프로그램 흐름을 올바르게 "포획"하고 끝내려면 최소한 몇 개의 코덱이 필요하기 때문입니다.

3 개의 코덱

3 개의 코덱

이것은 기본 반향 유형 프로그램으로, stdin에서 한 번에 문자를 읽고 stdout으로 인쇄합니다.

다시 이것은 무한 루프입니다. 이 프로그램은 왼쪽으로 여행 오른쪽 수행하는 시작 inputoutput. 프로그램은 가능할 때마다 같은 방향으로 계속 흐릅니다. 연한 녹색 코덱에서 유일한 출구는 다른 방향으로 되돌아 가기 시작하는 것입니다. 오른쪽에서 왼쪽으로 다시 이동하면 수행 subtractadd명령을 시도 하지만 스택이 비어 있으므로 이들은 작동하지 않습니다.

4 개 코덱

4 개 코덱

무한정으로 2를 stdout으로 인쇄합니다.

기능적으로 특히 흥미로운 프로그램은 아니지만 이제 복합적인 수의 코덱이 생겼으므로 왼쪽에서 오른쪽보다 약간 더 고급 흐름을 보여줄 수 있습니다. 프로그램 흐름이 코덱을 종료하려고 시도하면 먼저 현재 방향을 시도합니다. 그것이 불가능하다면 (이 경우 이미지의 가장자리로 인해) 시계 방향으로 90도 회전하고 다시 종료하려고 시도합니다. 이 경우, 프로그램은 시계 방향으로 한 번에 1 개의 코덱으로 진행 push하며, 스택에 1을 두 번 add묶고, 서로 묶은 다음 output결과를 얻습니다 .

5 개 코덱

5 개 코덱

stdin에서 한 번에 한 문자 씩 반복해서 읽고 유니 코드 값의 합계를 추적합니다.

이것은 본질적으로 2-codel 버전과 동일한 기능이지만,이 과제는 언어를 보여주는 것입니다. piet의 멋진 점 중 하나는 같은 일을하는 다른 모양의 그림을 얻는 방법입니다.

여기서 우리는 처음으로 흰색 코덱을 보게되는데,이를 통해 프로그램 흐름이 명령을 실행하지 않고 그것을 가로 질러 미끄러지게 할 수 있습니다. 마젠타 색과 파란색 코덱은 모든 작업을 수행합니다. 파란색에서 빨간색으로 이동하면 중간에 흰색 코덱이 교차하기 때문에 아무것도 수행되지 않습니다. 두 개의 빨간색 push은 스택에 숫자 1 만 있고 pop왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로 이동하면서 흰색 코덱을 가로 질러 이동하므로 명령이 실행되지 않습니다.

6 개 코덱

6 개 코덱

다시, 다른 모양으로 이전 기능을 반복합니다. 이것은 stdin에서 stdout까지 한 번에 문자를 읽는 또 다른 echo 프로그램입니다.

여기에 첫 번째 검은 색 코덱이 있습니다. 프로그램 흐름은 검은 색 코덱으로 들어갈 수 없으므로 오른쪽 상단의 밝은 마젠타 색 코덱에서 이미지 가장자리로 인해 프로그램이 제대로 종료되지 않고 검은 색 코덱으로 인해 종료되지 않고 빨간색 코덱으로 다시 바운스됩니다. . 파란색과 녹색 코덱은 순전히 장식 적이며 프로그램은 절대로 들어 가지 않습니다.

7 개 코덱

7 개 코덱

다른 모양의 또 다른 에코 프로그램.

여기에서 우리는 크기 1보다 큰 첫 번째 코덱 블록을 볼 수 있습니다. piet에서 동일한 색상의 연속적인 코덱 블록은 단일 블록으로 취급됩니다. push명령어를 실행할 때를 제외하고 블록의 크기는 중요하지 않으므로이 프로그램은 다른 색상을 제외하고는 3 코드 버전과 동일하게 취급됩니다.

8 개 코덱

8 개 코덱

stdin에서 숫자를 읽고 정사각형을 stdout에 반복적으로 출력합니다.

제어 흐름은 4-codel 프로그램에서와 마찬가지로 기본 시계 방향 패턴입니다. 상단 좌측부터 순서대로 연산은 input, duplicate(스택으로 스택의 꼭대기 값의 여분의 복사본을 밀어) multiply, output. 그런 다음 push값 1을 스택으로 가져오고 흰색을 가로 질러 미끄러지므로 명령이 실행되지 않고 pop왼쪽 하단에서 왼쪽 상단 코덱으로 이동할 때 스택에서 1 을 s합니다. 빈 스택으로 프로그램 시작 부분으로 되돌리고 반복됩니다.

9 개 코덱

9 개 코덱

1 + 2 = 3을 더한 다음 종료합니다.

이제 두 차원에서 2 개 이상의 코덱을 가진 프로그램이 생겼으므로 마지막으로 프로그램을 트랩하고 영원히 반복하는 대신 종료 할 영역을 설정할 수 있습니다. 빨간색 코덱에서 짙은 빨간색 영역으로 이동하는 첫 번째 작업 push은 1이고, 프로그램은 회전하여 중간에 밝은 빨간색 코덱으로 흘러 내려 가고 push값은 2입니다. 밝은 빨간색에서 밝은 노란색으로 흐르는 것이 실행됩니다. add작업. 하단의 연한 노란색 막대는 모든 모서리가 막혀서 흘러 나올 수있는 방법이 없기 때문에 프로그램이 종료됩니다.


1- 및 2-high 프로그램은 빠르게 추악하고 흥미롭지 않으므로이 시점부터 각 방향에서 최소한 몇 개의 코덱을 허용하는 숫자에 중점을 둘 것입니다.

12 개 코덱

12 개 코덱

마지막으로 유용하다고 주장 할 수있는 작업을 수행하는 프로그램입니다 (아직 약간 확장되어 있음). stdin에서 2 개의 숫자를 순차적으로 읽은 다음 해당 합계를 출력하고이를 반복적으로 수행합니다.

프로그램은 4 개의 컬러 바 퍼포밍 2에서 왼쪽에서 오른쪽으로 흐르고 명령이 inputs이어집니다 add. 그런 다음 오른쪽 아래 코덱으로 이동하여를 수행 한 output다음 흰색 영역을지나 왼쪽으로 다시 시작합니다.

이 작업은 8 개의 코덱으로 수행 할 수 있었지만 여분의 공간이 있기 때문에 신호가없는 오래된 TV 디스플레이에서 약간 영감을 얻은 것을 만들 수 있습니다.

15 개 코덱

15 개 코덱

stdin에서 숫자를 읽고 '제곱을 출력합니다.

이것은 몇 가지 트릭을 사용하여 실제로 무언가를하는 프로그램에 대해 약간의 대칭 모양을 얻습니다. 가장 왼쪽에있는 빨간색 막대는 나머지 코덱과는 다른 색상과는 다른 색상으로, 적어도 두 가지 빨간색 음영이 매우 비슷하다는 사실을 이용합니다. 프로그램은 연한 빨간색 영역에서 연한 파란색 코덱으로 이동 한 다음 프로그램의 중간을 가로 질러 오른쪽에 연한 녹색으로 갇히게됩니다. 그것은 수행 input, duplicate, multiply, 및 output작업.

가운데 열의 맨 위와 맨 아래에있는 중간 녹색 코덱과 함께 진한 빨간색 코덱은 장식 적이며 프로그램은 결코 도달하지 않습니다.

20 개 코덱

20 개 코덱

0을 읽을 때까지 stdin에서 숫자를 읽습니다.이 시점에서 입력 된 모든 숫자의 합계를 출력하고 종료합니다.

우리는 마침내 pointer작업 의 형태로 흐름을 제어 할 수있는 충분한 공간이 있습니다. 상단 4 codels 수행 input, duplicatenot동작, 그리고 다른 not동작이 아래 노란색 2 CODEL에 오른쪽 상단 마젠타에서 이동. 이 not작업은 스택에서 최상위 값을 팝하고 최상위 값이 0이면 1을, 그렇지 않으면 1을 푸시합니다. 따라서 이중 not대체는 0이 아닌 모든 값을 1로 대체합니다. 노란색 막대에서 진한 파란색으로 아래로 pointer이동하면 스택의 최상위 값이 팝되고 방향 포인터가 시계 방향으로 여러 번 이동 하는 작업이 수행 됩니다.

상단 값이 1 인 경우 (즉, 0을 입력하지 않은 경우) 방향 포인터는 왼쪽을 가리키고 add작업 의 마젠타 코덱으로 이동 합니다 (스택의 값 하나만으로 인해 처음 무시 됨). 그런 다음 흰색을 통해 프로그램 시작으로 돌아갑니다.

포인터 작업에서 스택의 최상위 값이 0이면 방향 포인터가 변경되지 않고 프로그램이 아래쪽으로 계속 진행됩니다. 연한 파란색 밴드로 이동 pop하면 스택에서 0이 입력되고 누적 된 숫자의 합계 만 남습니다. 하단의 청록색 막대로 이동하면 output그 합계가 계산되고 프로그램 흐름이 갇히기 때문에 종료됩니다.

25 개 코덱

25 개 코덱

카운트 다운! stdin에서 숫자를 읽은 다음 한 번에 하나의 숫자를 stdout하기 위해 카운트 다운을 1로 인쇄합니다. 예를 들어, 5를 읽으면 54321이 인쇄됩니다.

청록색에서 노란색으로의 첫 번째 작업은 input입니다. 그런 다음 노란색은 "loop"프로그램이 시작되는 곳입니다. 노란색> 마젠타> 블루는 것입니다 duplicate다음 output, 그래서 스택에 최고 값을 출력하지만, 복사본을 유지합니다. 우측 아래로 이동, 우리는 push스택에 값 1은 다음을 수행 subtraction옆 1 선택하고 입력 값을 감소 duplicate, not및 다른 not옆 어두운 황색 우측 하단에 라이트 마젠타에서 이동. 이것은 이전 프로그램과 동일한 0/0이 아닌 확인입니다. 연한 파란색 코덱으로 왼쪽으로 이동하면 pointer작업이 수행됩니다. 작업이 완료되면 프로그램을 종료하기 위해 어두운 청록색으로 왼쪽으로 이동하거나 초기 입력없이 루프를 다시 시작하려면 노란색까지 올라가지 만 원래 값은 감소합니다. 1 씩

빨간색 코덱 3 개는 모두 장식용이며 어떤 색상이든 가능합니다.

30 개 코덱

30 개 코덱

피보나치 생성기. 피보나치 수열의 항을 표준 출력으로 인쇄하고 멈추지 않습니다.

이것은 roll연산자 의 첫 번째 소개이며, 1보다 큰 영역 크기가 push연산자 와 함께 사용되어 스택에 특정 값을 얻는 경우도 처음 입니다.

항상 왼쪽 상단에서 오른쪽으로 이동합니다. 첫 번째 2 push는 스택에 대한 1을 연산 한 다음 output피보나치 시퀀스가 ​​2 개의 1로 시작하기 때문에 1을 1 회만 인쇄합니다. 그런 다음 push스택에 2 개의 1을 더 가져와 오른쪽 상단의 진한 자홍색으로 끝나서 주 프로그램 루프를 시작합니다.

오른쪽 우리를 아래로 이동 duplicate하고 output다음 순서의 다음 학기 떨어져 인쇄 duplicate현재 시퀀스 값의 사본을 얻기 위해 다시. 하단에서 왼쪽으로 이동하면 2 가지 push작업이 실행 됩니다. 오른쪽 하단의 연한 빨간색 영역의 크기는 3 코덱이므로 첫 번째 push는 1 대신 3을 스택에 푸시합니다.

하늘색으로 올라가는 roll동작입니다. 스택에서 상위 2 개의 값을 팝하고 첫 번째 팝된 값과 같은 수의 롤을 두 번째 팝된 값과 같은 깊이까지 수행합니다. 이 경우 1 롤에서 깊이 3의 롤을 n수행합니다. 롤 투 깊이 는 스택의 최상위 값 (복제 된 현재 값)을 가져 와서 n깊이 배치합니다. 우리 스택은 지금 3 깊이에 불과하므로 맨 아래에 최고 가치를 묻습니다.

한 번 더 위로 이동 add하면 현재 시퀀스 값과 이전 시퀀스 값을 더한 연산이 수행 됩니다. 스택에는 이제 다음 (새로운 현재) 시퀀스 값이 있고 그 아래에 마지막 값이 있습니다. 프로그램은 이제 루프를 다시 시작하기 위해 흰색에서 오른쪽으로 진한 자홍색으로 이동합니다.

가운데의 노란색 패턴은 사용되지 않습니다.

54 개 코들

54 개 코들

"안녕하세요!" 표준으로

특별히 긴 메시지는 아니지만 피에트로 인쇄하는 데는 상당한 공간이 필요합니다. 유니 코드 값을 사용하여 인쇄가 수행되고 종료되는 영역의 크기를 사용하여 정수가 스택으로 푸시됩니다. 우리는이 문제에 대해 매우 제한된 수의 코덱을 가지고 있기 때문에 원하는 인쇄 가능 범위에 도달하기 위해 수학을 사용합니다.

프로그램은 push왼쪽의 청록색 영역에서 5로 시작합니다 . 여기 duplicate에서 스택을 5 초로 준비하기 위해 6 개의 작업으로 맨 위로 흐릅니다 . 다음은 스택 상단에 4를 넣고 push1을 subtract스택 상단에 multiply4 * 5 * 5 = 100을 두는 작업입니다. 그런 다음 duplicate2 대 100에 대한.

이제 프로그램이 검은 색에서 튀어 나와 하단을 따라 왼쪽으로 작동하기 시작합니다. Push3과 2의 연산을 수행 한 다음 a roll를 사용하여 5 아래에 2100을 묻습니다. 다음은 push1을 빼고 덧셈하여 스택 위에 100 + 5-1 = 104 (unicode "h")를 추가합니다. 다음 2 개 작업은 push1 개이며 pointer모퉁이를 돌아서 가운데를 따라 오른쪽으로 이동 한 다음 output"h"를 인쇄합니다.

다음은 add스택 위에 100 + 5 = 105이고 output"i"를 인쇄합니다. 스택에는 이제 두 개의 5가 포함됩니다. Push도 1은 add, multiply(1 + 5) * 5 = 30 준다. 마지막으로 push3과 add33, 그리고 output후행 "!". 그런 다음 프로그램은 나머지 공백을 통과하여 오른쪽의 녹색으로 끝납니다.


5
아 그래, 이것을 기다리고 있었다 :)
Sp3000

2D 문자 언어와 다른 점은 무엇입니까? 셀 값을 전달하는 방식입니다.
JDługosz

25
@jdlugosz 많은 난해한 프로그래밍 언어는 고유 한 방식으로 명령을 인코딩하는 몇 가지 기본 스택 조작 명령 일뿐입니다. 개인적으로 이미지로 인코딩하는 것이 깔끔한 생각이라고 생각합니다.
스펜서

13
기능적 동등성을 이야기하는 경우 "Turing 기계와 다른 점은 무엇입니까?" 그러나 고양이 나 행성 목성 또는 다른 언어에서도 같은 질문을 할 수 있습니다.
trichoplax

3
9 개의 코드 예제는 미니 포켓볼처럼 보입니다. 좋은.
The_Basset_Hound 1

155

> <> (물고기)

(참고 : 일부 스 니펫은 이전 스 니펫을 기반으로하므로 대부분의 답변과 달리 가장 빠른 것부터 최신으로 결정하기로 결정했습니다.)

사실 :

Befunge와 마찬가지로> <>는 스택 기반 2D 언어입니다. 이는 명령어가 대부분의 기존 언어와 같이 선형으로 실행되지 않음을 의미합니다. 프로그램 흐름은 위, 아래, 왼쪽 또는 오른쪽 일 수 있습니다!

길이 1 스 니펫 :

X

X> <>에서 유효하지 않은 명령이므로 오류 메시지 something smells fishy...가 인쇄됩니다. 실제로 이것은 원인이 0으로 나뉘거나 빈 스택을 팝하려고 시도하는지 여부에 관계없이> <>의 유일한 오류 메시지입니다.

길이 2 스 니펫 :

1n

> <>의 프로그램 흐름은 왼쪽 상단에서 시작하여 처음에는 오른쪽입니다. 11을 스택에 넣은 다음 nASCII 문자가 아닌 숫자로 인쇄합니다. 그러나> <> 프로그램은 환상적이므로 명령 포인터가 줄 끝에 도달하면 줄 바꿈됩니다. 그래서 n우리가 처음으로 포장 한 후 1을 누르고, 인쇄하고, 처음으로 포장하고, 1을 누르고, 인쇄 ... 그리고 우리는 1영원히 인쇄를 끝냅니다 !

길이 3 스 니펫 :

"o;

다음 "은 문자열 구문 분석이며 oASCII 문자로 출력되며 ;프로그램을 종료합니다. 그러나 프로그램은 실제로 전체적으로 무엇을 하는가?

먼저 문자열 파싱을 시작하여 닫는 것을 찾을 때까지 모든 문자를 스택에 밀어 넣습니다 ". 우리는 oa를 누른 다음, ;...을 지시 포인터를 처음으로 다시 감싼다. 그러나 이제 우리는 문자열 파싱 "멈추고 마침내 스택의 상단 ()을 인쇄 하고 종료 하기 위해 oand ;를 정상적으로 실행합니다 ;.

예, 우리는 문자열을 시작하고 끝내기 위해 동일한 인용 문자를 사용했습니다!

길이 4 스 니펫 :

42n;

지금까지 본 내용에 따라 42를 누르고 숫자로 출력 한 다음 종료 될 것으로 예상 할 수 있습니다. 그러나> <>의 모든 명령어는 단일 문자이므로 실제로 4와 2를 푸시 다음 스택 맨 위를 숫자 (2 만)로 출력하고 종료합니다.

길이 5 스 니펫 :

<v
;>

> <>는 2D 언어입니다. 이것은 프로그램 흐름의 방향을 바꿀 수있는 방법이 있다는 것을 의미합니다!

Befunge와 마찬가지로이를 수행 할 수있는 한 가지 방법은 화살표를 사용하는 것 >^v<입니다. 작동 방식을 설명하기 위해 위의 프로그램을 살펴 보겠습니다.

  • 프로그램 흐름은 처음에는 옳다
  • < 프로그램 흐름을 왼쪽으로 이동-왼쪽으로 이동하여 v
  • v 프로그램 흐름을 아래쪽으로 이동시킵니다. >
  • > 프로그램 흐름을 오른쪽으로 이동-오른쪽으로 이동하여 ;
  • 마지막으로 종료합니다.

길이 6 스 니펫 :

";"00p

> <>의 또 다른 멋진 기능은 재귀 적이라는 것입니다. 프로그램은 즉시 자체 소스 코드를 수정할 수 있습니다!

여기서 우리 ;는 두 개의 0을 누른다 . p다음 세 가지 요소를 튕겨 y, x, v( y스택의 상단 인) 장소 v위치에서를 x,y. 즉, p이 프로그램에서는 세미콜론을 위치 0,0에 놓고 코드를로 바꿉니다 ;;"00p. 그러면 명령 포인터가 줄 바꿈되어 새로 배치 된을 실행하므로 프로그램이 종료됩니다 ;.

길이 7 스 니펫 :

\7*n;
6

취소 비 펀지 등> <>는 또한 미러 (갖는 \/|_#프로그램 흐름의 방향을 반영). 그래서 여기에 :

  • 오른쪽에서 시작하지만 \아래로 우리를 반영
  • 6을 누르고 포장
  • 의 뒷면을 치고 \오른쪽으로 다시 반영
  • 7을 밀어
  • 스택의 상단 2 개를 곱하십시오
  • 출력 및 종료

_거울을 통해 수평으로 또는 거울을 통해 수직으로 이동 |하는 것은 작동하지 않습니다.

길이 8 스 니펫 :

"r00g>o<

오류가 발생하면 가장 간단한> <> quine 일 수 있습니다. 여기에 두 가지 새로운 지침이 있습니다.

  • r: 스택 반전
  • g- 팝 받기 y, x및에있는 문자를 밀어 x,y스택에 (대응에를 p)

이전의 문자열 래핑 트릭을 사용하여 프로그램은 처음 r00g>o<에 첫 번째 따옴표를 누른 다음 다시 한 번 인용합니다. 그런 다음 스택이 반전되어을 제공 <o>g00r합니다. 그 후 우리의 char 밀어 0,0"제공하기를 <o>g00r". 마지막으로, o두 개의 화살표 사이를 잡아서 아무것도 남지 않을 때까지 스택 상단을 출력하고 오류가 발생합니다.

길이 9 스 니펫 :

x0\>
\1n>

x(소문자)는 명령 포인터를 임의의 방향으로 이동시키고 프로그램은 임의의 비트를 영원히 인쇄하여이 기능을 보여줍니다. 이것이 어떻게 작동하는지 알아 내기 위해 화살표와 거울을 따라보십시오! (위와 왼쪽을 포함하여 네 방향을 모두 확인하는 것을 잊지 마십시오)

길이 10 스 니펫 :

;a comment

> <>에는 주석 구문이 없습니다. 주석 구문이 필요하지 않습니다. 어디서나 원하는 것을 작성하고 코드로 실행되지 않도록하십시오!

길이 11 스 니펫 :

1!X2!X+!Xn;

!지시를 건너 뛰는 트램폴린입니다. 스택 맨 위를 팝하고 팝 된 요소가 0이 아닌 경우 다음 명령을 실행 ?하는 조건부 트램폴린 과 함께 사용할 때 특히 유용합니다 . 나중에 어떻게 작동하는지 보겠습니다.

위의 코드는 Xs 를 건너 뛰고 실행 만하여 3을 인쇄합니다 1! 2! +! n;.

길이 12 스 니펫 :

01v
ao>:@+:n

피보나치 수 1를 각 줄에 하나씩 두 번째부터 영원히 인쇄합니다 . 새로운 명령은 다음과 같습니다.

  • a: 개행에 필요한 10을 누릅니다. a-f10 ~ 15를 각각 누릅니다.
  • :: 스택 상단 복제
  • @: 스택의 맨 위 세 요소를 회전시킵니다 (예 :) [5 4 3 2 1] -> [5 4 1 3 2].

처음 몇 번의 반복에 대한 추적 :

여기에 이미지 설명을 입력하십시오

길이 13 스 니펫 :

i:d=?v
l?!;o>

"tac"프로그램은 입력 라인에서 읽고 출력을 반대로합니다. 스 니펫에 대한 @tomsmeding에 감사드립니다.

=상단 두 요소를 팝하고 같으면 1을, 그렇지 않으면 0을 푸시합니다. 첫 번째 행은 ASCII 문자 13 (캐리지 리턴)이 발견 될 때까지 입력을 계속 읽으며 두 번째 행으로 이동합니다.

l?!;o루프는 전체 스택을 출력> <>에서 중요한 구조이다. 와 달리 >o<오류가 발생하지 않습니다. 이것이 작동하는 방식입니다.

  • l 스택의 길이를 푸시
  • 우리는 길이를 확인합니다 ?:
    • 길이가 0이 아닌 경우 다음 명령 !이 실행되고;
    • 길이가 경우 였다 제로, 우리는 실행되지 않습니다 !및 때문에 종료;

캐리지 리턴에 도달 할 때까지 실제로는 출력이 발생하지 않습니다.

길이 14 스 니펫 :

32.

   X67*n;

프로그램 흐름 방향을 변경하는 것 외에도 실제로 원하는 위치로 명령 포인터를 이동할 수 있습니다!

.y, x및에 명령 포인터 순간 이동 x,y방향을 유지. 그러나 원하는 곳으로 이동하기 전에 한 사각형으로 이동해야합니다. 다음 명령이 실행되기 전에 명령 포인터가 업데이트됩니다. 따라서 명령 포인터는 invalid X6도달 하지만 실행을 계속하기 전에 포인터로 이동하기 때문에 모두 괜찮습니다 .

.대부분의> <> 프로그램을 하나의 라이너로 변환하는 것이 가능하지만 왜 2D의 재미를 잃고 싶습니까? :)

길이 15 스 니펫 :

01+:aa*=?;:nao!

각 줄에 하나씩 숫자 0를로 인쇄합니다 99. 이 프로그램은 !트램폴린 의 깔끔한 사용법을 보여줍니다. 초기 0이 한 번만 푸시되도록합니다.

길이 16 스 니펫 :

"r00g!;oooooooo|

esolang 페이지 의 quine에서 영감을 얻은 오류가 발생 하지 않는 적절한 quine입니다 .

당신이 오류가 발생하지 않을 수 있도록 (8 조각 번호) 이전 quine을 수정하는 방법에 대해 궁금해하고 생각하면 "왜 단지의 톤을 추가하지 마십시오 o? 지침"당신은 모든위한 것을 깨닫게 수 o추가를 , 당신은 다른 출력해야합니다 o! 이 quine |은 끝에 거울을 두어 각각 o두 번 사용할 수있게 하여 문제를 깔끔하게 해결합니다 .

작은 따옴표 (문자열 구문 분석 용)로 전환하면 사용하지 않는 대체 퀴닝 g은 다음과 같습니다.

'r3d*!;oooooooo|

길이 17 스 니펫 :

b2,63,.

   17,n;

우리는 더하기 ( +), 빼기 ( -), 곱하기 ( *), 모듈로 ( %)를 가지고 있습니다 ... 그러나 나누기는 어떻습니까? 거기에 있지만 /이미 거울 이기 때문에 부서에 ,대신 기호 가 할당되었습니다 . 흥미롭게도, 나누기는 정수 나누기가 아니라 부동 나누기입니다!

위의 프로그램은로 이동하여 정의되지 않은 동작을 탐색합니다 11/2, 6/3. 파이썬 intepreter는 (은 잘못된 장소로 이동하더라도) 좌표 첫 번째 정수가 아닌 경우 좋아 보이지만, 두 번째가 아닌 경우 질식.

길이 18 스 니펫 :

123456${{$}nnnnnn;

우리는 r어느 것이 스택을 반대로하고 @어떤 것이 상위 3 개의 요소를 회전시키는지를 보았습니다 . 다음은 스택에서 요소를 이동시키는 몇 가지 명령입니다.

  • $: 상위 두 요소 교환
  • {: 전체 스택을 왼쪽으로 이동
  • }: 전체 스택을 오른쪽으로 이동

작동 방식을 보여주기 위해 프로그램 추적은 다음과 같습니다.

123456 ------> 123465 ------> 234651 ------> 346512 ------> 346521 ------> 134652
       $ Swap        { L shift      { L shift       $ Swap        } R shift

그런 다음 출력 256431합니다.

길이 19 스 니펫 :

"reward"4[roooo]oo;

지금까지 나는 "스택", "스택"이라고 말하고 있습니다 ...

대부분의 프로그램은 하나의 스택 만 사용하지만> <>는 실제로 여러 스택을 가질 수 있습니다! 관련 지침은 다음과 같습니다.

  • [: x상단 x요소를 팝업 하여 새 스택으로 이동
  • ]: 현재 스택을 제거하고 해당 값을 기본 스택으로 이동합니다.

위의 프로그램에 대한 추적은 다음과 같습니다.

       [r e w a r d]       Push "reward"
4[     [r e] [w a r d]     Move four elements to a new stack
r      [r e] [d r a w]     Reverse the current stack
oooo   [r e] []            Output "ward"
]      [r e]               Remove the current stack, no values to move
oo     []                  Output "er", giving "warder" altogether

스택의 "선입 선출 (first in, last out)"특성으로 인해 간단히 눌렀다가 reward다시 출력하면 ooooooprint가 drawer됩니다.

길이 20 스 니펫 :

aa*5+\
7a*2+\
oo;  \

> <>의 약간의 알려진 기능은 Python과 같이 백 슬래시를 여러 줄에서 연속으로 사용할 수 있다는 것입니다. *

위의 코드는 기능적으로 동일합니다

aa*5+7a*2+oo;

* 면책 조항 : 이것이 작동하는 이유는 완전히 다른 이유 일 수도 있고 아닐 수도 있습니다.

길이 22 스 니펫 :

1&fv ;n&<
&1->:0=?^:&*

스택 외에도> <>에는 값을 저장하는 데 사용할 수있는 레지스터 (각 스택에 하나씩)가 있습니다. &처음 호출 하면 스택의 최상위 값이 레지스터로 &이동하고 다시 실행 하면 값이 다시 이동합니다. 이는 합과 계승과 같은 값을 누적 할 때 매우 유용 할 수 있습니다.

위의 프로그램은 f(15) 의 계승을 계산하여 1307674368000을 인쇄합니다. 다음은 다음으로 f대체 된 트레이스입니다 4.

여기에 이미지 설명을 입력하십시오

길이 24 스 니펫 :

"Hello, World!"rl?!;of0.

우리는 모두가 좋아하는 프로그램을 위해 충분한 문자를 가지고 있습니다! 여기서 우리 .는 출력 루프에 텔레 포터를 사용합니다 .

길이 25 스 니펫 :

0i:0(?v$a*$"0"-+!
   ;n~<

불행히도> <>는 한 번에 한 문자 씩 STDIN에서 읽을 수만 있기 때문에 숫자 읽기가 약간 까다로워집니다. 숫자 0-9로 구성된 입력의 경우,이 프로그램은 본질적으로 atoi이며 STDIN의 숫자 문자열을 스택의 숫자로 변환 한 다음 인쇄됩니다.

또 다른 메모는 EOF i에서 스택에 -1을 푸시 한다는 것입니다 . 따라서 0 (또는 "보다 작음"을 사용하여 0과 비교하여 EOF를 쉽게 확인할 수 있습니다.

이 스 니펫은을 사용 ~하여 스택의 맨 위 요소를 팝하고 버립니다.

길이 33 스 니펫 :

i>:nao:1=?;\
 ^  ,2v?%2:/
 ^+1*3<

지금까지 대부분의 스 니펫은 상대적으로 선형 적이거나> <>의 기능을 보여주는 단순한 예제 일뿐입니다. 이제 잘 정리 된 프로그램으로> <>의 프로그램 흐름을 시각화하는 것이 얼마나 쉬운지를 강조하는 예제를 제공 할 수 있습니다.

프로그램은 단일 ASCII 문자를 읽고 3x+1코드 포인트 에서 알고리즘을 실행합니다 (In> <>에서 문자는 기본적으로 정수임). 알고리즘의 각 단계는 1에 도달 할 때까지 인쇄됩니다.

다음은 입력 a(코드 포인트 97)이 있는 처음 몇 번의 반복에 대한 추적입니다 .

여기에 이미지 설명을 입력하십시오

길이 44 스 니펫 :

a&>i:0(?v"+"$\
/&^?=0l< "a*"/
\:1+&2p/\0
n
;

p스 니펫 # 6에서 다시 한 번만 사용한 명령 정의를 수행 한 것처럼 느껴지지 않으므로 다른 atoi 함수가 있습니다. 이것에 대한 멋진 점은 무엇입니까? 프로그램 입력을 읽을 때 숫자를 계산하는 데 필요한 식을 씁니다 !

따라서 같은 입력을 위해 573모든 문자를 읽은 후 세 번째 줄의 끝은 \0a*5+a*7+a*3+573으로 평가됩니다!

다시 한번, 입력은 숫자 일 것으로 예상됩니다. 여기에서 GIF를 추적하십시오 .

길이 74 스 니펫 :

>i:'A'(?v:'N'(?v:'['(?v\
  :'a'(?v:'n'(?v:'{'(?v\
^      o<    +d<  -d-d<o

여기까지 가봤다면, 이것이 매우 읽기 쉬운 ROT13 프로그램이라고 말할 때 저에게 동의 할 것입니다. 숯불을 감안할 때 c1, 우리는 첫 번째 문자를 찾을 수 c2있는 AN[an{되도록, c1 < c2다음 감산 / 가산함으로써 적절한 오프셋을 적용 d(13). 그 주 [{직접 후 문자입니다 Zz각각.

콘솔에서 사용 해보고 입력하는 동안 글자가 변형되는 것을보십시오!

(입력에 파이프를 넣을 수도 있지만 EOF 검사가 없으면 :0(?;-1을 문자로 인쇄하려고하면 오류와 함께 중지됩니다)


13 조각에 대한 아이디어는 : i:d=?v NEWLINE o;!?l<- 거꾸로 입력 행을 인쇄
tomsmeding

12
나는 지금 학습을 시작하기 위해 영감을하고, 나는이 최대 투표를 더 줄 수 있으면 좋겠다> <> ...
Robobenklein

6
상단에서 시작하여 아래로 +1 (읽기 재미 있어서도)
mbomb007

5
@ mbomb007 그러나 순서가 왼쪽 / 오른쪽으로 이동하여 페이지의 맨 아래로 랩핑 될 수 없다는 것은 부끄러운 일입니다. : P
krs013

something smells fishy...다음 줄에 글 을 쓴다면 길이 8 스 니펫은 진정한 퀴즈 입니다.
wizzwizz4

148

C – 편집

투표 해 주셔서 감사합니다! 다른 언어와 제한된 바이트로 수행 할 수있는 작업과 비교할 때 C는 쓸모없고 까다 롭고 개발자에게 너무 의존적입니다. 여러 가지면에서 자동 메모리 관리 기능이있는 스크립트 및 고급 언어는 C보다 훨씬 표현력이 뛰어나고 생산 속도가 빠릅니다.

그렇다면 왜 C 기능입니까?

이러한 모든 스크립팅 언어의 숨겨진 비밀은 인터프리터가 C (또는 더 최근에는 C ++ 또는 Java)로 작성 될 가능성이 있다는 것입니다. 최초의 C ++ 컴파일러는 실제로 C 코드로 컴파일되었습니다. 실제로 직접 컴파일러의 시장이 나올 때까지 C를 생성하기 위해 컴파일러를 작성하고 컴파일하는 것이 일반적으로 더 비용 효율적입니다.

매우 작은 플랫폼에서 작업하거나 운영 체제가없는 경우에도 C에서 작업하고있을 가능성이 높습니다. 요즘에는 거의 모든 어플라이언스에 마이크로 컨트롤러가 내장되어 있으며 의심 할 여지없이 C로 프로그래밍되어 있습니다. 작고 빠른 C는 갈 길입니다. (또한 마조히스트에게도 마찬가지입니다.)

C를 아는 것은 어셈블러에 들어 가지 않고도 가능한 한 금속에 가까이 다가 가며 다른 언어로 도와줍니다. C ++ 가상 함수가 어떻게 작동하는지 잘 알고 있습니다. PHP에서 이러한 값별 재귀 함수를 작성할 때 내부적으로 많은 메모리 할당 및 복사를 수행하므로 본능적으로 참조 기준을 시도하십시오. 콜백과 참조는 C 개발자를 놀라게하지 않습니다.

Kernighan과 Ritchie가 고전적인 C Programming Language , 2 판 의 서문에서 언급했듯이 C는 큰 언어가 아니며 큰 책으로 잘 제공되지 않습니다. 이 조언을 따르려고합니다. 예는 가능한 경우 두 배, 세 배 또는 더 많은 의무를 수행합니다.

모든 스 니펫은 최소한 자체적으로 컴파일 할 수 있습니다. 연결 가능하고 실행 가능한 것들이 그와 같이 표시됩니다. 이것이 필수는 아니지만 코드 스 니펫을 작동시키는 데 필요한 프레임 워크를 설명하는 것보다 간단합니다.

또한 각 코드 스 니펫이 가능한 한 짧아서 특정 길이로 채울 여분의 공간을 도입하지 않도록 노력했습니다. 코드가 들여 쓰기되는 경우 들여 쓰기는 길이에 포함되지 않고 각 줄마다 하나씩 만 포함됩니다.

팩 토이 드

C는 바위.

길이 0 스 니펫

세계에서 가장 짧은 자체 재생 프로그램 http://www.ioccc.org/1994/smr.hint

길이 1 스 니펫

;

C는 컴파일과 링크를 구분합니다. C의 많은 엔티티는 나중에 컴파일되고 링크됩니다. 예는 모두 정적 및 동적 라이브러리입니다.

다른 엔터티는 방금 포함되어 있으며 스스로 코드를 생성하지 않습니다.

위의 세미콜론은 확실히 객체 코드로 컴파일되며 아무것도하지 않습니다!

길이 2 스 니펫

x;

오래된 프로그래밍 언어 인 C는 여러 차례 반복되었습니다. 가장 널리 사용되는 것은 Kernighan과 Ritchie가 개발했으며 K & R을 축약했습니다. K & R C는 코드를 명시 적으로 제공하지 않으면 코드에 대해 많은 가정을하는 것으로 유명합니다.

특히 K & R C에서 위의 코드는 x0으로 초기화 된 전역 정수인 것으로 가정 합니다. K & R 모드에서 컴파일하면이 변수를 사용하기 위해이 변수에 연결된 프로그램을 제공하는 객체 파일이 생성됩니다.

길이 3 스 니펫

??/

C는 널리 보급되어 사용하는 모든 문자가없는 시스템에 호환성 기능을 제공해야합니다. 위의 백 슬래시에 대한 삼중 그래프는 C에서 줄 연속 문자로 사용됩니다. 위의 내용은 다음 줄이 없다는 경고와 함께 컴파일됩니다.

C의 일반적인 문화는 컴파일 경고를 무시하는 것이며, 많은 큰 코드 기반은 빌드 될 때 항상 몇 가지 이상의 경고를 갖습니다.

길이 4 스 니펫

f();

다시 K & R에서, 위의 내용은 "글로 채워져있다"는 컴파일시에 "글로벌 링크와 함께, f나중에 제공 될 함수가 존재 하는데, 고정되지만 지정되지 않은 수의 인수를 취하고 정수를 리턴한다"는 의미입니다.

와의 기본적인 차이점에 유의하십시오 f;.

길이 5 스 니펫

s="";

K & R C는 진정으로 용서하는 것으로 유명합니다. 컴파일 시이 코드는 s전역 링크 의 정수 를 제공 하며 빈 문자열의 시작 주소로 초기화됩니다 (제 생각에). K & R은 정수가 주소를 보유 할만큼 크지 않은 경우 잘림을 포함한 모든 강제 변환을 조용히 처리합니다.

발견하기 어려운 많은 버그를 생성하고 IOCCC 경쟁에서 많은 영감을 얻은 것은 이러한 구조입니다.

길이 6 스 니펫

o=042;

리터럴 숫자에서 선행 0 인 오래된 타이머조차도 뒤에 오는 숫자가 8 진 기준에 있음을 의미합니다. 위의 코드는 컴파일시 o10 진수 34로 초기화 된 전역 연결에 대한 정수 를 제공합니다 .

C의이 기능은 많은 개발자들이 숫자를 채우고 멋지게 정렬하기 위해 노력하고 있습니다.

길이 7 스 니펫

f(){f;}

위의 코드는 본문이있는 함수입니다. 그러나 무엇을 하는가? 함수의 주소를 검색하고 아무 것도 수행하지 않습니다! 일반적으로 함수가 반환 할 내용은 정의되어 있지 않습니다. 이와 같은 넌센스 코드는 종종 경고없이 컴파일 될 수 있습니다.

길이 8 스 니펫

main(){}

이것은 C에서 가장 짧은 컴파일 및 링크 가능한 코드를 나타냅니다. 최신 버전의 C에서는 함수가 일반적으로 암시 적으로 정의 될 수 없지만 역사적 이유로이 제한은 완화됩니다 main.

0 만 반환하는 프로그램의 놀라운 기능은 무시할 수없는 크기로 컴파일되며 다양한 C 런타임 루틴에서 연결됩니다. 상세 설정을 전체로 설정하고 컴파일하여 링크에서 발생하는 일을 확인할 수 있습니다.

길이 9 스 니펫

#define Z

C 헤더 파일의 주류는 #define전 처리기 지시문입니다. C 프로그램은 다양한 단계로 컴파일되며 이러한 단계 중 하나에서 이러한 정의는 실제 값으로 대체됩니다.

인수가 없으면 C는을 암시 1하므로 위의 코드는 소스 코드에서 사용되는 1모든 것을 대체 Z합니다.

위의 내용은 일반적으로 헤더 파일에 넣고 #include필요에 따라 d입니다.

길이 10 스 니펫

enum{P,Q};

enum키워드는 상수의 시리즈를 정의하는 때때로 형태 보증 된 방법을 제공합니다. 정의와 마찬가지로 헤더 파일에서 종종 사용됩니다. 위 코드를 포함하면 P0과 Q1 의 정수로 정의 됩니다 .

길이 11 스 니펫

volatile v;

volatile키워드는 컴파일러가 변수가 다른 에이전트에 의해 변경 될 수 있으며,이 액세스 간의 일정하게 유지됩니다 가정을하지 않는 것을 알 수 있도록하는 것입니다.

길이 12 스 니펫

#pragma once

#pragma once 는 비표준이지만 널리 지원되는 전 처리기 지시문으로 현재 소스 파일이 단일 컴파일에 한 번만 포함됨을 나타냅니다.

전통적이고 완벽하게 지원되는 기술은 #include추가 된 코드와 가능한 이름 충돌의 단점이있는 가드 를 사용 하는 것입니다.

길이 13 스 니펫

w(){for(;;);}

C에는 수많은 규칙이 있으며이 중 하나는 무한 루프를 나타내는 방법입니다. 이 경우 for(;;)초기화 없음, 종료 검사 없음, 기본값 1을 의미합니다. 즉, 중단되지 않음, 루핑 코드 없음을 나타냅니다.

때로는 내부의 모든 것을 할 수 ()있으며 루프 자체에는 신체가 필요하지 않습니다. 이 경우 더미 세미콜론이 끝에 추가됩니다.

위의 코드에서, 컴파일 될 때, 그것은 꽉 찬 바쁘게 루프에 들어가는 기능을 제공 할 것입니다.

길이 14 스 니펫

int a[]={1,2};

C의 배열에는 지정된 길이가 필요하지 않습니다. 빈 대괄호 []는 컴파일러에게 "직접 알아 내기"를 지시합니다. 그러나 C에서는 다른 언어와 달리 이러한 경계 외부의 배열에 액세스하는 것을 방지하는 기본 제공 방법이 없으므로 C로 알려진 "발자국을 찍으십시오"라는 은유로 이어집니다.

위의 코드는 컴파일 될 때 a1과 2로 초기화 된 두 정수 의 전역 가변 배열 을 제공합니다 .

길이 15 스 니펫

const long k=7;

const스펙은 나중에 C ++에서 빌린 C에 추가됩니다. 일반적인 인터뷰 질문은 "변수를 volatile const? 로 정의하는 것이 합리적 입니까?"입니다. const함께 enuminline에 대한 의존도 줄이기 위해 의도 된 #define형태의 안전성에 문제가있는합니다.

길이 16 스 니펫

extern void **q;

extern변수가 다른 곳에서 선언되었음을 나타내는 데 사용됩니다. void *유형은 명시 적으로 할당 문에서에서 캐스트 또는 캐스트 할 필요가 없습니다 의미 C의 표준 일반적인 유형입니다. **오퍼레이터 서열은 종종 초보자의 마음 불면 포인터, 포인터를 의미하지만, 도심 유효하다 종종 사용 C.

길이 17 스 니펫

double d=4/3-1/3;

위의 내용을 인쇄한다면 결과는 1이 될 것이며 슈퍼라고 생각할 것입니다! 로 바꾸고 double d=4/3-2/3;답은 무엇입니까? 여전히 하나입니다! C는 정수 산술을 사용하여 4/3 → 1 및 2/3 → 0, 1-0 → 1을 계산합니다!

길이 18 스 니펫

main(){puts("!");}

마지막으로 실제로 무언가를하는 코드를 얻습니다! puts헤더 파일이 필요하지 않기 때문에 C 골퍼들이 가장 좋아합니다.

puts또한 출력에 줄 바꿈을 추가합니다. 반대로 그 대응 물 gets은 줄 바꿈을 제거합니다. gets매우 통제 된 환경을 제외하고는 사용해서는 안됩니다. 버퍼 오버런에 대한 보호 기능이 없으며 많은 악용의 근본 원인입니다.

길이 19 스 니펫

#include <stdlib.h>

헤더 파일의 포함은 종종 개발자의 개인 서명입니다. 대부분 포함 lib하고 io필요할에 관계없이합니다. 일부는 헤더 파일을 정렬하여 길이가 증가하거나 감소합니다. 대부분 <>전에 넣어 "". 개인적으로 나는 TA 서명일에이 서명을 사용하여 학생들의 부정 행위를 확인했습니다. 동일한 헤더 서명? 자세히 살펴보세요!

길이 20 스 니펫

char*p=(char*)0x300;

C는 매우 낮은 수준의 기초 플랫폼에서 사용하도록 설계되었습니다. 경우에 따라 특수 메모리 매핑 포트에 직접 액세스해야 할 수도 있습니다.

위의 코드에서 포트 주소는 16 진수 300으로 정의됩니다. 모든 비트를 켜거나 현재 값을 검색 할 때 *p와 같이를 사용하여 포트 값에 액세스합니다 .*p=0xff;v=*p;

길이 21 스 니펫

int w=sizeof(double);

sizeof연산자 타입의 바이트 크기를 제공한다. 변수 이름을 사용하면 괄호가 필요하지 않습니다 (예 :) double d;int w=sizeof d;.

길이 22 스 니펫

asm("xorl %ecx,%ecx");

사용 방법 asm은 컴파일러에 의해 정의됩니다. 위의 Intel 플랫폼에서 Linux gcc 인라인 코드의 예입니다.

원래 유닉스는 어셈블러에서 작지만 무시할 수없는 코드 부분을 가졌습니다. 오늘날에도 속도가 주요 관심사이고 이식성이 절대적으로 중요하지 않다면 속도가 사용 된 것을 볼 수 있습니다.

호환 가능한 시스템에서 위의 코드는 컴파일되며 문자 그대로 액세스 할 수있는 별도의 방법이없는 분리 된 어셈블리 명령어입니다! BTW xor R,R는 등록을 빠르게 지우는 일반적인 어셈블리 언어 관용구입니다.

길이 23 스 니펫

union u{char c;int i;};

A union는 가장 큰 요소를위한 충분한 공간을 제공합니다. void *특정 라이브러리에서 공통 "불투명 한"유형을 제공하기 위해 함께 사용 된 것을 볼 수 있습니다 . 이 경우 공용체는 일반적으로 더 큰 구조의 일부가되며 구조체에는 공용체 유형을 식별하는 필드가 있습니다.

길이 24 스 니펫

/*INTS*/int i,j,k;//INTS

원래 C 주석은로 구분되고 C ++ /* comment */에서 // comment to end of line형식을 차용했습니다 .

길이 25 스 니펫

int main(void){return 1;}

위의 길이 8 스 니펫의보다 호환되는 버전입니다. 리턴 유형 및 함수 유형이 지정되며 명시 적으로 리턴 된 값이 있습니다.

C의 규칙은 0성공과 1실패, 또는 ​​엄격하게 준수 EXIT_SUCCESS하고 EXIT_FAILURE에 정의 된대로 반환 값을 사용하는 것 입니다 stdlib.h.

길이 26 스 니펫

typedef struct{int x,y;}P;

typedef특히 매우 유용합니다 typedef struct. 현대 용어로 "객체 지향 조명"이라고 부를 수 있습니다.

위의 내용을 포함시킨 후, 코드는 P전체 유형 검사와 함께 선언 및 함수에서 일반 유형으로 사용할 수 있습니다 . C ++과 달리 +, * 또는 <<와 같은 연산자를 정의 할 수 없으므로 "object-orientation-light"입니다.

길이 27 스 니펫

#define C(x,y)(((x)+1)*(y))

C는 편리한 매크로 #define구문을 가지고 있습니다.

일반적인 초보자 오류는 내부 및 / 또는 외부 괄호를 생략하여 찾기 어려운 작업자 우선 순위 오류를 발생시키는 것입니다.

길이 28 스 니펫

struct f{int s:1,e:8,m:23;};

C는 정수처럼 할당되고 읽고 조작 할 수있는 비트 필드를 명시 적으로 정의 할 수 있습니다.

위는 IEEE 단일 너비 부동 소수점 데이터 구조의 근사치입니다.

길이 36 스 니펫

f(unsigned x){return!!x&!(x&(x-1));}

많은 언어에서 숫자가 표현되는 방식에 신경 쓸 필요가 없습니다. C에서는 내부 표현을 잘 알고 있어야합니다.

내가 생각할 수있는 가장 좋은 예는 정수가 2의 거듭 제곱 {1, 2, 4, 8, ...}인지 확인하는 것입니다. C에 익숙하지 않은 사람들은 O (log (n)) 런타임에 대해 루프 및 시프트 및 모든 방식의 작업을 수행하지만 나쁘지는 않지만 위의 O (1) 런타임에서 동일한 기능을 수행합니다. 독자가 제대로 작동하는지 확인하는 연습으로 남겨 두 겠지만 실제로는 ...

!!규칙은 종종 0이 아닌 0에서 1과 0의 정수를 강제하는 데 사용됩니다. 많은 C 개발자들은 이러한 종류의 트릭을 사용하는 것을 좋아합니다 (종종 코드 선명도를 중요하게 생각하는 사람들과는 달리).

슈퍼 예리한 C 개발자는 위의 사항이 보완 및 서명 된 하드웨어에서 작동하는지 확인할 수 있습니다. 궁금한 점이 있으시다면 지금 당장 2 보완 하드웨어로 작업하는 것이 확실합니다. 정말로 운이 좋은 (또는 당신의 관점에 따라 운이 좋지 않은) 사람 만이 이것에 대해 걱정할 필요가 있습니다!

길이 48 스 니펫

#include<complex.h>
double complex c=3.0+I*4.0;

C99에는 복소수 지원이 포함되어 있습니다. 코드에서 볼 수 있듯이 실제 유형에 대한 수정 자의 형태를 취합니다. int complex c=3+I*4;내부적으로는 부동 소수점 유형으로 강제 사용할 수도 있습니다 . 위의 코드는를 사용하여 gcc로 컴파일 gcc -std=c99 -c length-48.c합니다.

더 많은 내부 내용을 보려면 -E 스위치로 컴파일하십시오. 내 gcc 버전에서 위의 선언은 double _Complex c=3.0+(__extension__ 1.0iF)*4.0;입니다. 복잡한 유형은 몇 가지 값싼 매크로가 아니라 언어에 크게 추가 된 것입니다.

125 자 이상이되면 티저 일 뿐이며, 복잡한 숫자로 재미를 느낄 수 있습니다!

길이 51 스 니펫

#include <math.h>
main(){double d=sqrt(sin(3.2));}

여러 가지 이유로 C는 sin, cos, tan, sqrt 등과 같은 표준 수학 함수에 자동으로 연결되지 않습니다. 따라서 사용되었지만 연결되지 않은 경우 개발자에게 정의되지 않은 링커 오류가 표시 됩니다. 'sqrt' 또는 다른 오류.

gcc에서 위의 코드는를 사용하여 컴파일하고 링크 gcc length-51.c -lm합니다.

참고 sin(3.2)는 음수를 반환하며 그 중 제곱근은 실제 도메인에서 유효하지 않습니다. C에서는 NaN이 오류를 나타 내기 위해 특수 값 이 리턴되며 프로그램은이를 무시해도됩니다.

C99에는 이런 종류의 수학 오류를 매우 안전하고 세밀하게 제어 할 수있는 새로운 예외 처리 기능이 많이 있습니다.

길이 63 스 니펫

static int w;static int X(int x){static int s=0;s^=x;return s;}

또는 더 깔끔하게 포맷하십시오.

static int w;
static int X(int x)
{
    static int s=7;
    s^=x;
    return s;
}

짐작 하셨겠지만 이것은 staticC에서 하나 이상의 의미를 갖는 키워드에 관한 것입니다.

처음 두 경우에는 static정수 w와 함수 X가이 파일이나 컴파일 단위 외부에서 볼 수 없으며 즉 내부에 있음을 컴파일러에 알리는 것 입니다.

이러한 함수는 외부에서 호출하기위한 것이 아니므로 인수의 유효성을 검사하지 않고 다른 모서리를 잘라낼 수 없습니다. 그들은 내부 범위를 가지고 있기 때문에, 당신은 다시 정의 할 수 있습니다 wX기타 파일, 그리고 그들은 일반적으로 분리됩니다.

마지막 경우 static정수 s는 함수 호출간에 값을 유지함을 나타냅니다 . 처음으로 X호출되면 s초기 값 7이됩니다.와 함께 배타적 OR x인 경우 새 값이 유지됩니다.

내부적으로 구현에 따라 다르지만 일반적인 메모리 구성은 s힙, 특히 초기화 된 메모리에 있고 인수 x는 스택에 있습니다. 예를 들어, 재귀 알고리즘을 구현하려면 변수가있는 위치가 중요합니다.

C의 문제는 전역 변수와 충돌합니다. 까지 wX실제로 같이 정의된다 static그들은 다음, 전 세계적으로 어딘가에 정의 된 경우, w그리고 X대신 글로벌 개체를 참조합니다.

여기서 q와는 w글로벌 때문에, 동일한 값으로 초기화 할 수있다 w설정 사용되고 q:

static int q = w;
static int w;

전역 w이 존재하지 않으면 컴파일이 실패합니다.

여기 qw같은 값으로 초기화됩니다 :

static int w;
static int q = w;

일반적으로 디자이너는 글로벌 변수 및 함수에 고유 한 접두사 또는 접미사를 추가하여 이름 충돌을 줄입니다.

C99에서는 static다른 용도로 사용되었습니다. 예 int Y(int a[static 10]);를 들어 10 개 이상의 정수 Y배열을 취하는 함수가 있음을 의미합니다 .

길이 74 스 니펫

void f(register int*p,register int*q,register int l){while(l--)*p++=*q++;}

또는 멋지게 배치하십시오 :

void f(register int *p, register int *q, register int l)
{
    while (l--)
        *p++ = *q++;
}

키워드 register는 하드웨어 레지스터를 사용하는 것이 여기에서 유리할 것이라는 힌트를 컴파일러에 제공합니다. 위 함수는 가능한 경우 하드웨어 레지스터를 사용하여 l에서 q로 정수를 복사 p합니다.

때로는 속도가 크게 향상 될 수 있습니다. 예를 들어, 68K 마이크로 프로세서 제품군에서 라인을 사용하지 않으면 *p++ = *q++단일 명령 MOVE.W (Ap)+,(Aq)+대 6 또는 8 로 변환 될 수 있습니다 register. 그가 사용하여 코드를 맞출 것, 플랫폼을 알고있는 경우 68K의 마이크로 프로세서는, 명시 적 사후 증가 및 사전 감소 모드, 그래서 잘 아는 개발자를했다 x++--y++xy--.

요즘 컴파일러는 register주소를 가져 가지 못하게하는 것 외에는 대부분 무시 합니다 (예 : 위의 &l경우 컴파일러 오류가 발생합니다).

길이 88 스 니펫

#include<stdio.h>
int f(int x){return(x>1)?x*f(x-1):1;}int main(){printf("%d\n",f(12));}

또는 더 깔끔한 레이아웃으로 :

#include <stdio.h>

int f(int x)
{
    return (x > 1)? x * f(x - 1): 1;
}

int main()
{
    printf("%d\n", f(12));
}

아, 재귀! 스 니펫은 컴파일, 링크 및 실행을위한 완벽한 프로그램입니다. 이 함수 는 재귀 공식 f (x) = x * f (x-1)을 사용하여 f인수의 계승을 계산합니다 x. 계승은 실제로 빠르게 커지므로 예를 들어 f(12)부호있는 32 비트 정수로 얻을 수있는 가장 큰 값입니다.

실제 재귀 코드 의 예를 보려면 Ackermann 함수 의 순진한 구현을 살펴보십시오 .

스마트 컴파일러는 힌트를 사용하여 함수를 최적화하고 inline상수가 인수로 제공 될 때 함수를 "언롤"하여 다음을 수행 할 수 있습니다.

f(12)

된다 :

12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

함수 호출없이!

다른 컴파일러는 함수를 재구성 할 수 있습니다.

int f(int x)
{
    return (x < 2)? 1: f(x - 1);
}

꼬리 재귀라는 것을 구현하십시오. 이것은 사실상 간단한 goto에 대한 마지막 함수 호출을 대체하고 해당 함수가 리턴을 처리하게합니다. 이점은 스택 스 래싱이 적고 빠르고 작은 코드입니다.

어셈블리 언어에서 이러한 종류의 최적화 기회는 실제로 쉽게 발견 할 수 있으며 기본적으로 작은 패턴을 찾고이를 더 빠르고 작은 것으로 대체하는 "키홀 최적화 기"로 구현할 수 있습니다.

길이 117 스 니펫

#include<stdio.h>
int main(int c,char**v){int a,b;sscanf(v[1],"%d%*[\t ,]%d",&a,&b);printf("%d\t%d\n",a,b);return 0;}

또는:

#include <stdio.h>

int main(int c, char **v)
{
    int a, b;

    sscanf(v[1], "%d%*[\t ,]%d", &a, &b);
    printf("%d\t%d\n", a, b);

    return 0;
}

당시 현대 언어에서 빌린 C, 콘솔, 펀치 카드, 테이프, 디스크 또는 프린터 등 모든 장치에 일관되게 적용 할 수있는 범용 I / O의 개념이지만 진정한 C 형식으로 개발자가 만들 수있었습니다. 매우 간결하지만 강력한 진술.

위의 스 니펫에서는 명령 행 입력을 사용하여 공백, 탭 또는 쉼표로 구분 된 두 정수를 구문 분석하여 출력합니다. 모든 탭, 공백 및 쉼표를 꺼내고 무시 하는 새로운 scanf지정자 %*[\t ,]를 활용 합니다.[\t ,]*

나는 개발자가 "순수한"C ++ 방식에 최선을 다하고 된 곳 일부 C ++ 코드를 수정 기억 <<과 같은 방법의 무기고 findsubstr. 적어도 12 줄이었고 여전히 쉼표를 구분 기호로 처리 할 수 ​​없었습니다. sscanf위와 같이 모든 까다로운 코드를 한 줄로 바꿨습니다 !

길이 132 스 니펫

#include<stdio.h>
int main(int c,char**v){while(--c){++v;printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n",*v,*v,*v,*v,*v);}return 0;}

또는:

#include <stdio.h>

int main(int c, char **v)
{
    while (--c)
    {
        ++v;
        printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n", *v, *v, *v, *v, *v);
    }

    return 0;
}

함수는 printf, sprintf, fprintf등을 사용하는 형식 지정은 출력의 폭과 패딩을 정의한다.

다양한 출력을 보려면 명령 줄 인수를 사용하여 위를 컴파일하고 실행하십시오.

> main xyz 123456
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                              
|xyz  |                                                                                                                                              
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                 
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|12345|                                                                                                                                              
|12345| 

메모 .5한계를에서로 지정자에 대한 출력 가장 선도적는 동안, 다섯 개 문자를 5출력에서입니다 보장 이상 으로, 5 자 -정렬을 왼쪽으로 나타내는. 그것들을 결합하면 출력이 정확히 5 자로 설정됩니다.


4
각 공보에 대해 새로운 사실을 추가해야한다고 생각하지 않습니다. :)
Optimizer

28
C의 일반적인 문화는 컴파일 경고를 무시하는 것입니다 . 나는 이것이 진실 근처에 있다고 생각하지 않습니다!
Shahbaz

4
큰 프로젝트가 있고 여러 컴파일러를 고려한다면 모든 경고를 제거하는 것은 무의미 할 수 있습니다.
feersum

5
이것은 훌륭합니다
Kik

4
저는 C 프로그래머이고 Haskell을 두려워하지 않습니다.
Shahbaz

138

x86 기계 코드

사실 :

x86 머신 코드는 프로세서가 실제로 실행되는 x86 어셈블리의 조립 된 버전입니다. 메모리와 스토리지 공간이 비쌀 때 다시 개발되었으며 인텔 8008과 완전히 역 호환되도록 설계되었습니다. 실행 코드를 작게 유지하는 것이 목표 중 하나이며 가변 길이 명령어와 CISC 아키텍처 를 사용하여 도움을줍니다. 이것을 달성하십시오 (이것은 현대 프로세서의 성능을 향상시키기 위해 더 복잡하게 만드는 단점이 있습니다). 이것은 일반적으로 어셈블리 및 머신 코드의 기본 특성과 함께 x86 프로그램에 매우 컴팩트 한 기능을 제공합니다.

길이 1 :

이제 첫 번째 프로그램 :

0xC3

16 진 편집기를 열고 해당 바이트를 입력 한 후 test.com으로 저장하십시오.

0xC3이 명령어 'RET'이므로 아무 것도하지 않고 즉시 리턴하는 유효한 MS-DOS 프로그램이 있습니다. 그러나 이것은 x86을 이용한 골프의 또 다른 흥미로운 측면 인 .com 파일 형식을 보여줍니다. 이 실행 파일 형식에는 헤더가 전혀 없습니다. 파일은 주소 0x100에서 시작하여 단순히 메모리에로드 된 다음 0x100에서 시작됩니다. 이것은 메타 데이터에 낭비되는 바이트가 없음을 의미합니다!

길이 2 :

다음 프로그램 :

0x4D 0x5A

또는 ASCII에서 'MZ'.

좋아, 나는 약간의 바람을 피웠다. 그것은 실제로 유용한 프로그램이 아니다. 왜냐하면 그것은 지침에 해당하기 때문이다.

DEC     BP
POP     DX

실제로 .com 프로그램을 시작하는 데 유용하지 않습니다. 사실, 그것은 그 두 값의 요점입니다. 합리적인 .com 파일은 그 값으로 시작해서는 안됩니다! .com 파일의 크기는 65280 바이트 (64KiB-0x100)로 제한되었으므로 더 큰 프로그램이 필요하기 시작하면 새로운 형식을 개발해야했습니다. 이것은 헤더가있는 .exe 파일 형식입니다. 그러나 MS-DOS는 이전 버전과의 호환성을 위해 특정 구성 요소에 .com 확장명을 유지해야했기 때문에 .com 파일이 실제로 .exe인지 여부를 감지 할 수있는 방법이 필요했습니다. 그들은 마법의 숫자로 찌르기 'MZ'를 선택했으며, 오늘날까지 16 진수 편집기에서 Windows .exe (또는 .dll) 파일을 열면 두 바이트로 시작하는 것을 볼 수 있습니다. 가장 현대적인 Windows 프로그램조차도 70 년대의 호환성 제약으로 시작한다는 사실이 놀랍습니다.

길이 3 :

이제 무한 루프의 경우 :

41 E2 FD

어느 것이

start:
inc cx
loop start 

이 프로그램은 CX의 값을 증가시키고 (시작에서> 0) 루프 명령을 실행합니다. 루프는 3 개의 간단한 연산을 하나의 특수 목적 연산으로 결합하기 때문에 CISC 명령어의 훌륭한 예입니다. CX의 값을 낮추고 0인지 확인하고 그렇지 않은 경우 대상 레이블로 점프합니다. CX가 0 일 때 끝나는 것 외에도 다른 플래그를 검사하는 루프 형식도 있습니다. 2 바이트 무한 루프에 대해 '점프 시작'을 수행 할 수 있었지만 더 흥미로 웠습니다.

길이 4 :

최소한의 유용한 프로그램 :

40 CD 10 C3

어셈블리로 번역 :

inc ax    ; 1 byte
int 10h   ; 2 bytes
ret       ; 1 byte

이 프로그램은 콘솔을 40x25 자로 설정하고 화면을 지우고 명령 행으로 돌아갑니다. AX를 원하는 비디오 모드로 설정 한 다음 (1) BIOS 인터럽트 10h를 호출하여 실제로 비디오 모드를 설정하고 창을 지우고 돌아옵니다. 앞으로 이러한 BIOS 인터럽트가 더 많이 나타날 것으로 예상됩니다.

길이 5 :

이제 일시 정지 프로그램을 구현할 수 있습니다 :

B4 01 CD 21 C3

어셈블리로 번역 :

mov ah,1  ; 2 bytes
int 21h   ; 2 bytes
ret       ; 1 byte

이 프로그램은 BIOS가 키를 누를 때까지 기다렸다가 돌아 가기 전에 화면에 에코합니다. 또한 x86에서 일부 레지스터를 부분적으로 읽거나 쓸 수있는 방법을 보여줍니다. 이 경우 AX (AH)의 최상위 바이트를 1로 설정했습니다. 32 비트 프로세서에서 상위 16 비트에 영향을주지 않고 하위 16 비트에서 작업 할 수도 있습니다. 부분 레지스터를 수정하는이 기능은 어셈블리 프로그래머에게는 유용 할 수 있지만 최신 프로세서 는 잘못된 데이터 종속성을 유발할 수 있으므로 비 순차적 실행을 시도하는 단점이 있습니다.

길이 9 :

이제 실제로 출력을 표시하려면 다음을 수행하십시오.

68 00 B7 07 AB 40 79 FC C3

어셈블리로 번역 :

; These two instructions set up ES, the 'extra segment'
push 0xb700 ; 3 bytes
pop  es     ; 1 byte
label:
stosw       ; 1 byte, Store Word - Copy AX to [ES:DI] then add 2 to DI
inc  ax     ; 1 byte
jns  label  ; 2 bytes, Jump Not Signed - Jump unless the sign flag is set (when inc AX yields 0x8000
ret         ; 1 byte

출력은 다른 색상으로 반복되는 기본 문자 세트입니다. AX의 낮은 바이트는 문자 코드이며 높은 바이트는 사용할 색상을 지정합니다. 다른 색상으로 반복되는 기본 문자 세트

16 비트 프로그램은 최대 64KiB 만 직접 처리 할 수 ​​있습니다. 이 문제를 해결하기 위해 x86은 16을 곱하고 모든 메모리 액세스에 추가되어 20 비트의 주소 지정 가능한 메모리를 제공하는 특수 레지스터 인 '세그먼트'를 사용했습니다. 프로그램은 더 많은 메모리 또는 특수 메모리 영역에 액세스하기 위해 이러한 세그먼트 레지스터의 값을 변경할 수 있습니다.이 프로그램은 비디오 메모리에 쓰기 위해 추가 세그먼트를 수정합니다. 서로 다른 유형의 메모리 액세스는 서로 다른 세그먼트 레지스터를 사용하여 코드, 데이터 및 스택을 서로 다른 메모리 청크에서 동시에 액세스 할 수 있습니다. 많은 명령으로 기본 세그먼트를 재정의 할 수도 있습니다.

길이 20 :

인식 할 수있는 것을 만들어 봅시다. 'Rule 90'을 사용하여 Sierpinski 삼각형을 그립니다.

B0 13 CD 10 68 0F A0 1F AC 31 C2 88 94 3E 01 87 D3 93 EB F4

조립시 :

mov al,13h      ; 2b
int 10h         ; 2b - Set the video mode to 13h

push    0xA00F  ; 3b
pop     ds      ; 1b - Set the data segment to video memory

start:          ; This loop runs 'Rule 90' to draw Sierpinski triangles
lodsb           ; 1b - load al with [ds:si] then increment si

xor     dx,ax   ; 2b - xor the left and right values of the previous row of pixels
mov     [si+318],dl ;4b - store result to memory

xchg    dx,bx   ; 2b - swap register values
xchg    ax,bx   ; 1b - swapping with ax is 1 byte shorter

jmp     start   ; 2b - infinite loop

샘플 출력 : 시 에르 핀 스키 삼각형

이 프로그램에서는 320x200 해상도의 256 색 그래픽 모드 인 다소 유명한 '모드 13'을 사용합니다. Doom과 같은 많은 인기있는 DOS 게임 에서 사용되었습니다 .

길이 21

누가 우리가 실행중인 CPU를 제조했는지 봅시다.

0F A2 66 60 BB EE FF B9 0C 00 8A 17 43 B4 02 CD 21 E2 F7 FF E1

어셈블리로 번역 :

cpuid         ; 2b  CPU ID - retrieve processor information based on the value in AX. For AX=0,
              ;     the 12 bytes in EBX, ECX, and EDX are loaded with a vendor identification string
pushad        ; 2b  Push all registers on the stack (32 bit version)
mov  bx,0xffee; 3b  Start of the vendor identification string on the stack
mov  cx,12    ; 3b  12 characters to print
print:    
mov  dl,[bx]  ; 2b  Character to print
inc  bx       ; 1b  Advance string position
mov  ah,2     ; 2b  Set AH to the 'Print character to STDOUT' value
int  21h      ; 2b  Call the bios interrupt to print
loop print    ; 2b  Decrement CX and jump if it is not zero
jmp  cx       ; 2b  Instead of restoring the stack, just jump right to the exit point

샘플 출력 :

c:\misc>cpuid.com
GenuineIntel

이 프로그램은 CPUID 명령을 사용하여 실행중인 프로세서, 특히 공급 업체 식별 문자열에 대한 정보를 얻습니다. CPU 제조업체가 다르거 나 특정 가상 머신에서 실행되지 않는 한 대부분의 사람들은 'GenuineIntel'또는 'AuthenticAMD'를 보게됩니다.

길이 26

이제 재미있는 애니메이션을 할 수 있습니다

B0 13 CD 10 C4 07 BB 40 01 59 99 89 F8 F7 F3 31 D0 AA E2 F6 26 FE 05 47 EB FA

조립 중

mov al,13h     ;2b
int 10h        ;2b Enter Video Mode 13h

les ax,[bx]    ;2b Set ES to (roughtly) video memory
mov     bx,320 ;3b Set up  BX asdivisor
pop     cx     ;1b Zeroize CX

start:
cwd            ;1b Sign extend AX to DX, AX will never have the sign bit set so this zeroizes DX in 1 byte
mov     ax,di  ;2b Copy video memory pointer
div     bx     ;2b Divide by width to get AX = Y pos, DX = X pos
xor     ax,dx  ;2b X pos ^ Y pos
stosb          ;1b Store and increment video pointer
loop    start  ;2b CX starts at 0, so this will loop until it wraps around

cycle:
inc     byte [es:di];3b Increment value in video memory to animate
inc     di     ;1b Increment video memory pointer
jmp     cycle  ;2b Infinite loop 

출력은 다음과 같습니다.

마칭 XOR

X pos ^ Y pos 함수는 특히 애니메이션 일 때 흥미로운 프랙탈을 생성합니다.

길이 27

작은 x86 .com 프로그램에서 텍스트와 그래픽을 생성 할 수있을뿐만 아니라 사운드와 음악을 생성 할 수도 있습니다.

BA 31 03 B0 3F EE BA 30 03 B0 93 EE B4 01 CD 21 3C 1B EE 3C 1B B0 7F EE 75 EC C3

조립시 :

    mov dx,0x331            ; value for the midi control port
    mov al,0x3F             ; command value to set midi mode to UART
    out dx,al               ; output the command to the midi control port
play_loop:
    mov dx,0x330            ; value for the midi data port
    mov al,0x93             ; midi instrument value (piano)
    out dx,al               ; output to midi data port
    mov ah,1
    int 0x21                ; read character from stdin, with echo
    cmp al,27               ; test if it is escape
    out dx,al               ; output the ascii value as the midi note to play
    mov al,0x7F             ; note duration
    out dx,al               ; output note duration
    jne play_loop           ; loop if escape was not pressed
    ret  

이 프로그램은 미디 카드를 사용하여 키보드를 피아노로 바꿉니다. 이를 위해 미디 카드는 UART 모드로 설정되어 미디 노트를 수신하자마자 재생합니다. 다음으로, 프로그램은 문자가 눌러 질 때까지 대기하고 ASCII 값을 미디 카드에 메모로 출력합니다. 이스케이프를 누를 때까지 프로그램이 실행됩니다.

길이 29

반복 된 함수 시스템 을 사용하여 Dragon Curve 프랙탈을 생성 해 봅시다 :

B0 13 CD 10 89 D0 01 CA 29 C1 D1 FA D1 F9 73 03 83 E9 7A B4 01 CD 16 B8 02 0C 74 E6 C3

어셈블리로 번역 :

mov  al,13h
start:
int  0x10    ; This does double duty, setting the video mode to 13h at program start,
             ; and calling the 'draw pixel at coordinates' interrupt when looping
mov  ax,dx   ; The next couple instructions are our IFS, the algorithm is aproximately
add  dx,cx   ; f(y) = 0.5x + 0.5y
sub  cx,ax   ; f(x) = 0.5x - 0.5y OR f(x) = 0.5x - 0.5y - 1
sar  dx,1    ;
sar  cx,1    ;
jnc  skip    ; This jump handles pseudo-randomly switching between the two functions for x,
             ; based on if the previous value of x was odd or not.
sub  cx,122  ; Magic number, chosen since it provides sufficent 'randomness' for a filled in
             ; fractal and a good scale to the fractal. 102 and 130 also work.
skip:
mov  ah,1
int  0x16    ; Get keyboard state, zero flag will be set if no key has been pressed
mov  ax,0xC02; Set up AH for the draw pixel function when int 0x10 is executed,
             ; AL = color, CX = column, DX = row
jz   start   ; Loop if a key hasn't been pressed
ret  

산출:

드래곤 커브

비 제어 키를 누르면 프로그램이 종료됩니다. 이것은 Pouet.net의 Desire 의 Fire Coral 을 기반으로합니다 .

길이 52

이 프로그램은 약간의 이중 기능으로, 약간의 x87 부동 소수점 보조 프로세서 및 자체 수정 코드를 보여줍니다.

B3 07 D9 E8 B1 11 DE 0E 32 01 E2 FA BE 0A 24 56 B1 09 DF 34 AC D4 10 
86 E0 05 30 30 50 E2 F5 44 B4 2E 50 89 E2 B4 09 CD 21 FE 06 03 01 4B
75 D2 CD 20 0A 00

프로그램이 실행되면 몇 가지 수학 상수가 출력됩니다.

1.00000000000000000
3.32192809488736235
1.44269504088896341
3.14159265358979324
0.30102999566398120
0.69314718055994531
0.00000000000000000

이들은 1, Log2 (10), Log2 (e), Pi, Log10 (2), Log e (2) 및 Zero입니다.

조립시 :

조직 100 시간

mov     bl,7         ;Counter for the total number of constants to print
start:
fld1                 ;Floating point constant to load on the FP stack,
                     ;start with 1 since it's op-code is the lowest

mov     cl,17        ;Multiply the constant by 10, 17 times to get the
mult:                ;printing part as an integer
fimul   word[ten]
loop    mult

mov     si,10+'$'*256;ASCII new line (10) and the end-of-string ($)
                     ;characters. These are used both as
push    si           ;a constant memory location, and stored to the
                     ;stack to format and printing

mov     cl,9         ;print 18 digits (9 pairs)
fbstp   [si]         ;store the integer part of the floating point
                     ;number on top of the FP stack as a packed
                     ;binary-coded decimal number (1 digit/nibble),
                     ;and then pop the number off the FP stack

convert:
lodsb                ;load a pair of packed digits

db 0xd4,16 ; AAM 16  ;ASCII Adjust For Multiply instruction using
                     ;non-standard base 16. This puts AL/16 in AH,
                     ;and AL%16 in AL, unpacking the digit pair.

xchg    ah,al        ;Swap the digit order
add     ax,'00'      ;Convert the digits to ASCII values
push    ax           ;Store digits on the stack
loop    convert

inc     sp           ;AX now holds the 1st 2 digits to print,
mov     ah,'.'       ;so to insert a decimal point, the 2nd digit
push    ax           ;is replaced with a '.', the stack pointer
                     ;is adjusted to overwrite 1 byte, and then
                     ;AX is pushed on the stack

mov     dx,sp        ;Load DX with the start of the print string
mov     ah,9         ;Load AH with the 'Print String' constant
int     21h          ;Call the 'Print String' interrupt to display
                     ;the constant

inc     byte[start+1];Self-modifying code - increment the load
                     ;floating point constant op-code to iterate
                     ;through all of them

dec     bx
jnz     start        ;Exit when all 7 constants have been printed
int     20h


ten: dw  10

x86 시스템의 부동 소수점 연산은 원래 옵션 인 x87 코 프로세서로 처리되었으며 486 년까지 동일한 칩으로 옮겨졌습니다. 또한 x87은 8 개의 80 비트 레지스터를 사용할 수있는 스택 기반 아키텍처와는 다소 다른 아키텍처를 가졌습니다. 또한 다양한 반올림 모드, 정밀도 및 마스크 가능한 예외를 설정할 수있었습니다.

이 프로그램은 프로세서에 구운 7 개의 상수 값을 인쇄합니다. 명령어 공간이 0 및 1과 같은 간단한 상수에서 낭비되는 것은 이상하게 보일 수 있지만, 명령어 세트는 메모리가 작을 때 만들어졌으며 이러한 명령어는 일반적으로 동등한 연산보다 2 바이트 작습니다. 이 프로그램은 또한 모호한 명령 인 FBSTP- 'Store BCD Integer and Pop'을 사용합니다. x86이 개발되었을 때 BCD 번호 에 대한 작업 이 더 일반적이었으며 x86 / x87에는 프로그램에서 사용되는 AAM 'ASCII Adjust for Multiple'명령과 같이 BCD 수학을 단순화하기위한 몇 가지 명령이 있습니다.

초기 x86 프로그램에서 사용하는 비보호 메모리 모델에서는 데이터와 코드가 구분되지 않습니다. 이 때문에 적절한 값을 증분하면 순차적으로 인코딩 된 '부하 상수'명령어를 쉽게 반복 할 수 있습니다.

길이 64

만델 브로트 챌린지 항목을 교차 게시 하면 320x200 컬러의 만델 브로트 프랙탈이 64 바이트로 표시되는 프로그램을 작성할 수 있습니다.

B0 13 CD 10 C4 07 99 89 F8 B9 40 01 F7 F1 83 E8 64 FE CE 31 DB 31 F6 
89 F5 0F AF F3 01 F6 0F AF DB 70 19 0F AF ED 70 14 01 EB 70 10 29 EB
29 EB C1 FB 06 01 D3 C1 FE 06 01 C6 E2 DB 91 AA EB C6

조립시 :

mov al,13h ; set up graphics mode 13
int 10h

les ax,[bx]; trick to set video memory

FillLoop:
cwd
mov ax,di  ; di is the current position on screen
mov cx,320 ; convert di int x,y screen coordinates
div cx     ; CX is the iteration counter, exit the loop if it hits
           ; zero before the value escapes.
sub ax,100 ; center the fractal vertically
dec dh     ; center the fractal horizontally

xor bx,bx
xor si,si

MandelLoop: ; Fairly standard Mandelbrot routine,
mov bp,si   ; exits if the values overflow
imul si,bx
add si,si
imul bx,bx
jo MandelBreak
imul bp,bp
jo MandelBreak
add bx,bp
jo MandelBreak
sub bx,bp
sub bx,bp

sar bx,6   ; We use fixed point math with the lowest 6
add bx,dx  ; bits being the fractional portion, so this
sar si,6   ; rescales the values after multiplication
add si,ax

loop MandelLoop

MandelBreak:
xchg ax,cx ; Write the escape itteraction as the color
stosb
jmp FillLoop

최종 결과는 다음 이미지입니다.

만델 브로트 프랙탈

이 프로그램은 고정 소수점 연산을 사용하여 더 적은 바이트를 사용하므로 프랙탈을 생성합니다. 16 비트 레지스터의 최하위 6 비트는 숫자의 소수 부분으로 간주되며 곱한 후에 값이 다시 스케일됩니다.


7
PPCG에서 볼 수있는 모든 언어 중에서 나는 이것을 기대하지 않았습니다.
Alex A.

23
와. 이 글을 주석으로 만드는 다른 문자들도 있습니다. 그러나 진지하게. 와.
krs013

2
@Michael Edenfield 이것이 바로 DOSBox입니다!
Sir_Lagsalot

1
20 바이트 Sierpinski는 매우 인상적입니다.
qwr

1
나는 나 자신을 훌륭한 프로그래머라고 생각하지만, 이것을 볼 때 나는 패배를 인정해야한다.
Stephan Bijzitter

121

하스켈

아래에서 위로 읽을 수도 있습니다. 때때로 나는 낮은 스 니펫을 다시 참조하지만 결코 높은 스 니펫을 참조하지 않으므로 이해하는 데 도움이 될 수 있습니다.

Haskell을 모르는 독자 : 분명합니까? 언제 명확하지 않습니까? 말할 수 없습니다.

길이 86 스 니펫

트리 데이터 구조를위한 접이식 인스턴스 (스 니펫 23). Foldable은 유형의 클래스 (/ group)와 같이 유형 클래스입니다. 이것들은 Java 인터페이스와 유사합니다. 그들은 본질적으로 유형을 일반화하여 공통된 특성을 갖는 유형을 통합합니다. 예를 들어, 함께 추가 ( Monoid), 컨테이너 ( Functor), 텍스트 ( 기능 Show에서 이미 만난 텍스트) 등으로 인쇄 할 수 있습니다 show. 이것은 목록과 같은 데이터 유형을 통합하여 목록을 반복하거나 목록으로 병합 할 수 있습니다.

이 코드 조각에서는 foldr기본적으로 데이터 유형을 오른쪽에서 왼쪽으로 반복 하는을 정의하여 인스턴스를 정의 합니다. 이제 미리 작성된 일반적인 코드를 사용할 수 있습니다. 먼저, 모든 혼란을 피하기 위해 단일 트리를 얻는 도우미 함수를 정의합니다 s a = N E a E. 지금:

sum (N (s 3) 7 (N E 5 (s 8))     === 23
product (N (s 3) 7 (N E 5 (s 8)) === 840
toList (N (s 3) 7 (N E 5 (s 8))  === [3,7,5,8]

등등.

여기 나무 사진이 있습니다 :

7
| \
3  5
    \
     8

길이 70 스 니펫

primes=sieve[2..] where
 sieve(p:xs)=p:sieve(filter(\x->x`mod`p/=0)xs)

이것은 최고의 체입니다!

(참고 : 다른 언어로 /=무엇입니까 !=)

이것은 sieve목록을 필터링하고 이전 소수로 나눌 수없는 숫자 만 유지 하는 함수 를 정의하여 작동 합니다. 그것은 재귀 적 sieve으로 정의됩니다 - 리스트를 첫 번째 요소 p와 테일 로 나누고, 테일에서 나눌 수있는 숫자를 나머지 에서 필터링하고 p, sieve나머지 비트 p를 시작하고, 그 시작 부분에 연결 하고, 리턴하도록 정의됩니다.

다시 한 번, 우리는 여기서 무한 목록을 사용하고 있습니다. 그러나 무한한 양의 소수를 계산할 필요가 없다면 계산이 중단됩니다.

take 4 primes === [2,3,5,7]

길이 68 스 니펫

마침내, ine!

main=do putStr s;print s where s="main=do putStr s;print s where s="

처음이이 글을 읽고, 당신은이 quine의 출력은 인용 부호 누락 될 것이라고 생각하고, 왜 한 번 작성합니다 putStr한 번 print? 같은 소리입니다.

Haskell에서는 putStrstdout에 도착하는 문자열의 내용을 인쇄하는 함수입니다. print그러나 stdout에 인쇄합니다. 따라서와 print 4동일 putStr "4\n"하지만 putStr 4무의미합니다- 4문자열이 아닙니다! 따라서 print값을 얻으면 먼저 값을 문자열로 변환 한 다음 해당 문자열을 인쇄합니다. 일반적으로 사물을 문자열로 변환하는 방법은 코드로 작성하는 방법을 찾는 것입니다. 그래서, 그런데 당신은 문자열을 작성합니다 abc하스켈 코드의 문자열에서 "abc", 그래서 print "abc"실제로 인쇄를 "abc"하지 abc.

운이 좋으면 지금 충분한 투표권을 얻었습니다. 골프를 할 필요가 없습니다.

길이 33 스 니펫 :

main=go 0
go n=do print n;go(n+1)

주목해야 할 것은 루프를 사용하지 않았다는 것입니다. 하스켈은 반복하지 않습니다. 하스켈이 재발합니다. 하스켈에는 루프가 없습니다. 그것은 그보다 더 깊은입니다 : 하스켈도 제어 흐름이 없습니다 . 어떻게 물어봐도 될까요? 글쎄, 그것은 필요하지 않습니다.

세부 사항으로. 이 프로그램은 0부터 시작하는 정수의 무한 증가 시퀀스를 출력 go한 다음,이를 입력으로 시작 인쇄 main그것을 호출 0.

do하스켈의 특별한 구문 능력입니다. 이 시나리오에서는 I / O 작업과 마찬가지로 I / O 작업 만 결합합니다 >>(스 니펫 22 참조).

길이 26 스 니펫 :

map f=foldr(\x y->f x:y)[]

이것은 map아마도 모든 사람에게 친숙한 기능을 정의합니다 foldr. 우리는 선언하지 않았지만 것을 알 map의 종류, 컴퓨터가 어떻게 든 자사의 유형을 알고 (a -> b) -> [a] -> [b], 예에서 함수 주어진 ab, 그리고 목록 a들의 목록 반환 b들.

어떻게 알았어 ?? ;-)

길이 25 스 니펫 :

main=putStr"Hello World"

표준 Hello World. 유형을 참고 : main의 유형이 IO ()putStr유형이있다 String -> IO ()(아무것도 돌려주지 않는 I / O 작업에 문자열에서 기능).

길이 23 스 니펫 :

data T a=E|N(T a)a(T a)

이것은 트리의 표준 정의입니다. Java, C 또는 기타로 트리를 정의하는 데 필요한 모든 행보다 훨씬 쉽습니다.

(스 니펫 10 참조)

그것을 분해하자 :

data-이 선언은 데이터 유형을 선언합니다. T a-유형의 요소를 포함하는 트리 a. 이것이 우리가 정의하는 유형입니다. =-의 모든 값은 T a파이프로 구분 된 다음 중 하나 |입니다. E-가능한 값 중 하나 T s-빈 나무. N (T a) a (T a)-트리의 다른 가능한 값-노드. 각 노드는 왼쪽 자식 ( (T a)), 요소 ( a) 및 오른쪽 자식 ( (T a))으로 구성됩니다.

길이 22 스 니펫 :

main=putStrLn"y">>main

하스켈 yes기능. >>두 개의 I / O 동작을 결합하고 시퀀싱하는 연산자입니다. 유형이입니다 >> :: IO a -> IO b -> IO b.

main는 먼저 인쇄 "y"한 후 main자체적으로 수행하는 I / O 작업으로 자체적으로 재귀 적으로 정의됩니다 .

길이 18 스 니펫 :

fix f=r where r=f r

에 대한 더 나은 정의 fix. 첫 번째 정의의 문제는, (단편 14 참조) fix f = f(fix f), 우리가 호출 할 때마다 그 fix f fix리콜 fix f리콜, fix f동일한 연산 무단 복사를 생성한다. 이 버전 r은 결과를 정의 하여 결과를 수정합니다 . 따라서 f r = r. 을 정의 해 봅시다 r = f r. 이제 우리는 돌아온다 r.

길이 17 스 니펫 :

f n=product[1..n]

이것은 계승을 정의하는 기능적인 방법입니다.

길이 16 스 니펫 :

f n=(\x->x+x+x)n

(\x -> x + x + x)람다입니다 (누군가 \는 글자와 비슷 하다고 생각 합니다).

(\x -> x + x + x) n에 적용되는 람다입니다 n( 이것은와 정확히 동일합니다 n + n + n).

f3의 곱하기 함수입니다 ( f = (*3))

길이 15 스 니펫 :

sum=foldl (+) 0

sum접기를 사용 하여 함수를 정의합니다 . 접기는 기본적으로 하나의 누산기가있는 목록 요소를 반복합니다.
foldl인수 fx누적 기 및 목록의 일부 함수 및 일부 초기 값 을 인수 로 사용합니다 xs. 이 함수 f는 이전 누산기 값과 목록의 현재 값을 입력으로 가져와야하며 다음 누산기를 반환합니다.
그런 다음 접기는 목록 값을 반복 f하여 이전 누산기를 적용한 다음 마지막 누산기를 반환합니다.

폴드를 생각하는 또 다른 방법 f은리스트 값 사이에 폴드 '삽입' 과 측면 중 하나에 초기 어큐뮬레이터가있는 것과 같습니다. 예를 들어로 foldl (*) 1 [4,2,5]평가됩니다 1 * 4 * 2 * 5.

길이 14 스 니펫 :

fix f=f(fix f)

y콤비. 일반적으로 fix방정식의 고정 점을 찾기 때문에 이름이 지정 f x = x됩니다. x = infinite loop때로는 해 가 될 수도 있으므로 fix (\x -> x^2 + 5*x + 7)방정식을 풀지 x^2 + 4*x + 7 = 0않고 대신 무한 루프를 반환합니다.

x = infinite loopHaskell의 게으름 때문에 항상 해결책은 아닙니다 .

이 버전은 시간과 공간 누출입니다. 더 긴 스 니펫으로 재정의하겠습니다.

길이 13 스 니펫 :

f=sum.map(^2)

리스트에 주어진 제곱의 합을 반환 하는 함수 f 를 정의합니다 . 그것은 인 함수 의 조성물 함수 sum함수map(^2) 차례로이고, 함수 map 에인가 기능 (^2) 합니다 ( 제곱 함수 차례로의 섹션) 함수 ^ 단편 3에서 (부분이 조각 (2)에 도입하고, 조성물 ).

보시다시피, 기능 은 Haskell과 같은 기능적 언어 에서 매우 중요 합니다. 사실, 하스켈 가장 표준 라이브러리와 언어임을 상기 한 기능을 얻는 기능을 입력 또는 복귀 등 의 기능 이 일반적으로 알려져있다 (출력 등을 고차 함수 .

그런데 기술적으로 모든 2 개 이상의 인수 함수함수 를 출력으로 반환하는 함수입니다 (카레 링이라고 함).

길이 10 스 니펫 :

data B=T|F

이것은 다른 이름을 가진 Haskell 부울의 정의입니다. 부울 유형의 이름은 B입니다.
이 정의는 true ( T) 및 false ( F) 라는 두 가지 생성자를 소개 합니다.
이 코드 스 니펫은 기본적으로 컴파일러에 모든 부울 ( B)이 true ( T) 또는 false ( F) 또는 다른 말로 임을 알려줍니다 B=T|F.

실제로 모든 데이터 유형은 Haskell에서 정의 할 수 있습니다. 다른 언어에서는 숫자, 참조 및 배열 데이터 유형이 컴파일러의 특별한 지원이 필요한 경우. 실제로 Haskell에는 특별한 불편이 있기 때문에 특별한 지원이 있지만, 예를 들어 Bool데이터 유형은 전적으로 언어로 정의됩니다.

길이 9 스 니펫 :

main=main

이 무의미한 프로그램은 main메인으로 정의 됩니다. Haskell은 게으 르기 때문에 실제 값을 사용하지 않으면 무한 루프가 필요한 값을 자유롭게 사용할 수 있습니다. 우리처럼 무한 루프를 포함하는 이러한 값을 main"하단"이라고합니다.

재미있는 사실은 GHC Haskell 컴파일러가 이러한 종류의 무한 루프를 감지하고 실행될 때 캐치 가능한 (!) 예외를 발생시킬 수 있다는 것입니다.

길이 8 스 니펫 :

f(x:_)=x

이것은 f비어 있지 않은리스트가 주어지면 헤드를 돌려주는 함수 를 정의합니다 .

Haskell의 패턴은 파이썬의 시퀀스 풀기와 비슷하지만 모든 유형에 대해 일반화됩니다. 패턴은 값을 거부하거나 일치시킬 수 있으며, 일치하는 경우 변수를 값에 바인딩 할 수 있습니다.

이 스 니펫의 패턴은 다음과 같습니다.

  • _: 어떤 것과도 일치하고 변수를 바인딩하지 않는 패턴.
  • x: 무엇이든 바인딩하고 변수에 바인딩하는 패턴 x.
  • ::이 패턴은 자식 패턴, 즉 머리와 꼬리에 대한 패턴을 가져옵니다. 목록이 비어 있지 않으면 머리 및 꼬리와 일치합니다.

패턴 매칭은 고도로 일반화됩니다. 실제로, 새로운 데이터 유형을 정의하는 것만으로는 자동으로 작업 할 수있는 패턴이 도입됩니다.

길이 5 스 니펫 :

x=2:x

우와, 이것에 대해 설명 할 것이 너무 많습니다.

우선, Haskell은 게으르다. 즉, 하위 표현식은 꼭 필요한 경우에만 평가됩니다.

참고 : 이 코드 스 니펫에는 할당이 아니라 정의가 표시됩니다. 하스켈에게는 임무가 없습니다.

이 코드 스 니펫 x은 전체 목록으로 구성된 무한 목록으로 정의되었습니다 2. 일반적으로 다른 언어 x에서는 평가를하기 전에 평가해야 2:x하지만 Haskell에서는이를 수행 할 수 있습니다.

Haskell 무한리스트는 일종의 이터레이터와 일반 링크리스트의 혼합입니다. 둘 다처럼 작동합니다 (예를 들어 범위를 반복 할 때 일정한 메모리가 사용됨).

길이 4 스 니펫 :

2:[]

이 스 니펫은 싱글 톤리스트 만 인코딩합니다 [2]. Haskell :Cons 연산자입니다. 사실, 정규 목록 구문은 cons 연산자와 빈 목록 리터럴에 대한 구문 설탕입니다. 이는 Haskell이 패턴 일치 및 데이터 형식 (특히 생성자 개념)을 처리하는 방식과 밀접하게 연관되어 있습니다.

길이 3 스 니펫 :

f.g

Haskell에서 .함수 구성을 나타냅니다. Haskell은 "point-free"스타일로 작성할 수 있으며, 함수 인수의 이름을 지정하지 않고 .연산자를 사용하여 데이터 흐름을 조작 하는 것이 특징 입니다.

길이 2 스 니펫 :

1-

이 코드가 괄호로 묶인 경우 (구문상의 이유로) "섹션"이라고합니다. 그런 다음 숫자가 주어진 함수는 빈 자리를 "채우고"그 숫자를 뺀 값을 반환합니다. 이 개념은 때로는 Haskell과 같은 기능적 언어에서 유용합니다. 그렇지 않으면 람다가 필요합니다.

길이 1 스 니펫 :

1

하스켈에서, 1둘 모두가 될 수있다 Int, Float, Double, Word등. 실제로, 1모든 유형 의 버전을 정의하는 코드를 작성 하여 자유롭게 사용할 수 있습니다.
이것은 JavaScript, Python 등에서도 수행되지만, 이와는 달리 전체 유형 안전으로 수행됩니다.

사실 :

원래 Haskell위원회는 Haskell B. Curry의 이름을 따서 "Curry"라고 부르려고했지만 일부 말장난이 발생할 수 있으므로 이름을 Haskell로 변경하기로 결정했습니다. 나중에 야 그들은 "파스칼"과 "Hassle"과 Haskell의 유사성을 발견했습니다!


나는 사실을 Haskell이 표준 라이브러리에서 다른 함수에서 함수를 생성하는 표준 라이브러리에서 가장 많은 함수 / 연산자를 가지고 있다는 사실로 알지 못합니다 (기술적으로 두 개 이상의 매개 변수 함수는 모두 그런 것입니다). 내가해야합니까?
자부심을 가진 haskeller

스 니펫에 표시하고 설명에 추가하십시오.
Martin Ender

f=0:1:zipWith(+)f(tail f) -- 25 chars피보나치 수의 지연 계산 된 목록을 반환하는 함수입니다.
chamini2

내가 스 니펫을 추가 한 다음 내 컴퓨터가 종료되었습니다
자랑스런 Haskeller

@proudhaskeller 절약 op. 나는 이것을 개인적으로 한 적이 없지만, 한 번에 큰 편집 작업을 수행하는 경우 저장하면서 외부 문서에서 편집을 수행 한 다음 완료되면 붙여 넣을 수 있습니다.
mbomb007

99

씨#

C #은 Java, C, Haskell, SQL 및 기타 다양한 언어의 재미 있고 미친 기능이며, 정말 멋진 기능과 API를 많이 제공합니다. 또한 여기에서 꽤 장황한 것으로 알려져 있지만, 우리가 할 수있는 것을 볼 수 있습니다!

나는 일반적으로 필요한 상용구를 무시합니다.

class Program { public static void Main(string[] args) { ... } }

길이 1 :

;

명령은 C #에서 세미콜론으로 종료됩니다! 빈 줄은 완벽하게 유효한 구문입니다.

길이 5 :

x=5f;

C #에서 리터럴 숫자를 지정하면 컴파일러는 소수점이 있는지 여부에 따라 int 또는 double이라고 가정합니다. 리터럴 부동 소수점을 사용하려면 숫자에 'f'를 추가하여 지정해야합니다. 그렇지 않으면 약간의 비용이 발생하여 런타임에 캐스트됩니다.

길이 7 (바이트) :

s=@"
";

문자열 리터럴 앞에 @ 기호를 붙이면 "verbatim"문자열 리터럴이됩니다. 일반 문자열 리터럴은 '\ n'과 같은 이스케이프 시퀀스를 특수 문자로 구문 분석하지만 완전 리터럴은 그렇지 않으므로 백 슬래시 문자를 이스케이프하지 않고 사용할 수 있습니다. 표시된대로 라인 리턴을 포함 할 수도 있습니다. 골프에서 몇 바이트를 절약하거나 멀티 라인 문자열 리터럴을 더 읽기 쉽게 만들 수 있습니다. 문자열에 들여 쓰기가 포함되어 있는지주의하십시오.

길이 8 :

()=>x=y;

이 표현은 익명 함수입니다. Action전달 될 수 있고 함수처럼 호출 될 수있는 유형의 객체를 반환합니다 . 익명 함수는 선언 된 범위를 상속하고 해당 범위의 모든 로컬 변수를 원하는 곳으로 가져옵니다.

길이 9 :

(a)=>a.p;

다음은 매개 변수와 반환 값을 사용하는 또 다른 익명 함수입니다. 이 표현식은 유형의 객체를 반환합니다 Func(Func 자체는 유형을 반환합니다 a.p. FuncLinq와 인터페이스 하기 위해 많은 것을 사용할 것 입니다.

길이 10 :

enm.Any();

Linq에 대한 첫 번째 소개입니다! Linq는 열거 가능한 (IEnumerable 인터페이스 구현) 유사 Array및 모든 객체에서 호출 할 수있는 확장 메서드 집합입니다 List. IEnumerable은 게으른 평가를 사용합니다. 컬렉션 전체를 모른 채 한 번에 한 항목 씩 컬렉션을 거치며, 심지어 무한 할 수도 있습니다!

그건 어디 Any에서 오는 -이 반환 true열거 가능한 적어도 1 개 항목이 포함 된 경우. 전체 길이를 계산하는 것보다 훨씬 낫습니다.

길이 11 :

var a=1.5f;

var키워드가 자동으로 유형을 결정하도록 컴파일러에 지시합니다 a. a이 경우으로 입력됩니다 Single. 거의 모든 유형 이름보다 훨씬 짧기 때문에 코드 골프에 매우 편리하지만 많은 사람들이 프로덕션 코드에서 사용하는 것을 싫어합니다.

길이 15 :

yield return 0;

익숙하지 않은 미친 말이 있습니다. IEnumerable을 상속하여 객체를 열거 할 수 있다는 것을 알고 있지만 함수 를 열거 할 수 있다는 것을 알고 있습니까? 의 반환 형식이있는 함수를 선언 IEnumerable하고, 그것을 가지고 yield return당신이 원하는만큼 여러 번. 함수에 열거자를 가져 오면 호출 할 때마다 GetNext프로그램이 다음 코드까지 모든 코드를 실행하고 yield return해당 값을 반환 한 다음 다시 진행할 때까지 일시 중지합니다. yield break반복을 종료하는 데 사용 합니다.

길이 16 :

[Obsolete]int a;

이 스 니펫은 속성을 보여줍니다. 속성은 코드의 모든 선언에 붙일 수있는 일종의 태그입니다. 일부는 호출 할 때 사용되지 않는 경고를 발생시키는 것과 같은 특정 작업을 수행하도록 컴파일러에 지시합니다 a. 을 확장하여 직접 만들 수 있으며 AttributeReflection을 사용하여 쿼리 할 수 ​​있습니다 (나중에 더 자세히 설명 할 것입니다). 메타로 이동하여 속성에 속성을 사용할 수있는 선언의 종류를 제한 할 수 있습니다 AttributeUsage.

길이 17

c.Count(t=>t==3);

다음은 편리한 골프 방법입니다. 주어진 Func열거 가능한의 요소에 매핑이 c에이 bool, 그것의 요소의 수를 돌려줍니다 c해당하는 Func반환합니다 true. 루프를 작성하는 것보다 훨씬 좋습니다.

길이 18 :

foreach(T t in c);

이것은 for-each 루프입니다. 열거 가능한 것들에 대한이 모든 이야기와 함께, 이것은 매우 필요한 구조입니다. foreach은 열거자를 설정하고 c(열거 가능해야 함) 한 번에 하나의 요소 t를 반복 하는 구문 설탕입니다 . 각 개별 요소를 변경하거나 검사 할 수 있지만 컬렉션 자체를 변경하면 열거자가 무효화됩니다.

길이 19

c.Select(t=>t.a/2);

기능 프로그래밍 팬을위한 '맵'기능입니다. Select는 Func열거 형의 각 요소에서 임의의 변환 ( 전달 된 것으로 정의 됨)을 수행하는 간결한 방법 입니다. 반복 할 때 "변환 된"요소를 뱉어 낼 IEnumerable을 반환합니다.

길이 21

Console.Write("Hi!");

이 줄은 stdout에 텍스트를 쓰며 C #이 골프에 많이 사용되지 않는 주된 이유 중 하나 일 것입니다!

길이 23

typeof(T).GetMethods();

C #은 Reflection이라는 강력한 기능을 지원합니다. 리플렉션을 사용하면 런타임에 코드 구조를 검사 할 수 있습니다. 예를 들어,이 호출은 지정된 유형에 대한 모든 메소드의 배열을 리턴합니다. 이러한 메소드를 검사하거나 호출하거나 필드 및 특성 값을 수정할 수도 있습니다. 속성 (길이 16 참조)은 리플렉션에 사용하기 위해 코드 부분에 태그를 지정하는 좋은 방법입니다.

길이 25

from t in c select t.a/2;

SQL입니까? C # 코드에서? 꽤 비슷해. 이 표현식은 길이 19의 표현식과 동일합니다.

길이 27

for(var l;;l=new object());

C #은 가비지 수집 언어이므로 new키워드를 사용하여 할당 한 모든 메모리에 대한 참조가없는 한 자동으로 해제 될 수 있습니다. 이 코드는 생성 된 메모리를 명시 적으로 해제하지 않아도 행복하게 영원히 실행됩니다. 가비지 콜렉션에는 비용이 발생합니다. 웹을 검색하여 자세히 알아보십시오.

길이 29

var e=Enumerable.Range(0,99);

Enumerable.Range잠재적으로 편리한 골프 기능입니다. 열거 할 수있는 구조를 반환하고 지정된 범위 내에서 각 숫자를 순서대로 산출합니다. 두 번째 매개 변수는 색인이 아닌 개수입니다.

길이 31

public int pr{get;private set;}

여기에서는 간단한 '속성', OOP 기능 및 C #의 또 다른 특징을 보여줄 수 있습니다. Java를 사용해 본 적이 있다면 필드의 접근성을 분리하거나 변경 될 때 코드를 실행하기 위해 필드에 대해 'get'및 'set'메소드를 작성했을 것입니다. C #을 사용하면 필드 바로 위에 해당 코드를 선언하고 가져 오기 및 설정을위한 별도의 액세스 수정자를 설정할 수도 있습니다. 이 특정 스 니펫은 기본 게터와 세터를 자동으로 생성하지만 세터를 비공개로 만듭니다.

길이 32

public static void m(this T o){}

이 스 니펫은 API 디자인에 유용한 C # 기능을 보여줍니다. this정적 메소드의 첫 번째 매개 변수에 수정자를 적용하면 해당 메소드가 "확장"메소드가됩니다. 이것이 선언되면, T.m실제로 T의 메소드 인 것처럼 T 유형의 모든 오브젝트에서 호출 될 수 있습니다. 소스 코드를 수정하거나 액세스하지 않고도 기존 클래스에 새로운 기능을 추가하는 데 사용할 수 있습니다.

길이 38

int f(int a,ref int b,out int c){c=0;}

이 방법은 C #에서 가질 수있는 다양한 유형의 매개 변수 전달을 보여줍니다. 수정되지 않은 매개 변수는 value전달됩니다 . 접두사가 붙은 매개 변수 ref는 참조로 전달됩니다. 완전히 새로운 개체를 할당하면 메서드에서 다시 전달됩니다. 접두사가 붙은 매개 변수 out는 추가 리턴 값과 같습니다. 메소드에서 값을 지정해야하며 ref 매개 변수와 같이 다시 수행됩니다.

길이 42

Console.Write("It is \{DateTime.Now()}.");

새로운 C # 6 표준은 문자열 보간을 사용하여 조립 된 문자열을 출력해야 할 때 일부 문자를 절약 할 수 있습니다. 이 기능을 사용하면 문자열 리터럴 내부에 중괄호로 표현식을 작성할 수 있으며 런타임시 문자열이 해당 표현식의 값으로 자동으로 어셈블됩니다.

길이 48

IEnumerable f(){for(int a=0;;)yield return a++;}

실제 목적으로 무언가를하기에 충분한 캐릭터들! 이 방법은 위에서 살펴본 아이디어 중 일부를 사용하여 0부터 시작하여 정수를 하나씩 하나씩 간단히 반환하는 무한 Enumerable을 만듭니다. C #은 Enumerables를 사용하여 지연 평가를 사용하므로 무한 시퀀스가 ​​완벽하게 유효합니다. 원하는만큼 시퀀스를 반복하고 언제든지 분리 할 수 ​​있습니다.

길이 56

int p{get{return mP;}set{mP=Math.Max(value,0);}};int mP;

다음은 '재산'의 또 다른 예입니다 (스 니펫 31 참조). 여기에, 난 사실에 대해 서로 다른 코드 조각을 정의 get하고 set오히려 이전과 자동 것들을 사용하는 것보다. 이 예제에서는 속성을 사용하여 변수에 할당 된 값의 유효성을 검사하는 방법을 보여줍니다. 여기서 값은 0보다 작아 질 수 없습니다. 다른 좋은 속성으로는 값이 변경 될 때 이벤트에 알리거나 캐시 된 값을 다시 작성하는 것이 있습니다. 그것은 이것에 기초 할 수 있습니다.

길이 65

int v;public static implicit operator int(Program o){return o.v;}

이 기능을 암시 적 캐스트라고합니다. 특정 클래스에서 작동하는 정적 코드라는 점에서 확장 메서드와 비슷합니다 (스 니펫 32 참조). 그러나 암시 적 캐스트는 호출하여 사용되지 않으며 단순히 Program객체를 정수 (예 :)로 처리하여 사용됩니다 int i=new Program(). 이 작업을 수행하면 암시 적 캐스트 코드를 기반으로 객체가 사용중인 유형으로 자동 변환됩니다. 가장 좋은 방법은 변환 결과로 정보가 손실되지 않는 경우에만이 작업을 수행하는 것입니다.


1
이 캐릭터들로 당신이 무엇을 할 수 있는지 보자 ... ;-)
자랑스런 Haskeller

9
나는 그것이 C보다 자바에 더 가깝다고 말하고 싶다
자랑스런 Haskeller

유명한. 나는 우리가 Linq를하기에 거의 충분하다고 생각한다 – 오늘 밤에 온다!
BMac

공개 정적 암시 적 연산자 int (MyClass o) {return o.objVal;} // 65. 이 코드를 사용하면 다음 행이 유효합니다. MyClass o1 = new MyClass (10); int o2 = o1; // o2는 10입니다. msdn.microsoft.com/ko-kr/library/85w54y0a.aspx
Zukki

더 많은 발췌문 부탁드립니다
Cyoce

98

자바


길이 44 스 니펫

Object a=System.out.append("Hello, World!");

Hello, World!STDOUT으로 인쇄 합니다.

길이 43 스 니펫

float[][][][][]a=new float[5][3][7][2][10];

a는 각각 10 개의 배열을 포함하며 각각 2 개의 배열을 포함하고 각각 7 개의 배열을 포함하고 각각 7 개의 배열을 포함하며 각각 3 개의 배열을 포함합니다 float.

길이 42 스 니펫

interface A{static void main(String[]a){}}

완전한 프로그램. 의 모든 interface것이 본질적으로 public이므로 public주요 방법에서 단어 를 생략 할 수 있습니다 .

길이 36 스 니펫

class A{class B extends A{B.B.B b;}}

A내부 클래스가 B있습니다. 이것은 타입의 변수를 선언 할 수 있다는 것을 의미합니다 A.B.

그러나 B의 하위 클래스이므로의 A모든 메소드, 필드 및 내부 클래스A있습니다. 따라서 유형 B.B도 참조 할 수 있습니다.

이 코드에서는 한 단계 더 나아가 B인스턴스 변수 유형을 제공합니다.B.B.B 합니다.

도덕 : SO에 대한 뜨거운 질문을 따르는 것은 무의미하지만 흥미로운 많은 기술을 가르쳐 줄 수 있습니다.

길이 35 스 니펫

l.stream().map("a"::equals).count()

경우 l문자열의 목록입니다, 이것은 우리에게 얼마나 그들 중 많은 동일"a" .

길이 34 스 니펫

public static void main(String[]a)

프로그램의 주요 메소드의 메소드 서명. 11 명만 추가하면 완전한 프로그램을 만들 수 있습니다!

길이 33 스 니펫

enum D {NORTH, EAST, SOUTH, WEST}

NORTH, EAST, SOUTH, 및 WEST유형의 모든 상수D .

길이 32 스 니펫

Files.readAllBytes("hello.txt");

전체 파일을 읽고 byte[] 내용 중 를 .

길이 31 스 니펫

new String(new char[]{'h','i'})

에 해당합니다 "hi". 유용한 경우"키가 고장난 .

길이 30 스 니펫

new JFrame().setVisible(true);

다른 구성 요소를 배치 할 수있는 새 가시적 프레임을 작성합니다.

길이 29 스 니펫

throws ClassNotFoundException

이것을 호출하는 모든 메소드가 try-catch 블록 하거나 오류를 스택으로 전달하도록합니다. 확인 된 예외는 Java 디자이너가 가장 논란의 여지가있는 결정 중 하나입니다.

길이 28 스 니펫

int f(int x){return f(x-1);}

이 기능은 영원히 실행되지 않습니다. 실제로 일반적인 컴퓨터에서는 1 초도 채 걸리지 않습니다. 감사합니다, 스택 오버플로.

길이 27 스 니펫

Object a=new String[]{"a"};

새로운 문자열 배열을 만듭니다.

길이 26 스 니펫

Object.class.newInstance()

새로운을 만듭니다 Object.

길이 25 스 니펫

((Supplier)()->-~0).get()

하드 코딩 상수를 피하는 것이 가장 좋습니다. 이것은 1이외의 상수를 사용하지 않고 값을 얻는 객체 지향 방식입니다 0.

길이 24 스 니펫

(Function<Long,?>)x->x+1

후속 기능.

길이 23 스 니펫

l.removeIf(x->x%10==0);

l정수 목록 인 경우 10으로 나눌 수있는 모든 값을 제거합니다.

길이 22 스 니펫

int i=(new int[7])[5];

7 개의 정수로 구성된 새 배열을 만들고 다섯 번째 요소를 가져옵니다.

길이 21 스 니펫

Arrays.asList(2L,"a")

이러한 요소를 사용하여 ArrayList를 만듭니다.

길이 20 스 니펫

System.out.print(s);

인쇄 s합니다.

길이 19 스 니펫

import java.util.*;

같은 클래스의 간결하고 사용을 할 수 있습니다 List, Map, Scanner, Timer,와 Random.

길이 18 스 니펫

Math.addExact(x,y)

두 정수 추가 xy. 오버플로가 발생하면 잘못된 응답을 제공하지 않고 예외가 발생합니다.

길이 17 스 니펫

Double.MIN_NORMAL

doublesignificand의 선행 비트가 0 인 type의 최소 양수 값 .

길이 16 스 니펫

System.in.read()

콘솔에서 단일 문자를 읽습니다.

길이 15 스 니펫

Long.reverse(x)

의 이진 표현에서 비트를 반전시킵니다 x.

길이 14 스 니펫

int x=050+120;

x로 시작하는 0것은 8 진으로 취급 되므로 이제 160 입니다.

길이 13 스 니펫

private C(){}

개인 생성자는 다른 클래스가 인스턴스를 생성하지 못하게합니다. 이 패턴에서 사용되는 SystemMath 클래스에서 . 개인 생성자를 사용하여 싱글 톤 패턴을 시행 할 수도 있습니다.

길이 12 스 니펫

static class

많은 프로그래머 들이 직면 문제에 대한 해결책 인 외부 클래스를 포함하지 않고 내부 클래스를 만들 있습니다 .

길이 11 스 니펫

throw null;

종종을 던질 필요가 NullPointerException있지만 꽤 장황합니다. 이것은 훨씬 간단한 대안입니다.

길이 10 스 니펫

int[]a,b[]

두 개의 변수를 정의합니다 : ab. a유형 int[]이며 b유형 int[][]입니다.

길이 9 스 니펫

switch(x)

의 값에 따라 장소로 이동 x합니다.

길이 8 스 니펫

break a;

라벨이 붙은 블록에서 나옴 a .

길이 7 스 니펫

goto x;

goto키워드는 C, C ++ 및 Java에 예약되어 있습니다. 경우 x라벨은,이 코드는 적절한 라벨에 프로그램을 전송 - C와 C ++에서. 그러나 Java는 신비를 유발합니다 RuntimeException. 실제로 gotoJava 에서 키워드 를 사용하는 방법은 전혀 없습니다 .

길이 6 스 니펫

\u003b

진술을 종료합니다. 자바는 이상하다 .

길이 5 스 니펫

a-=-a

a부정을 빼면 배가 됩니다.

길이 4 스 니펫

a&=b

의 값으로 설정 a비트 단위와의 ab.

길이 3 스 니펫

...

배열로 통합 된 여러 인수

길이 2 스 니펫

<>

컴파일러가 의미하는 제네릭 형식을 파악할 수 있습니다. 매우 Java와 유사합니다.

길이 1 스 니펫

@

메소드 및 클래스에 대한 추가 정보를 표시 할 수있는 주석을 나타냅니다.

팩 토이 드

Java에서 무한 루프는 때때로 컴파일러 오류를 유발합니다. 예를 들어, while(true);메소드를 종료하지 않고 루프 를 종료 할 수 없으므로 그 이후의 모든 코드는 "도달 할 수없는 명령문"오류를 트리거합니다. @Optimizer가 지적했듯이 무한 루프만이 이런 식으로 잡힐 것입니다.


5
Java에서 무한 루프는 컴파일러 오류를 발생시키지 않습니다. 그것들을 감지하고 오류를 생성하는 IDE입니다. Java에는 단순히 도달 할 수없는 명령문의 개념이 있으므로 while(true);코드 와 같은 것이 있으면 해당 행 다음에 놓이면 도달 할 수없는 명령문의 컴파일 오류가 발생합니다. 이러한 문장을 감지하는 논리는 매우 엄격하므로 어떠한 무한 루프도 인식하지 못합니다
Optimizer

4
방금 투표를 마쳤습니다. 스 니펫을 제거해야합니다. ;)합니다 (downvote는 "자바가 이상해"를했다)
사이먼 포스 버그

1
스 니펫 # 36은 재귀 적이며 무기한으로 확장 될 수 있습니다 : class A{class B extends A{B.B.B.B.B.B.B b;}}여전히 컴파일됩니다.
Natix

3
당신이 완전한 프로그램을 만드는 것을 돕기 위해 찬성했습니다;)
durron597

1
But it Java, [goto] triggers a mysterious RuntimeException잘못된. goto컴파일조차하지 않습니다.
dorukayhan 2016 년

93

파이썬

이제 편의를 위해 최신으로 시작하십시오! 가장 빠른 것부터 시작하여 길이 30을 읽으려면 개정 내역으로 이동하십시오.

누구든지 제안 사항이 있으면 자유롭게 의견을 말하십시오.

길이 52 :

i=0
while s[i-n:]:print(' '*n+s)[i:n+i];i+=1;i**7**7

Fake Marquee Text 챌린지에 참가 했습니다. s그리고 n문자열과 미리 정수로 설정해야합니다. 실제로 사용하고있는 무료 Python 2 인터프리터에서는 제대로 작동하지 않으므로 괄호를 추가 (' '*n+s)[i:n+i]하고 여기 에서 Python 3 인터프리터에서 실행되는 것을 볼 수 있습니다 .

길이 43 :

#-*-coding:rot13-*-
cevag h"Una fubg svefg"

파이썬에서는 소스를 특정 코덱으로 인코딩 할 수 있습니다. Rot13에서 소스를 작성하는 방법을 보여줍니다. 일반적인 구문은 다음과 같습니다 # -*- coding: <codec-name-goes-here> -*-.

번역 된 내용은 다음과 같습니다.

#-*-coding:rot13-*-
print u"Han shot first"

u문자열 리터럴 다음과 같은 지정은 유니 코드 문자열입니다. 문자열이 Rot13에도 포함되도록하려면 필요합니다. 그렇지 않으면 암호화에도 불구하고 소스의 모든 문자열을 쉽게 읽을 수 있습니다. 또는 .encode("Rot13")모든 문자열 다음에 사용할 수 있습니다 (Rot13도 사용하는 것을 잊지 마십시오). 이 기사 에 따르면 일부 대체 인코딩은 "base64", "uuencode", "zlib"또는 "bz2"입니다.

길이 33 :

import cmath
print cmath.sqrt(-1)

이것은 복잡한 (가상) 숫자를 위한 파이썬의 모듈입니다 . 이 인쇄는 1j파이썬 엔지니어링 표준을 준수하고 사용하기 때문에, j내가 좋아하지만, 허수 단위로 i더 일반적으로 수학에 사용되는, 그리고 사용 jk뿐만 아니라 i에 대한 사원 수 ,하지만 난 빗나가 다. 여기 에서 버그 / 변경 순서를 읽으 십시오 (변경되지 않음).

길이 30 :

f=lambda n:n*f(n-1)if n else 1

이제 우리는 재귀와 삼항 if-else를 사용하여 자신의 계승 함수를 정의합니다! 내가 아는 한, 이것은 파이썬에서 얻는 것만큼이나 골프입니다. 또한 다음과 같이 작성할 수 있습니다 : f=lambda n:n and f(n-1)*n or 1, 몇 개의 파이썬 부울 연산자를 보여줍니다 (또한 30 자). lambda구문 에 대한 정보는 길이 15 스 니펫을 참조하십시오 .

길이 29 :

import math
math.factorial(7)

7의 계승을 구합니다 5040.

길이 25 :

import math
print math.pi

파이썬의 수학 모듈은 많은 유용한 함수와 상수를 제공합니다. 여기 PI가 있습니다. 를 반환 3.14159265359합니다. (위의 코드에서 줄 바꿈을 문자로 계산했습니다.)

길이 24 :

f=lambda y:lambda x:x**y

이것은 폐쇄의 예입니다. 호출 cube = f(3)하면 큐빅 함수가 만들어져 print cube(24)print 로 호출 할 수 있습니다 13824.

길이 19 :

print"Hello World!"

마지막으로 기본 출력을 인쇄하기에 충분한 공간이 있습니다! 따옴표와 괄호도 구분 기호이므로 공백은 필요하지 않습니다. 파이썬 3은 print다른 함수처럼 함수가 호출되도록 변경했기 때문에 파이썬 2에서만 작동 합니다. Python 3에서는을 사용하십시오 print("Hello World!"). 인쇄 기능 및 Python 2와 3의 차이점에 대한 자세한 내용은 Python 3.0의 새로운 기능을 참조하십시오 .

길이 16 :

[x*3 for x in l]

다시 한번, l목록 또는 문자열이나 생성기와 같은 다른 반복 가능한 객체 라고 가정하십시오 . 이 진술을 목록 이해라고 합니다. 표준 for 루프 구조를 사용하는 것보다 훨씬 짧습니다. 여기에는 모든 숫자에 3을 곱한 목록이 반환됩니다. 또한 문자열에 곱할 수 있습니다! 따라서 목록의 모든 문자열이 해당 횟수만큼 추가됩니다 (자체에 연결됨).

길이 15 :

import this #:)

이것은 실제로 길이 11 스 니펫이지만 파이썬 (굉장한) 이스터 에그 를 전시하는 것을 잊었다는 것을 깨달았습니다 ! 이 모듈을 가져 오면 Zen of Python 이 인쇄됩니다 (Factoid 참조). 흥미로운 사실 ​​:이 모듈 this.py은 rot13으로 인코딩되었으며 나중에 기능을 제공 할 것입니다.

길이 14 :

lambda x:x**.5

lambda함수 리터럴에 파이썬의 구문을 사용하여 제곱근 함수를 정의합니다 . 파이썬의 함수 리터럴은 문장이 아닌 표현식 만 포함 할 수 있습니다. 이 람다 함수에 전달하거나, 인라인으로 실행하는 변수에 할당 될 수 (lambda x:x**.5)(9)리턴 3.0. 제곱근에 지수를 사용하는 sqrt것은 math모듈 에서 함수 를 가져 오는 대신 사용할 수 있습니다.

길이 13 :

1 if x else 0

이것은 파이썬의 삼항 if 연산자의 예입니다. 이것은 부울 연산으로 코더를 수동으로 구현하지 못하게하기 위해 Python 2.5에서 추가되었습니다. 여기에, 1경우에 돌려 주어 x평가하여가 True, 그렇지 않으면 0반환됩니다.

길이 12 :

s=input(">")

>프롬프트 텍스트 가 인쇄 되고 사용자가 값을 입력 할 수 있습니다. 파이썬 2는 입력 된 모든 값을 해석하므로 문자열에는 따옴표가 필요합니다. 파이썬 3은 이것을 변경하여 입력 한 입력이 자동으로 해석되지 않도록합니다. Python 2에서 입력을 해석하지 않고 입력하려면을 사용하십시오 raw_input(). Python 2에서는와 input()같습니다 eval(raw_input()).

길이 11 :

eval("2e3")

2e3float 2 x 10³에 대한 과학적 표기법입니다. 이 eval함수는 모든 문자열을 표현식으로 해석하고 평가합니다. 이 경우, 문자를 이용하여 동일한 결과를 갖는다 2e3이상 float("2e3"). 를 반환합니다 2000.0.

길이 10 :

range(013)

이 함수는 정수 목록을 08 진수 값으로 반환합니다.이 값 01311(제외), 즉 목록이입니다 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. 이 함수는 slice앞에서 검토 한 함수 와 유사한 최대 3 개의 매개 변수를 사용합니다 range(start, stop[, step]). 차이점은 매개 변수가 하나만 있으면 매개 변수가 중지 값을 나타냅니다.

Python 3.x에는 해당 사항이 없습니다. 그건 range유사하지만, 실제로 파이썬 2의 것과 동일 xrange목록 대신 발전기 개체를 반환.

길이 9 :

a,b = b,a

여러 과제. 이것은 단순하지만 우아한 기능으로 여러 값을 동시에 할당 할 수 있습니다. 제공된 스 니펫에서 a와 스왑 b합니다. 평가 순서는 어떻습니까? 대입 연산자의 오른쪽에있는 모든 식은 대입이 이루어지기 전에 평가됩니다. 이것은 임시 변수에 중간 할당이 필요한 많은 언어를 능가합니다.

길이 8 :

#comment

그게 뭔지 알아 ... 잠깐, 그렇지? 코드 줄을 설명하기 위해 임의의 텍스트를 입력하여 이해하기 쉽도록하는 것입니까? 아니? 오 알았어 ...

길이 7 :

l[::-1]

다시 l목록 이라고 가정 하면 목록이 역순으로 반환됩니다. 세 번째 인수는 단계 크기를 나타냅니다. 세 인수 모두 음수 값일 수 있으므로 음수 단계 크기는 역순으로 반복됩니다. 빈 첫 번째와 두 번째 인수는 전체 목록을 반복한다는 것을 보여줍니다.

좀 더 흥미로운 구조를 사용할 수있는 곳으로갑니다!

길이 6 :

l[-6:]

이것을 슬라이스 작업 이라고합니다 . l목록 인 경우 마지막 6 개 요소를 포함하는 새 목록을 목록으로 반환 l합니다. -6는 시작 색인 (끝에서 6)을 나타내며 콜론은 끝 색인 (끝까지 비워 둔 끝)까지 계속되는 것을 의미합니다. 목록에 1에서 10까지의 숫자가 포함되어 있으면이 값을 반환 [5, 6, 7, 8, 9, 10]합니다.

길이 5 :

1<x<5

파이썬의 멋진 기능 중 하나는 비교 연산자를 연결할 수 있다는 것입니다. 다른 많은 언어에서는이 형식이로 입력됩니다 1 < x && x < 5. 여러 비교를 고려할 때 더 좋아집니다 : 1 < x < y < 5완벽하게 유효합니다!

길이 4 :

0256

앞에 0이있는 정수는 리터럴 8 진 값입니다. 이것은 코드 난독 화에 대한 좋은 트릭입니다. 10 진수 값을 반환합니다 174. Python 3.x에서 8 진수 값은로 작성됩니다 0o256.

길이 3 :

`3`

백틱에서 표현식을 둘러싸는 repr()것은 객체의 문자열 표현을 반환하는 을 사용하는 것과 같습니다 . 이 함수는 함수에 인수로 전달 될 때 eval원래 객체를 반환 하는 방식으로 문자열을 반환하려고 시도 합니다. 그것은 것입니다 하지 사용하는 것과 같은 str()결과가 때로는 동일하지만,. 이 입력의 '3'경우 두 경우 모두에 반환됩니다. 이것은 코드 골프에 대한 나의 마음에 드는 것입니다!

파이썬 2에서만 작동합니다!

길이 2 :

[]

빈 목록.

길이 1 :

_

밑줄 문자는 많이 사용되는 버리기 변수 이름입니다. 그러나 Python 셸 (대화식 인터프리터)을 사용하는 경우 마지막으로 실행 된 명령문의 결과를 보유하고 다시 리턴합니다. 또한 이 스레드 에 따라 i18n의 변환 조회에도 사용됩니다.

Factoid : Python은 Java 및 C와 유사한 언어입니다. " PEP 20 – The Zen of Python " 에서 발췌 한 특정 설계 철학 으로 작성되었습니다 .

  • 못생긴 것보다 아름답다
  • 암시 적보다 암묵적
  • 단순한 것이 복잡한 것보다 낫다
  • 복잡한 것이 복잡한 것보다 낫다
  • 가독성

이 때문에 세미콜론은 명령문 구분 기호로 허용되지만 일반적으로 가독성을 위해 여러 줄을 사용하기 위해 생략됩니다. 또한 줄 들여 쓰기가 매우 중요합니다!


언제든지! 이미 좋은 일을하고 있기 때문에 더 이상 스 니펫을 추가하지 않을 것입니다 (길이 9에 저항 할 수 없습니다!). 행운을 빕니다!
nasser-sh

1
길이 6 : 반환 [5, 6, 7, 8, 9, 10](목록의 마지막 6 자리)
Vincent

길이 16 : l리스트 일 필요는 없으며 반복 가능한 객체 일 수 있습니다. 튜플,리스트 및 생성기 (예 : 모든 작업)
nasser-sh

@ Sp3000 : [제한된 소스] 과제와 함께 사용했습니다.
로비 Wxyz

4
좋은 노인에 대한 사랑이 import antigravity없습니까?
Cipher

87

자바 스크립트

이것은 최신에서 가장 오래된 것입니다. 나 자신을위한 링크 : [ 편집 ]

길이 51 스 니펫 :

console.log(require('fs').readFileSync(__filename))

Node.JS는 자체 소스 코드를 읽기 때문에 "엄격한 quine"요구 사항이 실패하지만 이번에는 quine입니다.

길이 50 ​​스 니펫 :

a=new XMLHttpRequest;a.open('GET','file');a.send()

드디어! AJAX 요청 ( Vanilla.JS 사용 ) 요청을 초기화하고 열고 전송했지만 처리기를 추가하고 실제로 결과로 무엇이든 공간이 부족 합니다.

길이 49 스 니펫 :

msg=new SpeechSynthesisUtterance('Hello World!');

보컬 "Hello World!"를 준비하십시오. 실제로 말하면 조금 더 많은 일이 될 것입니다. 음량, 피치, 속도 및 악센트를 조정할 수도 있습니다. HTML5Rocks의 음성 합성 API를 참조하십시오 . Firefox에서는 아직 지원되지 않지만 IE에서는 지원되지 않습니다 .

길이 48 스 니펫 :

function repeat(){setTimeout(repeat,48)}repeat()

setInterval재귀 적으로 시뮬레이션 setTimeout합니다.

길이 47 스 니펫 :

module.exports=function MyModule(a) {this.a=a};

NodeJS는 다시하지만 원칙은 JS의 모든 곳에서 동일합니다. 이것은 매우 기본적인 생성자 함수이며 하나의 속성 ( a)으로 객체를 만듭니다 . 설정하면 module.exports사용할 기능을 require()-ing 하여 내 보냅니다 .

길이 46 스 니펫 :

canvas.getContext('2d').fillRect(46,46,46,46);

이것은 <canvas id="canvas"></canvas>요소 가 필요합니다 . ID가있는 요소는 전역 변수로 채워 지므로 canvasJS에서 와 같이 요소에 액세스 할 수 있다는 사실을 이용합니다 . 그런 다음 x = 46, y = 46에서 46x46 정사각형으로 채 웁니다.

길이 45 스 니펫 :

JSON.parse(require('fs').readFileSync('jsn'))

노드로 돌아갑니다. 여기에서는 jsn현재 디렉토리에서 이름이 지정된 JSON 파일을 구문 분석합니다 .

길이 44 스 니펫 :

(a=document.createElement('a')).href="/url";

39 번 빌딩. 이제 요소를 만들고 속성을 할당합니다. 그래도 DOM에는 없습니다.

길이 43 스 니펫 :

sq=[1,2,3,4,5].map(function(n){return n*n})

을 사용하여 처음 5 개의 정사각형 배열을 만듭니다 map().

길이 42 스 니펫 :

six="1+5",nine="8+1";eval(six+' * '+nine);

이 같은 원리로 작동 있지만, JS는 부족 #define등은 좋지 끝납니다. 물론 그것은 삶, 우주, 그리고 모든 것에 대한 답을 돌려줍니다 .

길이 41 스 니펫 :

c=function(){var i;return function(){}}()

폐쇄의 시작. c내부 변수에 액세스 할 수있는 함수 (내부 함수) i이지만 아무것도하지 않습니다.

길이 40 스 니펫 :

$('p').click(function(){$(this).hide()})

우리는 그 단락을 완전히 삭제하고 jQuery를 사용하고 있습니다.

길이 39 스 니펫 :

script=document.createElement('script')

이것은 새로운 외부 스크립트 추가의 시작입니다. 빈 <script>요소를 만들고 참조를 유지하십시오.

길이 38 스 니펫 :

document.getElementsByClassName('abc')

.abc문서 의 모든 요소를 찾으십시오 . 물론 jQuery를 사용하면 $('.abc')...

길이 37 스 니펫 :

b=JSON.parse(JSON.stringify(a={3:7}))

동일하지만 분리 된 두 객체 a, 및을 만듭니다 b. 당신이 할 경우

a={a:1};
b=a;
b.a=3;

당신이로 끝날 것 a=={a:3}때문에, a그리고 b포인트 같은 객체를. JSON을 사용하여 분리합니다.

길이 스 니펫 :

(function f(){return "("+f+")()"})()

quine . 자체 소스 코드를 인쇄합니다.

길이 35 스 니펫 :

document.body.style.display="none";

32 번 참조. 이것은 내용을 덮어 쓰지 않고 문서를 숨 깁니다.

길이 34 스 니펫 :

Object.prototype.toString.call(34)

호출 Object.prototype.toString은 객체의 유형을 알려주는 좋은 방법입니다. 동안 34..toString()이다 "34", 코드 조각입니다 [object Number].

길이 33 스 니펫 : (이것에 대한 신용 은 익명의 사용자 에게갑니다 )

+0%-0.&(v\u0061r=~void[{}<<!(0)])

이것이 유효한 JavaScript가 아니라고 생각하십니까? 더 잘 사용해보십시오 ... (Chrome 사용);)

길이 32 스 니펫 :

document.body.innerHTML="hacked"

멈춰라! Hazxxors! 11! 11!

길이 31 스 니펫 :

a=[];for(i=0;i<31;i++)a.push(i)

농담 아니, 나는 실제로 for루프를 사용할 수 있도록 오래 기다렸습니다 ! 이것은 0-30의 배열을 만듭니다.

길이 30 스 니펫 :

new Date().getDay()==1?"S":"E"

삼항 연산자를 처음 사용합니다. 나는 30자를 넘을 수 없었으므로 오늘이 일요일인지 아니면 다른 것인지 만 알 수 있습니다. :피

길이 29 스 니펫 :

Object.keys(window).push('i')

Object.keys(window)전역 변수의 배열을 얻습니다 (의 속성 window). .push()해당 배열에 항목을 추가합니다. 이것이 이것과 동등하다고 생각 window.i=undefined하십니까? 아니!

길이 28 스 니펫 :

setTimeout("a=confirm()",28)

새 스레드를 만드는 것을 제외하고 28 밀리 초를 기다리는 것은 그리 유용하지 않습니다.

길이 27 스 니펫 :

document.querySelector('a')

DOM 이름이 너무 길다는 것은 부끄러운 일입니다. 여기에 하나의 링크 만 얻을 수 있습니다.

길이 26 스 니펫 :

JSON.stringify({twenty:6})

# 16을 참조하십시오. 이제 실제 JSON-문자열을 얻습니다.

길이 25 스 니펫 :

new Badge("Good Answer");

Badge()인수를 취하는 생성자 함수 라고 가정하면 ... Good Answer 배지가 방금 생성되었습니다!

길이 24 스 니펫 :

do {alert(24)} while(!1)

나는 실제로 do..while많이 사용 하지 않지만 일부는 사용합니다. 이것이 일반적인 while루프라면 항상 거짓이기 때문에 아무 것도 경고하지 않습니다. do..while그래도 항상 한 번 이상 실행되므로 24를 보게됩니다.

길이 23 스 니펫 :

window.parent==self.top

이들은 모두 일반적으로로 알려진 동일한 객체를 나타 window냅니다. 정상적으로 함수를 호출하면이 있습니다 this. 이것이 전역 객체에 액세스하는 5 가지 방법입니다!

길이 22 스 니펫 :

for(i in self)alert(i)

모든 글로벌 변수를 경고하십시오. 그런 일이 일어납니다 self==window. (다음 스 니펫 참조)

길이 21 스 니펫 :

"2"+1==21 && 2+1=="3"

아, 봐봐, 그것은 다시 JS의 캐스팅 규칙이다. 이 진술은 사실입니다, btw.

길이 20 스 니펫 :

Math.random()<.5?0:1

0-1에서 난수를 선택하고 삼항 연산자를 사용하여 반올림합니다. 사용하기가 더 쉽지만 Math.round...

길이 19 스 니펫 :

[1,2,3].map(i=>i*i)

이것은 새로운 것입니다. 정말 새롭습니다. 그것은 사용 ES6 화살표 기능을 단지 파이어 폭스에 의해 지원 될 것으로 보인다, 현재 1, 2, 3의 제곱을 계산합니다.

길이 18 스 니펫 :

location.href="/";

# 15와 마찬가지로 이번에는 SE가 아닌 PPCG 홈페이지로 이동합니다.

길이 17 스 니펫 :

(function(){})()

14의 스 니펫이지만 더 좋습니다! 이제 IIFE입니다.

길이 16 스 니펫 :

obj={not:'json'}

이것은 내 애완 동물 친구 중 하나를 설명합니다. 이것은이다 개체 , 하지 JSON ! JSON 은 JavaScript 객체를 기반으로하는 데이터 교환 형식이지만보다 엄격한 형식을 취합니다.

길이 15 스 니펫 :

open('//s.tk/')

상상 해봐. http://s.tk/ 경로 재 지정을 사용하여 SE 홈페이지를여십시오 .

길이 14 스 니펫 :

function f(){}

W00t! 기능! 아무 일도 여지가 없습니다 .

길이 13 스 니펫 :

Math.random()

0에서 1 사이의 난수를 생성하십시오. 자신의 한계를 정의 하시겠습니까? 힘든 행운. (실제로는 쉽지 않습니다.)

길이 12 스 니펫 :

new Date<=12

이 문장은 JS에서는 사실이 아닙니다. JS는 1970 년 1 월 1 일 00 : 00 : 00.012 이후 인 95 년까지 (진정 참조) 만들어지지 않았습니다.

길이 11 스 니펫 :

Math.PI*121

반경이 11 인 원의 넓이

길이 10 스 니펫 :

if('j')9+1

눈치 채지 못한 경우 코드의 스 니펫 번호로 무언가를하는 것이 좋습니다. 이것은 10을 반환하고 알파벳의 10 번째 문자 인 j를 사용합니다.

길이 9 스 니펫 :

[9].pop()

하나의 항목으로 배열을 만듭니다. 족제비pop 간다 9.

길이 8 스 니펫 :

document

모든 DOM 작업의 기초. 그러나 우리는 너무 길기 때문에 아무것도 할 수 없습니다. :( jQuery로 이동!

길이 7 스 니펫 :

alert()

오 소년! 함수 호출! 마침내 일을 할 수있게되었다!

길이 6 스 니펫 :

var x=6

# 3을 기반으로합니다. 그러나 이제는 전 세계가 명시 적이기 때문에 훨씬 좋습니다 . :피

길이 5 스 니펫 :

[][5]

void 0얻는 것보다 짧습니다 undefined. BTW : ''.a더 짧습니다. 4 자만 가능합니다.

길이 4 스 니펫 :

+"4"

4문자열 에서 숫자가 생성됩니다 "4". 이 정확히 동일한 4자를 다른 순서로 재사용하여 반대의 작업을 수행 할 수 있습니다!

길이 3 스 니펫 :

x=3

오, 방금 암시 적 전역 변수를 만들었습니다.

길이 2 스 니펫 :

{}

이것은 무엇을 하는가? 객체 리터럴을 생성한다고 말하면 잘못되었습니다. 실제로는 빈 블록입니다. 콘솔을 열고 사용해보십시오! 이 undefined아닌을 반환합니다 {}.

2018 년 {}Chrome 콘솔에서 실제로 빈 개체를 반환합니다.

길이 1 스 니펫 :

1

그게 다야. 숫자는 유효한 JS 표현식입니다.

사실 : JavaScript는 원래 LiveScript로 불 렸습니다. 당시 (1995 년) Java의 인기를 활용하기 위해 JavaScript로 변경되었습니다. 개인적으로, 그들은 이전 이름을 유지해야했습니다. JavaScript는 그 이후로 혼란의 원천이었습니다. 사실 Java와 JavaScript는 "car"및 "carpet"과 비슷 합니다.


1
Snippet 33은 Firefox에서 작동하지 않습니다. 정말 유효한 JS입니까?
Oriol

너무 더러운 객체를 문자열 화하고 다시 파싱하는 것을 발견했습니다. ECMAScript 6이 도입 Object.assign되어 스 니펫 37이됩니다 b = Object.assign({ }, a = {3 : 7}).
Oriol

@Oriol 예, Firefox 만 지원하므로 지금은 더티 방식을 고수해야합니다. 적어도 이보다 낫습니다 eval(uneval(a)). ;)
Scimonster

# 38에 대해서는 항상 document.querySelectorAll("element#id.classname[attribute]:not(somethingwedontwant)")있습니다. (올바른 CSS 선택기를 지원합니다).
Mateon1

# 40 스 니펫 자체는 그다지 흥미롭지 않지만 댓글은 값이 없습니다.
Scimonster

85

아르 자형

사실 : R 프로그래밍 언어는 S 프로그래밍 언어의 GNU 구현으로 시작되었습니다. 주로 통계 및 관련 응용 프로그램에 사용됩니다.

참고 : 경쟁의 요구 사항은 아니지만 여기의 모든 스 니펫은 R에서 자체적으로 실행될 수 있습니다.


길이 32 :

`[.data.frame`(swiss,3,2,drop=F)

이것은 조금 신비 로워 보입니다 ... 그리고 실제로해야합니다! 이것을 작성하는 훨씬 더 좋은 방법이 있습니다.

swiss[3, 2, drop = FALSE]

좀 더 친숙해 보일 것입니다. 다음 코드 중 하나를 실행할 때 발생하는 상황은 다음과 같습니다.

> `[.data.frame`(swiss,3,2,drop=F)
             Agriculture
Franches-Mnt        39.7

swiss우리가 지금까지 본 적이 몇 가지 다른 이들처럼 R과 데이터 프레임 제공됩니다. 여기에는 1888 년경 스위스의 47 개 프랑스어 권 지방에 대한 생식 및 사회 경제적 지표가 포함되어있다. 그래서 1888 년 스위스 프란 체스-만트 지방 남성의 39.7 %가 농업에 종사했습니다.

더 간단한 표기법을 사용하여 데이터 프레임에서 행 또는 열을 추출하면 R은 실제로 [.data.frame백그라운드에서 사용 됩니다. 스 니펫 24에서 보았 듯이 백틱으로 둘러 싸인 한 거의 모든 것을 함수 이름으로 정의 할 수 있으므로 함수 이름에 기술적으로 일치하지 않는 대괄호가 포함되어 있지만 스 니펫은 합법적입니다.

drop=인수는 R에게 가능한 경우 결과를 더 낮은 차원으로 떨어 뜨리기를 원하는지 여부를 알려줍니다. 실제로, 우리가 말한다면 drop=TRUE, 우리는 이것을 얻습니다 :

> `[.data.frame`(swiss,3,2,drop=T)
[1] 39.7

이전에 결과가 데이터 프레임 인 경우 R은 이제 두 배가됩니다.


길이 31 :

print(fortune("hadleywickham"))

fortune()기능은 모든 지식 fortunes패키지에서 제공되며 다양한 현명한 사람들이 제공하는 다양한 현명한 인용문을 제공합니다. 이 스 니펫은 콘솔에 인쇄하여 Hadley Wickham (23)의 다음 보석을 제공합니다.

That's a casual model, not a causal model - you can tell the difference by looking
for the word "excel".
    -- Hadley Wickham (commenting on an Excel chart showing student's SAT score
       increases with family income, without considering future covariates)
       http://twitter.com/#!/hadleywickham (February 2012)

길이 30 :

pie(rep(1,12),col=rainbow(12))

누가 좋은 원형 차트를 좋아하지 않습니까? 이 pie()함수는 숫자 벡터를 기반으로 갓 구운 파이 차트를 제공합니다. rep()제 1 엘리먼트 반복하여 생성 벡터 R의 시간 , R은 두 번째 인자이다. 이 col=매개 변수는 pie()슬라이스 색상을 지정하는 방법을 알려줍니다 . 마법 함수 rainbow()는 무지개의 "동일한 간격"색상에 대한 16 진 코드를 포함하는 지정된 길이의 벡터를 생성합니다.

여기에있는 것은 기본 "이 차트의 각 색상 양"차트입니다.

여기에 이미지 설명을 입력하십시오


길이 29 :

summary(lm(mag~depth,quakes))

여기에는 몇 가지 일이 있으므로 한 번에 한 걸음 씩 살펴 보겠습니다.

quakes그것은 데이터 세트의 열 두가 1964 년부터 피지 근처에서 리히터 규모 크기보다 큰 4.0 1000 개 지진 이벤트에 대한 정보가 포함 된 R.와 함께 제공되는 데이터 집합입니다 mag지진의 크기 인이, 그리고 depth인 진원지 깊이 (킬로미터).

lm()조각 (28)에 언급 된 기능, 선형 모델을 맞습니다. lm객체 또는 더 정확하게는 class 객체를 반환합니다 lm. 예측 변수 (또는 독립 변수)와 반응 (또는 종속 변수) 을 지정하는 두 가지 방법이 있으며 공식 방법을 선택했습니다. 이것은 형태를 취합니다 response ~ predictor. 다중 예측 변수는로 지정됩니다 y ~ x1 + x2. 수식의 개체는 다음 인수에서 제공된 컨텍스트에서 평가됩니다.

그래서 lm(mag ~ depth, quakes)하고있는 일은 크기가 반응이고 깊이가 예측 인 일반적인 최소 제곱 회귀를 사용하여 선형 모형을 피팅하는 것 입니다. 그것은 무엇을 알고 mag그리고 depth우리는 그들이에서 온 것을 그에게 말했다 있기 때문이다 quakes.

summary()적합 모델의 결과를 요약하는 데 주로 사용되는 일반 함수입니다. 인수의 클래스에 특정한 메소드를 호출합니다. 우리는 lm객체 를 전달했기 때문에 실제로는이라는 함수를 호출 summary.lm()합니다.

이를 종합하면 지진 심도에서 지진을 설명하려는 선형 모델의 요약을 얻을 수 있습니다. 특히 이것은 R이 뱉어내는 것입니다.

> summary(lm(mag~depth,quakes))

Call:
lm(formula = mag ~ depth, data = quakes)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.72012 -0.29642 -0.03694  0.19818  1.70014 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  4.755e+00  2.179e-02 218.168  < 2e-16 ***
depth       -4.310e-04  5.756e-05  -7.488 1.54e-13 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3921 on 998 degrees of freedom
Multiple R-squared:  0.05319,   Adjusted R-squared:  0.05225 
F-statistic: 56.07 on 1 and 998 DF,  p-value: 1.535e-13

가장 먼저 알려주는 것은 함수 호출입니다. 스 니펫 28에서와 같이 lm()함수가을 사용 하기 때문입니다 match.call().


길이 28 :

f<-function(x,y)match.call()

R 함수는 종종 말한 내용을 추적하는 것을 좋아합니다. 실제로 제출 한 명령이 반환 된 객체의 속성으로 다시 제공되는 경우가 있습니다. (예는 lm()입니다. 선형 모델을 만듭니다.) 정확한 명령을 호출하는 match.call()것은 함수 내에서 수행됩니다. 해석 된 함수 호출을 캡처하거나 일치 시킵니다.

여기서 우리 f()는 두 개의 인수를 취하고 그것이 무엇을 보 였는지 알려주 는 함수 를 정의 했습니다.

> f(1,2)
f(x = 1, y = 2)

이것은 주로 패키지 개발에서와 같이 일반적인 용도로 기능을 개발할 때 유용합니다. match.call()와일드 한 예제를 보려면 lm()제출 하여 소스 코드를 확인하십시오 stats:::lm. 가장 먼저하는 일은을 사용하여 함수 호출을 캡처하는 것 match.call()입니다.


길이 27 :

install.packages("ggplot2")

이것은 사소한 것처럼 보이지만 R이 그렇게 인기있는 이유 중 하나를 보여줍니다. 패키지를 통해 쉽게 확장 할 수 있습니다. 그리고 누구나 자신의 패키지를 개발하고 자유롭게 공유 할 수 있습니다!

install.packages()그 이름에서 알 수 있듯이 정확하게 수행합니다. 기본 CRAN (Comprehensive R Archive Network) 미러를 사용하여 패키지를 추적 한 다음 R이 찾을 수있는 시스템에 설치합니다. 로컬 소스 코드에서 패키지를 설치하도록 할 수도 있습니다.

ggplot2패키지를 사용한 스 니펫 23을 기억 하십니까? 이 패키지에는 R이 포함되어 있지 않지만 27 자만 ggplot2으로 설치하면 모든 꿈을 이룰 수 있습니다.


길이 26 :

filled.contour(t(volcano))

volcanoR.와 데이터 세트 배송은 뉴질랜드 오클랜드에서 지형 Maungawhau (또는 산 에덴)에 대한 정보 화산을 포함하는 행렬입니다. 행렬의 행은 동쪽에서 서쪽으로 흐르는 격자 선에 해당하며 열은 남쪽에서 북쪽으로 흐르는 격자 선입니다.

방향 감각 상실을 위해 방향을 바꿔서 열은 이제 동서로, 줄은 남북으로 있습니다. 이를 통해 행렬 변환을 사용하여이 작업을 수행 할 수 있습니다 t(). 그리고 우리가있는 동안 등고선지도를 만들어 보시지 않겠습니까? filled.contour()그냥 그렇습니다.

여기에 이미지 설명을 입력하십시오


길이 25 :

pmatch("s",c("n","size"))

pmatch()함수는 지금까지 본 모든 부분 일치의 마법을 제공합니다. 첫 번째 인수는 두 번째 인수의 각 요소 인 벡터와 비교되는 문자열입니다. 고유 한 일치가 있으면 일치하는 요소의 인덱스가 반환되고, 그렇지 않으면 얻을 수 NA있습니다.

여기 스 니펫은이 함수를 사용하는 "실제"예제입니다. 이 sample()함수를 사용한 스 니펫 13으로 돌아가 봅시다 . 이 인수를 받아들이는 n, size, replace, 및 prob있지만 처음 두가 필요합니다. 스 니펫 13에서는의 s=약자로 사용 했습니다 size=. 실제로 백그라운드에서 진행되고있는 것은이 스 니펫과 같은 것으로, 제공 한 내용과 예상되는 내용을 비교합니다. "s"는 "size"와 고유하게 일치 s=하므로 속기 로 사용 하는 것이 합법적 입니다.


길이 24 :

`(`=function(x)9;2*(3-1)

하지 말아야 할 것의 완벽한 예! 이제까지!

함수를 정의 할 때 백틱으로 둘러싼 문자를 함수로 지정할 수 있습니다. 여기서 R (은 입력에 관계없이 항상 9를 반환하는 함수 라고 말했습니다 . 다른 많은 언어와 마찬가지로 ;한 줄에 두 개의 명령을 포함시키는 데 사용할 수 있습니다. R에게 말한 것은 함수를 정의한 (다음 print하는 것 2*(3-1)입니다.

이제 3-1 = 2, 2 * 2 = 4를 수행하기 때문에 2 * (3-1)은 4가되어야합니다. 그러나 우리는 괄호 안의 모든 것이 9라고 R에 말 했으므로 3-1 = 2이지만 이제 (3-1) = 9입니다. 그러면 2 * (3-1) = 2 * 9 = 18이됩니다.

이와 같은 끔찍한 일이 가능하기 때문에 표현식에 괄호가 포함 된 코드를 제출할 때마다 (즉, 함수 호출이 아님) R 인터프리터는 실제로 함수 로 (정의했는지 여부에 관계없이 호출 된 함수를 찾습니다 (. 일반적으로 글을 많이 쓸수록 R 통역사가 더 많은 일을합니다.


길이 23 :

qplot(Na,y=RI,data=fgl)

마지막으로 (매우) 간단한 ggplot2예에 대한 충분한 투표 . 이 ggplot2패키지는 전설적인 Rdity Hadley Wickham이 만든 Grammar of Graphics의 R 구현입니다 . 일반적으로 구문은 기본 R 그래픽과 매우 다르며 익숙해지기까지합니다. 그러나 qplot()패키지의 일부 핵심 기능에 대한 간단한 인터페이스 plot()이며 기본 R 과 비슷한 구문 이 있습니다. 그러나 제가 보여 드린 많은 예제와 달리 qplot()함수 매개 변수 이름의 부분 일치는 지원하지 않습니다.

fgl데이터 세트는에서 온다 MASS패키지로 제공된다. 법의학 유리 조각의 특성 측정이 포함되어 있습니다. 여기서 우리는 Na중량 퍼센트 나트륨 (Na)과 RI유리의 굴절률 인 변수를 사용하고 있습니다.

여기에 이미지 설명을 입력하십시오


길이 22 :

unique(presidential$n)

unique()함수는 입력 벡터에서 입력에 나타나는 순서대로 고유 값을 포함하는 벡터를 반환합니다. presidential와 데이터 세트 배송 ggplot2패키지 (27). (고정 해 주신 Jemus42에게 감사드립니다!) 설명 :

각 대통령의 이름, 임기 시작 및 종료 날짜, 아이젠 하워에서 부시 W까지 10 명의 미국 대통령 파티.

presidential는 데이터 프레임이며 데이터 프레임에는 목록에 항목이 포함 된 것처럼 열이 포함됩니다. 열은 이름을 사용하여 이름으로 참조됩니다 $. 이 특정 데이터 집합에는 name대통령 이름이 포함 된이라는 열이 있습니다. 그러나 잠시만 기다려 n주십시오! 실제로 이것은 부분 일치 (13, 16)의 또 다른 예이므로 n완전히 합법적입니다.

이를 제출하면 흥미로운 결과가 나타납니다.

[1] "Eisenhower"  "Kennedy"  "Johson"   "Nixon"  "Ford"  "Carter"
[7] "Reagan"      "Bush"     "Clinton"

Lyndon B. Johnson의 이름의 철자가 어떻게되는지보세요. ​​죄송합니다.

(참고 :이 게시물을 게시 한 후 1 년이 지나서 Johnson 오타가 수정되었습니다. RIP 유머가 제게 주목되었습니다.)


길이 21 :

integrate(dexp,0,Inf)

R에는 유한 또는 무한 간격에 걸쳐 단일 변수의 함수의 직교 함수를위한 내장 함수가 있습니다. R에서 무한대는 Inf+ 무한대와 -Inf- 무한대로 지정됩니다 . 이 dexp()함수는 지수 분포에 대한 확률 분포 함수입니다. 지수 분포의 지원은 [0, + 무한)이고 확률 분포는 1에 통합되므로 결과는 1이 될 것으로 예상됩니다. 보라, 예상 결과!

1 with absolute error < 5.7e-05

길이 20 :

deriv(~cos(x^3),"x")

R은 상징적 파생물을 할 수 있습니다! 이것은 다음을 반환합니다.

expression({
    .expr1 <- x^3
    .value <- cos(.expr1)
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- -(sin(.expr1) * (3 * x^2))
    attr(.value, "gradient") <- .grad
    .value
})

이를 통해 함수를 구문 분석하고 체인 규칙을 사용하는 방법을 볼 수 있습니다. 첫해 미적분을 취한 기능이 할 수있는 모든 것! deriv()함수에 대한 첫 번째 인수 는 일부 변수 측면에서 R 표현식 (실제 R 유형)입니다 x. 두 번째 인수는 여기에서 미분이 취해지는 변수의 이름입니다 "x".

정말 깔끔한 것을보고 싶습니까? 위의 변수에 변수를 지정하십시오 (예 :) dx. 변수 x를 숫자 형 벡터로 정의하십시오 . 그런 다음 제출하십시오 eval(dx). R은 미분을 x! 에서 평가합니다 .


길이 19 :

c(matrix(1,3,3),"a")

R에서는 c() "combine"또는 "concatenate"의 약자 인 인수에서 벡터를 만듭니다. 벡터의 요소는 같은 유형이어야하고 모두 길이가 1이어야합니다. 그러나 R에 대해 화를내는 대신 R은 구조를 가진 요소 (이 경우에는 행렬)를 평평하게하고 모든 것을 같은 유형으로 캐스트합니다.

인수가 c()단일 유형 만 포함하는 경우 유형 변환이 발생하지 않습니다. 예를 들어 모든 인수가 논리 ( TRUEFALSE) 인 경우 벡터는 모두 논리입니다. 논리와 숫자를 포함하면 모두 숫자가됩니다. 캐릭터와 무엇이든 포함하면 모든 캐릭터가됩니다. 그래서 우리의 스 니펫은 우리에게 이것을 제공합니다 :

> c(matrix(1,3,3),"a")
[1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "a"

3 x 3 행렬이 평평 해지고 "a"를 추가하면 모든 것이 문자로 만들어졌습니다.


길이 18 :

(1-1/3-1/3-1/3)==0

기계 정밀도에 대한 교훈. 이 반환합니다 FALSE.


길이 17 :

example(readline)

example()함수는 내장 함수를 사용하는 방법의 예를 제공합니다. 을 사용하는 방법을 알아야 할 경우 readline()R은 당신에게 잘 맞는 답을 가지고 있습니다.

> example(readline)

readln> fun <- function() {
readln+   ANSWER <- readline("Are you a satisfied R user? ")
readln+   ## a better version would check the answer less cursorily, and
readln+   ## perhaps re-prompt
readln+   if (substr(ANSWER, 1, 1) == "n")
readln+     cat("This is impossible.  YOU LIED!\n")
readln+   else
readln+     cat("I knew it.\n")
readln+ }

readln> if(interactive()) fun()
Are you a satisfied R user?

겸손한 길, R.


길이 16 :

acf(lh,t="part")

acf()함수는 시계열에 대한 자기 상관 함수를 반환합니다. lhR과 함께 제공되는 데이터 세트입니다.

인간 암컷 48 개 샘플에서 10 분 간격으로 혈액 샘플에 황체 형성 호르몬을 제공하는 규칙적인 시계열.

이 예제에서 부분 일치는 두 번 사용 됩니다 . 한 번은 함수 매개 변수와 한 번, 문자열 값이 매개 변수에 전달되었습니다. 전체 매개 변수의 이름입니다 type및 인식 된 값은 "correlation", "covariance"하고 "partial". 문자열을 고유하게 식별하기에 충분한 문자열 만 제공해야하므로 "part"for 를 사용할 수 있습니다 "partial". 이는 부분 자기 상관 함수 (PACF)를 제공합니다.

여기에 이미지 설명을 입력하십시오


길이 15 :

p3d(bunny,p=99)

다시 우리는 악명 높은 토끼 (11)를 봅니다. onion패키지는 우리에게 3D 플로팅 기능을 사용하여, 지금까지 가장 유용한 데이터 집합을 볼 수있는 경우에도 더 좋은 방법을 제공합니다 p3d(). persp()백그라운드에서 기본 그래픽 함수 를 호출 하며 회전 인수를 사용 phi합니다. 매개 변수 이름 (13)의 부분 일치를 사용하여 p=대신에 지정할 수 있습니다 phi=.

여기에 이미지 설명을 입력하십시오


길이 14 :

stats:::rgamma

R은 오픈 소스이지만 소스 코드를보기 위해 마법사 일 필요는 없습니다. 패키지 이름과 코드를 보려는 함수를 세 개의 콜론 ( :::) 으로 구분하여 입력하면됩니다 . 이것은 rgamma()함수 를 정의하는 코드를 제공 하며, 감마 분포에서 임의의 편차를 생성합니다. 이것을 제출하면 다음이 제공됩니다.

function (n, shape, rate = 1, scale = 1/rate)
{
    if (!missing(rate) && !missing(scale)) {
        if (abs(rate * scale - 1) < 1e-15)
            warning("specify 'rate' or 'scale' but not both")
        else stop("specify 'rate' or 'scale' but not both")
    }
    .External(C_rgamma, n, shape, scale)
}
<bytecode: 0x00000000098cd168>
<environment: namespace:stats>

함수를 사용합니다 .External(). 이것은 다른 언어, 일반적으로 C와 포트란, 위치 R.의 기초의 많은 구성하는 언어로 작성된 함수를 호출 하는 마법의 조금 걸립니까 소스 코드를. 편집 : @Vlo는 단순한 인간이 실제로 호출 C 코드를 기본 볼 수 있다고 지적 .Internal()하고 .Primitive()사용하여 pryr패키지를. 감사합니다, @Vlo!


길이 13 :

sample(9,s=4)

이것은별로 보이지 않지만 R의 강력한 개념 인 함수 매개 변수의 부분 일치를 보여 줍니다. 의 명명 된 매개 변수 sample()기능은 size, replace그리고 prob,하지만 당신은 단지 고유하게 식별하기 위해 명명 된 매개 변수의 충분한 문자를 제공해야합니다. 따라서 다른 매개 변수 이름이 문자 "s"로 시작하지 않기 때문에 대신에 sample()사용할 수 있습니다 . 이 코드는 정수 1에서 9 사이의 크기 4의 임의 샘플을 선택합니다.s=size=


길이 12 :

LETTERS[-pi]

LETTERS알파벳순으로 정렬 된 모든 대문자 영어 문자를 포함 하는 내장 벡터 가 있습니다. 다른 많은 언어와 달리 부동 소수점 숫자를 사용하여 벡터를 색인 할 수 있습니다. 너무 흥미로운 일은 없습니다. R은 정수 부분 만 취합니다. -벡터의 선행 색인을 사용하면 해당 색인이있는 요소가 벡터에서 제거됩니다. pi불합리한 숫자 π를 포함하는 내장 상수입니다. 따라서 벡터에서 요소 3을 제거하고 "C"를 생략하고 "Z"를 통해 "A"를 반환합니다.


길이 11 :

plot(bunny)

에서 onion패키지라는 데이터 세트가있다 bunny. 플로팅하면 가장 유용한 그래픽이 무엇인지 알 수 있습니다.

여기에 이미지 설명을 입력하십시오


길이 10 :

????sample

sample()함수 에 대해 정말로 혼란스러워 하고 절실히 도움이 필요 하다고 가정 해보십시오 . 평소 ?sample에 R 매뉴얼 페이지를 끌어 올리는 대신 네 개의 물음표를 내 보냅니다. R은 당신의 곤경을 듣고 도와 주려고 노력합니다 ...

Contacting Delphi...the oracle is unavailable.
We apologize for any inconvenience.

아아.


길이 9 :

isTRUE(1)

처음에는 나머지 R 기본 패키지의 규칙을 무시 is하고 함수 이름에서 다음 단어를 a로 구분 .합니다. 그러나 이는 아래 (8)과 같이 인수가 특정 유형인지의 논리적 테스트에만 적용됩니다. 이 경우 TRUE유형이 아닌 인지 테스트 하고 있습니다. 이것은 엄격한 정의를 사용합니다 TRUE. 즉 1은 일반적인 의미에서 "참"이 아닙니다. isTRUE(1)을 반환합니다 FALSE.


길이 8 :

is.na(8)

대부분의 다른 프로그래밍 언어와 달리 .함수 및 변수 이름에 유효한 문자입니다. 어떤 종류의 방법이나 계층 구조도 나타내지 않습니다. 이름의 일부일뿐입니다. is.na()함수는 인수가 평가 여부를 확인 NA(실종) 반환 TRUE또는 FALSE.


길이 7 :

stop(7)

입력에 오류 메시지로 오류가 발생합니다. 함수 내에서 호출되면 함수 실행이 중지됩니다. 그러나 함수 외부에서 호출해도 스크립트가 중지되지 않습니다. 이 경우 출력은 Error: 7입니다.


길이 6 :

x < -1

이것은 사소한 것처럼 보이지만 할당 연산자에 대한 주요 비판 <-, 즉 공간의 배치에 따라 의미가 변경됩니다. 언급했듯이 x <- 11을에 할당합니다 x. 위와 같이 단일 공간을 분리 <하고 -1보다 작은 -지 여부에 대한 논리적 테스트로 변경합니다 x. 이런 이유로 많은 사람들 =이 과제를 선호 합니다.


길이 5 :

x<<-1

<-예외 와 유사하게 <<-현재 범위에 관계없이 항상 변수를 전역 범위에 할당합니다.


길이 4 :

x<-1

R은 <-현재 범위에서 변수를 할당 하는 데 사용 합니다. 이 스 니펫은 값 1을에 할당합니다 x.


길이 3 :

!0i

!연산자 "가 아닌"의 R을이고 0i복소수 인 0+0i복소 평면에서, AKA 0. 이 명령문을 제출하면 TRUE0이 false이므로 리턴 됩니다.


길이 2 :

NA

이렇게 NA하면 누락 된 값을 나타내는 "사용할 수 없음"을 나타내는 특수 R 값이 반환 됩니다.


길이 1 :

T

이 반환합니다 TRUE. R에서 TF부울 값 동의어 TRUEFALSE각각이.


예이 R "!"(T)!
Vlo

@Vlo :로 "!"(T)평가됩니다 FALSE. 그러나 "Yay R"이라는 문구는 결코 허위가 아닙니다. ;)
Alex A.

더 많은 항목에 대해 더 많은 투표를하려면 어떻게해야합니까 ???? "소스 코드를 찾는 데 약간의 마법사가 필요하다"는 .Internal.Primitivepryr::show_c_source(.Primitive("sum"))
간결

@ Vlo : 나는 pryr패키지에 대해 듣지 못했습니다 . 아주 멋지다! 지적 해 주셔서 감사합니다. 지원해 주셔서 감사합니다. 응모 해 주셔서 감사합니다. :)
Alex A.

2
@ Jemus42 아, data(bunny)먼저 해야 할 것 같습니다 .
Alex A.

75

Brainfuck

사실 : Brainfuck (brainf * ck라고도 함)는 Urban Müller가 만든 가장 작은 튜링 완료 언어 인터프리터를 만들기위한 실험적인 난해한 언어로 현재 가장 유명한 언어입니다. 명령은 8 개 뿐이며 배우기 쉽지만 사용하기는 어렵습니다.

Brainf * ck는 30000 개의 셀이있는 테이프베이스 메모리와 이동 가능한 포인터를 가지고 있으며 다음과 같이 시각화 할 수 있습니다.

0 0 0 0 0 0
    ^

와 더불어 ^ 포인터를 나타내는 문자와 0의 각 셀의 값을 나타내는.

Brainfuck에는 8 가지 지침이 있습니다.

Instruction  C Equivalent              Description
+            mem[ptr]++;               Add one to the value under the cell
-            mem[ptr]--;               Subtract one from the value under the cell
>            ptr++;                    Go on cell to the right
<            ptr--;                    Go on cell to the left
,            mem[ptr] = getchar();     Read a ASCII character from input and put the result in the value under the cell
.            putchar(mem[ptr]);        Write a ASCII character to the output using the value under the cell
[            while (mem[ptr]) {        Start a while loop: Continue to matching ']' when value under the cell is 0
]            }                         End a while loop: Go back to matching '[' when value under the cell is NOT 0

Brainfuck to C :

#include <stdlib.h>

int main(void) {
    unsigned char* mem = calloc(30000, sizeof(unsigned char));
    unsigned int ptr = 0;

    // Put your brainfuck code here, converted to the matching expressions under "C equivalent"

    return 0;
}

길이 1 스 니펫

한 문자를 읽고 현재 셀에 넣으십시오.

,

(입력과 : 메모리 abc)

0 0 97 0 0 0
    ^

길이 2 스 니펫

현재 셀에 하나를 추가하고 포인터를 오른쪽으로 이동하십시오.

+>

기억

0 0 1 0 0 0
      ^

길이 3 스 니펫

현재 셀에서 0이 될 때까지 제거하십시오. 현재 셀을 0으로 설정

[-]

가능한 메모리 :

메모리 : (전)

0 0 100 0 0 0
    ^

메모리 : (후)

0 0 0 0 0 0
    ^

길이 4 스 니펫

주석 : brainfuck에서는 명령이 아닌 모든 것이 무시됩니다. 이러한 이유로 다음 프로그램은 완전히 유효하지만 비어있는 brainfuck 프로그램입니다.

Hey!

길이 5 스 니펫

간단한 고양이 프로그램 (입력을 출력으로 쓰기)

,[.,]

그의 의견에 대한 tomsmede 감사

길이 6 스 니펫

현재 셀의 값을 셀의 오른쪽으로 이동하십시오 (오른쪽의 셀이 0이라고 가정하면 그렇지 않으면 현재 셀의 값이 오른쪽의 셀 값에 추가됨).

[>+<-]

일반적으로 사람들은 변수를 이동하기 위해이 코드를 사용합니다.

메모리 : (전)

10 0 100 0 0 0
     ^

메모리 : (후)

10 0 0 100 0 0
     ^

길이 25 스 니펫

6 개의 문자 입력을 뒤집어 인쇄 한 다음 모든 ASCII 문자 (N-1) .. 1 (여기서 N은 첫 번째 입력 문자의 값)이 뒤 따릅니다.

,>,>,>,>,>,.<.<.<.<.<[.-]

길이 53 스 니펫

main(){i=0;j=0;if(i>=0){if(j<=i)i+=1;i-=1;}return 0;}

이 축소 된 C 프로그램은 또한 위장 된 Brainfuck 프로그램이며 그 반대도 마찬가지입니다! 사실, 그들은 (거의) 같은 일을합니다. 다음은 "코멘트"(C 코드)가없는 Brainfuck 코드입니다.

><+-

Brainfuck 코드 (및 C 코드)를 설명하겠습니다. 보시다시피, 두 개의 셀 ( ij)을 사용합니다. 첫 번째 셀을 증가시킵니다 i(1 씩 증가 ). 그런 다음 동일한 셀을 감소시킵니다 i(1 씩 감소 ).

이것은 두 개의 다른 언어로 컴파일되고 (실제적으로) 동일하게 실행될 수있는 일부 소스 코드의 어리석은 예입니다.


2
,[.,]- 5 자, 고양이 프로그램
tomsmeding

13
이것은 내가 본 것 중 최고의 "Brainfuck 101"일지도 모른다.
hoosierEE

길이 6 : 합을 오른쪽 셀에 넣고 왼쪽을 0으로 만듭니다. 움직이지 않습니까?
Filip Haglund

개념을 더 잘 설명하기 위해 길이 6에 더미 변수를 추가했습니다. 이 프로그램은 실제로 셀 # 3을 셀 # 4에 추가하고 셀 # 3 0을
만듭니다.

58 표-업데이트 할 수 있습니까? :)
Conor O'Brien

65

C ++

전 처리기, 템플릿, 람다, 유형 특성 및 그 누구도 전체적으로 이해하기를 기대할 수없는 수많은 다른 복잡한 기능을 통해 C ++는 새로운 표준의 각 세대에 의해 재발견됩니다. 컴파일 타임에 작업을 수행하는 수많은 방법을 활용함으로써 컴파일 타임에 사운드를 확인하기 위해 물리적 단위를 숫자 데이터 유형에 첨부 할 수있는 라이브러리와 같은 오버 헤드 추상화를 작성할 수 있습니다 (예 : kg* 의 결과 mN)

길이 1

#

일반적으로 전 처리기 설명을 소개합니다. # 자체적으로 한 줄에 서있을 수 있습니다. 그것은 본질적으로 아무것도 의미하지 않으며 내가 알지 못하는 대부분의 구문 강조 표시자가 알지 못하는 것 같습니다.

길이 2

%:

물론 모든 사람이 #열쇠를 가지고있는 것은 아니므로 C ++ 은이 대체 토큰 (일명 digraph ) 으로 작성할 수 있도록 관대합니다 (고대 C에서 상속 받음 )

길이 3

??=

이것은 C ++에 대한 역사적 과정입니다. 구현이이를 지원할 수 있지만 요즘은 더 이상 유효하지 않을 수도 있지만, 그래프입니다. 이 시퀀스는이 #를 지원하는 시스템에서 변환 되지만 원시 문자열 리터럴을 방해하지 않기 위해 시스템 내에서 허용되지 않습니다. 구현은 모두 지원을 중단하기로 선택할 수 있습니다.

길이 4

auto

일반 코드로 쉽게 작업 할 수 있도록하는 최신 (C ++ 11부터) 발명품 중 하나입니다. 그것은 표현식의 타입을 추론하기위한 것이며, C ++ 14부터는 람다 파라미터와 함수의 리턴 타입을 추론하는데 사용될 수 있습니다.

길이 5

 catch

C ++로 제공되는 다른 많은 언어에서도 알려진 키워드이지만 훌륭한 관용적 C ++ 프로그래머는 거의 사용하지 않습니다. 관용적 C ++은 생성자와 소멸자와 함께 RAII (Resource Acquisition is Initialization)라는 널리 사용되는 원칙을 사용하거나 SBRM (Scope Bound Resource Management)이라고하는 경우가 있습니다. 스마트 포인터와 같은 클래스로 인해 동적으로 할당 된 리소스 (메모리뿐만 아니라!)의 수명을 다른 객체에 묶을 수 있습니다. 해당 범위를 벗어나면 (예 : 예외 발생) 이러한 개체가 자동으로 리소스를 정리합니다. 이를 통해 예외가 필요하지 않은 안전하고 사용하기 쉬운 코드가 허용됩니다 catch.

길이 6

[](){}

[]{}()

스테판이 주석에서 언급했듯이 []{}가장 짧은 람다 객체로 사용할 수 있으므로 람다를 호출 하는 가장 짧은 형식 입니다. 다음 텍스트는 이전 버전 용입니다.

아마도 가장 짧은 형태의 람다 일 것입니다. C ++의 람다는 (구문이 제어하는) 범위에서 생성 된 범위의 일부를 캡처 할 수 있고 ([구문이 제어하는) 구문) 구현 가능한 유형의 객체입니다. 코드 ({} 부분)는 마치 해당 범위 내에있는 것처럼 이러한 변수에 액세스 할 수 있습니다. C ++ 14에 도입 된 선택적 반환 유형 공제 및 자동 매개 변수 공제를 통해 호출 가능한 것으로 예상되는 모든 표준 라이브러리 알고리즘 (예 : 세 번째 std :: sort 매개 변수)에 사용할 수 있는 도구입니다.

길이 7

virtual

C ++에서 객체 지향 프로그래밍의 기본 블록 중 하나 인 런타임 다형성을 사용하기 시작하는 키워드입니다. 다른 언어에서는 모든 기능이 기본적으로 가상 인 반면 "사용하지 않는 것에 대해서는 비용을 지불하지 마십시오"원칙을 따릅니다. 다중 패러다임 언어이기 때문에 "C ++는 객체 지향적"이라고 생각하는 사람들이이 키워드를 거의 사용하지 않는 프로그램이나 라이브러리를 보는 것은 놀라운 일입니다. 예를 들어 일반적인 프로그래밍 원칙을 따르기 때문입니다.

길이 8

override

virtual 키워드와 함께 override사용하면 컴파일러에서 더 많은 작업을 수행 할 수 있도록하기 위해 C ++에 추가 된 추가 기능 중 하나입니다. 이를 사용하면 기본 클래스에서 가상 함수를 재정의하려는 의도를 표현할 수 있으며 실수를 한 클래스에 지정된 함수가 없으면 컴파일러에서 오류가 발생합니다. 일반적으로 코드가 약간의 바이올린보다는 의도를 표현하면 좋은 스타일로 간주됩니다.

길이 9

constexpr

또한 C ++에 나중에 추가 constexpr되므로 프로그래머는 함수 나 변수를 컴파일 타임에 알려지고 컴파일 타임에 계산할 수있는 함수 나 변수를 표현할 수 있습니다. 따라서 컴파일 타임 표현식이 필요한 상황 (예 : 템플릿 매개 변수 또는 배열 크기)에서 이러한 함수를 사용할 수 있습니다. 많은 표준 라이브러리 함수 (가능한 경우)는 이미 constexpr이므로 여기서 사용할 수 있습니다.

길이 10

for(i:c){}

컨테이너 또는 반복자 를 지원 std::begin하고 std::end얻는 반복자 (C 스타일 배열 포함) 와 같은 컨테이너와 같은 완전한 루프 입니다. 기본적으로와 같습니다 for(auto __i = std::begin(c); __i != std::end(c); ++__i){ auto& i = *__i; }. 이를 통해 일반 코드에서 쉽게 루핑 할 수 있습니다.

길이 11

void f()&&;

호출 할 수있는 객체의 멤버 함수 및 속성을 선언하는 새로운 방법입니다. 이전 버전의 C ++에서는 void f() const;const 객체에서 함수를 호출 할 수 있도록 컴파일러에 지시 할 수있는 기능 만있었습니다 (따라서 const가 없으면 const가 아닌 객체에서는 호출 할 수 없습니다). &&rvalue에 대한 함수를 호출 할 수 있도록 r-value 참조에 대한 구문을 사용하는 것과 같은 방식 입니다.

길이 12

int main(){}

이것은 아마도 링크를 컴파일하고 실행할 수있는 가장 짧은 완전한 프로그램 일 것입니다. 아무것도하지 않고 0을 반환합니다.이 반환은 C ++에서 발생할 수있는 많은 특수한 경우 중 하나입니다. 일반적으로 아무것도 반환하지 않는 것은 정의되지 않은 동작이지만 진입 점 함수 main의 경우 아무것도 반환하지 않으면 0을 반환한다는 의미입니다.

길이 13

auto f()->int

함수의 반환 유형을 선언하는 다소 새로운 방법입니다. 일반적으로 유형을 이미 알고 있으면이 작업을 수행하지 않지만 일반 프로그래밍에는 유형이 템플릿 매개 변수 및 사용하는 변수에 따라 달라지는 상황이 많이 있습니다. 이 방법을 사용하면 template<class T> auto f( const T& t ) -> decltype(t.foo())대신에 이러한 매개 변수에보다 쉽게 ​​액세스 할 수 있습니다.template<class T> decltype(std::declval<T>().foo()) g( const T& t ) { return t.foo(); }


2
나는 ;전 처리기 매크로가 아니며 C ++로 1 문자 문장을 가질 수 있다는 사실 때문에 당황 스럽습니다.
Joe Z.

1
[](){}가장 짧은 람다 형식이 아닙니다. 매개 변수 목록이 비어 있으므로 생략 할 수 있습니다. 따라서 []{}가장 짧은 람다입니다. 사소하게, []{}()람다의 가장 짧은 실행입니다 ;-) ideone.com/k8fAvs
stefan

@ stefan : 실제로, 나는 그것이 그때처럼 기능하지 않기 때문에 항상 그것을 잊어 버린다.;) 나는 그것을 대답에 추가했다.
PlasmaHH

@PlasmaHH 실제로 함수처럼 보이지 않기 때문에 나는 그것을 절대적으로 싫어한다 .. ;-)
stefan

59

정규식

길이 2 스 니펫

[]

JavaScript : 일치하지 않는 빈 문자 클래스

PCRE , Java , Pythonre , Ruby (버전 2.0에서 테스트) : 구문 오류.

길이 1 스 니펫

.

., dot-all이라고 불리는 것은 내가 볼 수있는 모든 맛에서 사용할 수 있습니다.

무엇이 일치합니까?

i gn͟ g̨͜e҉̡͞n̵͢e͜͝r̷͝a͘l̢҉, ̡͟ ̕̕ ̴.̸̴̢̛́ ̸̡̢m͞ąt̴̨c͞h̛e͢͡s̶͘ ͘a҉n̛͜͠ỳ̸ ͢c̵̡hár͘͝a̕͢ćt͘͠e͏̀͠r̷̀ ̴̕͢ex͝n̴͢͝

JavaPattern : 기본 모드에서 dot-all은이 5 개의 코드 포인트를 제외한 모든 코드 포인트와 일치합니다 \r\n\u0085\u2028\u2029. 로 UNIX_LINES모드에 (그러나없이 DOTALL), 점 - 모두를 제외하고는 코드 포인트를 일치합니다 \n. DOTALL모드가 켜져 있으면 dot-all은 모든 코드 포인트와 일치합니다. Java 5부터는 Pattern코드 포인트 에서 작동하므로 아스트랄 문자는 dot-all과 일치합니다.

Pythonre (2.7.8 및 3.2.5에서 테스트되었으며 3.3+에서는 다를 수 있음) : 기본 모드에서 dot-all은을 제외한 모든 UTF-16 코드 단위 (0000 ~ FFFF 포함)와 일치합니다 \n. re.DOTALL예외를 해제하고 .모든 UTF-16 코드 단위와 일치시킵니다. 이 버전에서는 reUTF-16 코드 단위로 작동하므로 .아스트랄 평면에서 하나의 코드 단위 문자 만 일치하도록 관리합니다.

.NET : Python과 동일합니다. .NET의 모든 모드를이라고 Singleline합니다.

JavaScript (C ++ 11 <regex>) : 기본 모드에서 dot-all은 이러한 4 개의 코드 포인트를 제외하고 모든 UTF-16 코드 단위와 일치합니다 \n\r\u2028\u2029. s플래그가 켜져 있으면 dot-all은 모든 UTF-16 코드 단위와 일치합니다. JavaScript는 UTF-16 코드 단위에서도 작동합니다.

PCRE : 빌드 옵션에 따라 dot-all은 \r, \n또는 \r\n, 또는 3 개의 모든 CR LF 시퀀스 또는 기본 모드의 모든 유니 코드 개행 시퀀스를 제외 할 수 있습니다 . 기본 모드에서 엔진은 코드 단위 (8, 16 또는 32 비트 코드 단위)에서 작동하므로 dot-all은 개행 시퀀스를 제외한 모든 코드 단위와 일치합니다. UTF 모드에서 엔진은 코드 포인트에서 작동하므로 dot-all은 개행 시퀀스를 제외한 모든 코드 포인트와 일치합니다. 모든 모드를이라고 PCRE_DOTALL합니다.

PHP (ideone에서 테스트) : UTF-8 라이브러리로 컴파일 된 PCRE이며 \n기본적으로 유일한 줄 바꿈 순서입니다. Dot-all 모드는 s플래그 를 통해 액세스 할 수 있습니다 .

Postgres : 기본 모드에서 dot-all은 예외없이 모든 코드 포인트와 일치합니다.

Ruby (버전 2.0.0에서 테스트) : 기본 모드에서을 .제외한 모든 코드 포인트와 일치합니다 \n. Dot-all 모드는 m플래그 (!) 를 통해 액세스 할 수 있습니다 .

s 플래그는 Ruby에서 Windows-31J 인코딩을 나타내는 데 사용됩니다.


팩 토이 드

Ŗ͞e̡͟҉ǵ͟͢e̴̢͘͡x̡́͞ ̛̀҉҉̢c҉̷̨a̸̛͞n҉̛͠ ̷̸̀p̴͠͡҉̵ą̧͜͢r̸̸̷̢͝s̢̀͡e̷̷̷͘͞ ̨̧̀H̨̧͜͜T̷͞M̷̛͜L͢.̴̡́ 저를 반복하십시오. R̶̶̢̧̰̞̻̮̳̦̥ͭͯ̓̈ͯͤ̇͊͊͟ĕ̹̩̪͈͈͍̗͎̝͚̽̈ͨ̐̽ͪͮ̍͐ͮͧ̔̏̓ͣĝ̵̢̢̖̤̜̭͔͊͒ͦ͛ͤ͗ͬͧͪ̾͘͟eͦ̄ͭ̑̾҉̨̨̝̬̹̘̭͔͟͢x̣̻͓̠͈͕̥̜͚̝̫͚̳̾̍ͦ̑̈̋̌̉͊ͮ͗̄̆̒̚̚ ̸̦͈̥̬̺͇ͧͧ͐ͮ̌ͤ̈̒̆ͣ̈̏̔͊̐ç̨̬̪̳̦͎̖͕̦͔ͨ̿̓̈ȁ̸̳̺̠̭ͮ̓̐͘̕͜͡ņ̨̫͔͍̬̤̘͎͚̣̟̦͍̜ͭͭ̈ͦ̈̽͗ͥ̑͝͡ 구문 분석 ͉̭̫̰͔̝͓̼̮͚̻͎͎͉̐͗͗͊̇ͣ͒͗͑̆͐̐ͬ͛ͮ͝H̢̥͕̼͓̫͙̺̼̮ͣͦ̍ͨ͒̔̌T̪̦̻̦͖̞̤͒̑ͭ̐̑ͭͣ͐̒̉͊͜͜M̞̪͇͕̩͉͗ͧ̌ͯ͋̉̍ͭ̓̇̐̌͜͠Ĺ̷̨̳̘̯͚͓͛͌ͭ̉̍.ͯ͆̊ ͯ̇̓̏͐ͪ̋̈͑̕҉̷̠̰̼̤


35
사실에 대한 언급을 얻지 못한 사람에게는 기분이 좋지 않습니다.
Robobenklein

6
@robobenklein 나는 당신의 고통에 대한 비밀 약을 알고 있습니다 : 그냥 우리를 계몽하십시오!
flawr

24
@flawr 유명한 질문을 모르는 사람들을 위해 : stackoverflow.com/questions/1732348/ 의 첫 번째 대답 은 당신이 찾고있는 것입니다.
Robobenklein 2016 년

1
잘고의 글을 읽을 수는 있지만 양방향으로 너무 진지하게 받아들이지 마십시오. 잘고의 길을 맹목적으로 따르는 것은 명백한 잘못이지만, 잘고 본문은 항상 틀린 것은 아닙니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

12
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, HTML을 구문 분석하는 방법을 보여주기 위해 모든 투표를 사용하지 않습니까?
mbomb007

57

제이

PS : 스 니펫이 tryJ.tk에 연결되어 J를 설치하지 않고도 브라우저에서 JavaScript로 실행되는 코드를 재생할 수 있습니다.

PPS : 주문을 교체했습니다. 이는 참여하는 사람들과 나중에 참조 할 때 더 의미가 있습니다.

PPS : 시간 제약 때문에 하루에 한 발췌 문장을 추가 할 것입니다.

사실 :

J 는 재미있는 캐릭터 세트를 뺀 APL의 자손입니다 ( 가족 역사는 여기 참조 ).

길이 1 스 니펫

_

J는 숫자 리터럴 (동사와 반대)에 첨부 될 때 무한대와 음의 표시 자로_ 모두 사용 합니다 .-

길이 2 스 니펫

a.

a.모든 1 바이트 문자를 포함하는 Alphabet 이라고 합니다. 이러한 J에는 atoi알파벳 과 같은 간단한 조회이므로 다음 과 같은 함수가 포함되어 있지 않습니다 .a. i. 'z' =122

길이 3 스 니펫

i.9

i.모나드 방식으로 사용되는 정수 (즉, 일반적으로 y라고하는 하나의 인수)입니다. dyadically 사용될 때 위의 예와 같이의 인덱스 역할을 합니다.

길이 4 스 니펫

!!6x

J는 임의의 정밀 정수 및 유리수를 지원 합니다 . 이는 계승 6의 계승 (1747 자리 숫자)을 계산합니다.

길이 5 스 니펫

^.^:_ 

조밀 한 것 ... 첫째, 동사 (J 함수 호출)는 테마별로 구성됩니다. 모든 동사는 지수에 연결됩니다. ^위한 지수 (그리고 exp, monadically 사용되는 경우 ^.에 대한 대수 . ^:특별한 하나의 인 파워 함수를 여러 번 적용 함 (고차 함수), 오른쪽 인수가 무한대 (경우. _) 그것은을 (그것의 왼쪽 인자를 실행 예 ^.) 자체 출력에 수렴 될 때까지 실제로 ^.^:_x = ln(x)1 이외의 인수에 적용 할 때 동사가 해결 되어 수율을 나타 0.318132j1.33724냅니다.

길이 6 스 니펫

^0j1p1

또는 동등하게

^o.0j1

오일러의 정체성 위에서 언급 한 바와 같이 J.에서이 ^입니다 exp(). 임의의 정밀한 정수 및 유리수와는 별도로, 파이의 복소수와 복소수, 그리고 리터럴로서의 조합을 지원합니다. 0j1p1의미 (0 + j) * pi ^ 1합니다.

길이 7 스 니펫

+/&.:*:

벡터의 2 노름을 취하는 동사. 이것은 두 가지를 보여줍니다.

  • 삽입 부사는 추가 동사집니다 +인수의 각 요소 사이에 삽입하여 합계로한다. 따라서 (0+1+2+3) = +/ i.4.

  • 연계 미만 으로 사용하는 경우는 v &.: u y동일하다 vi u v y, 여기서, vi는 IS 앞면 (일반적으로 반대).

예, J는 기능 역수에 대해 알고 있습니다. 이것들을 결합하면 스 니펫의 동사가 예를 들어 %: @: (+/) @: *:, 또는 sqrt(sum(y.^2))Matlab 과 동일 합니다.

길이 8 스 니펫

$#:I.@:,

포크 인자에 대한 참조없이 3 명 동사 구성된다. 이를 통해 J에서 무의미한 (point-free) 프로그래밍 이라고 할 수 있습니다 . f g hmonadic 경우 (이 예에서와 같이) 포크 는와 같습니다 (f y) g (h y). 포크로서 다차원 배열은 J의 본질적인 부분입니다. "인덱스" 는 벡터에있는 인덱스를 반환하지만 더 높은 차원으로 확장되지는 않습니다. 이 예에서는 사용 형태 , AntibaseI.@:,인스턴스 고차원 배열 I.를 구현 포크와 타인을 3 :

 ($#:I.@:,) 5 = i. 5 5 NB. indices of 5 in i. 5 5

길이 9 스 니펫

<"1 i.4 6 

박스형 배열은 J의 데이터 유형으로, 이기종 컨텐츠 (유형 및 크기 모두)를 하나의 값으로 결합 할 수 있습니다. 모나 딕 < 박스 는 논쟁의 여지가 있습니다. 순위는 J의 중심 개념이며 동사를 더 높은 차원의 배열로 자동 확장 할 수 있습니다. 명사와 동사 모두 순위가 있습니다.

명사 순위 는 동사 $@$가 알려줄 수 있는 모든 명사의 차원 수입니다 . 예를 들어 i. 2 3 4순위 3의 배열이 있습니다.

동사 순위 는 동사가 적용되는 순위 입니다. 모든 동사에는 기본 조합 으로 쿼리 할 수있는 고유 한 순위가 있습니다 . v b. 0동사 v의 monadic, dyadic left 및 dyadic right rank에 대해 3 개의 숫자를 반환합니다.

동사는 동사 순위와 같은 순위의 명사 셀에서 작동하며 명사 rank-verb rank프레임의 결과를 대체합니다 . 동사의 순위는 순위 결합을 사용하여 제한 될 수 있습니다. 여기 에서처럼 순위 _에서 작업하는 대신 순위 1 셀 (행)을 복싱합니다. 전체 배열을 권투. 순위에 대한 자세한 내용은 여기를 참조하십시오 .

길이 10 스 니펫

<./ .+~^:_

이 스 니펫은 가중치가있는 digraph 에서 최단 경로 를 계산하는 동사 입니다. 최소 ( <./)와 도트 연결을 소개 합니다. 도트 조인트는 행렬 곱의 일반화로로 쓸 수 있습니다 +/ . *. 일반적으로 lv가 동사 v의 왼쪽 순위 인 경우 u . v와 동일합니다 u@(v"(1+lv,_)). 또는 "u는"왼쪽 인수 셀 "및 오른쪽 toto의 목록에있는 v의 결과에 적용됩니다." (순위는 위 참조)

따라서 내부 동사 <./ .+~는 항목 을 모든 k y(i,j)의 최소값으로 대체합니다 y(i,k)+y(k,j).

^:_ 수렴 할 때까지이 단계를 반복합니다.

원본과 최단 경로 거리를 표시하는 예 :

(]; <./ .+~^:_ ) wtm=: _6]\0 2 5 _ _ _ _ 0 4 1 3 _ _ _ 0 _ _2 _ _ _ 4 0 _ 5 _ _ _ _1 0 6 _ _ _ _ _ 0

길이 11 스 니펫

<.@o.10x^99

이 코드는 다음과 같은 특수 코드를 소개 합니다 . 일부 J 코드는 특정 사용 사례를 위해 특별히 작성되고 구문 분석시 인식되며 최적화 된 코드로 지원됩니다. 더 높은 정확도 (여기서와 같이) 또는 더 높은 성능 ( 특별 조합 참조 )

이 문구는 99 자리의 pi를 제공합니다 (소수점은 99 자리로 이동되었지만). 특수 코드는 정확한 문구에 따라 달라지며 일반적으로 스 니펫 코드만큼 정확하지는 않습니다 . 확장 정밀도가 <.o.10x^99 느슨 합니다.

길이 12 스 니펫

($-.1:)($,)]

때때로 데이터에서 선택한 항목으로 인해 싱글 톤 차원이 실행되는 상황이 발생합니다. Matlab에서 압착이라고하는이 편리한 유틸리티는 모든 싱글 톤 치수를 압착합니다. 포크의 왼쪽 타인은 ($-.1:)크기가없는 모든 치수를 생성하는 반면 가운데 하나 ($,)는 뾰족한 배열을 유지 된 치수로 재구성합니다. 올바른 타인 ]은 이것을 포크로 만드는 역할을하며 올바른 주장을 참조합니다.

길이 13 스 니펫

1 :'-u%u d.1'

뉴턴의 방법 은 미분 함수의 근 근을 구합니다. 이 명시 적 부사 는 뿌리를 찾는 기능에 적용되어야하며 반복 절차의 한 단계를 나타냅니다. u부사를 적용하는 순간에 대체되는 함수를 참조하는 인수입니다. d. 함수는 상징적으로 함수를 도출하는 연결로, 여기서는 D.숫자 적으로 동일한 함수로 대체 될 수 있습니다 (그러나 더 높은 순위의 함수에 적용될 때 다릅니다). 그 결과 인 후크 감산 포크 ( u인수로부터 그 유도체로 나눈 값)를.

예를 들면 다음과 같습니다.

(_2 + *:) (1 :'-u%u d. 1')^:_ ] 1 NB. root of x^2-1; ] is there to avoid combining _ and 1 into an array.

길이 14 스 니펫

(%-.-*:)t.i.10

Taylor 확장에 의한 Fibonacci 시리즈 의 처음 10 개 숫자 x / (1 - x - x^2). 후크 %-.-*:를 분석 하면 (y % (-.-*:) y) = (y % ( (1 - y) - *: y).

길이 15 스 니펫

(#{.+//.)!/~i.9

피보나치 시리즈에 대한 또 다른 내용. 이번에는 다른 각도에서; Pascale의 삼각형 '! /~i.9'에서 시작합니다.

/dyadically 사용될 때 Table을 의미하며 , 인수의 각 셀 사이에 바인딩 된 동사를 적용하여 인수 x와 y 사이의 연산 테이블을 생성합니다. 이 경우 조합 (또는 Out)! 으로 dyadically 사용됩니다 . 동사를 Reflexive로 만듭니다 . 그것도 옳은 주장을 왼편으로 사용하십시오.~

부사 /.는 홀수이며, 배열의 대각 대각선을 따라 동사를 적용합니다 (예 : 여기 시도</.!/~i.5 )

따라서이 코드 조각은 파스칼의 삼각형에있는 9 개의 첫 번째 반 대각선에 대한 합계를 가져옵니다. 이것은 피보나치 시리즈의 또 다른 사례입니다.

길이 16 스 니펫

;/@~.,. <"0@#/.~:

좋아, 나는 단지 16에 도달하기 위해 공백을 추가했다 :). 이 스 니펫은 Key를 사용하여 포크를 보여줍니다 . 인수의 모든 항목과 해당 빈도를 나열합니다.

x u/. yX는 고유 또는 J의 덩어리 예에 U를 적용 (=x) u@# y, =자기 분류 들이 위치에 나타나는 1 격납 부울 배열 생성 nub ~한다. 여기서는 반사적으로 적용되므로 y의 각 고유 항목에 대해 Tally 를 실행 하여 모양 수를 계산합니다.

J 대부분의 동사는 덩어리 순서 (예를 들어 반대로 새로운 고유 항목, 외관의 순서 유지로 unique인수를 정렬 매트랩을)이 사용될 수있다 스티칭 여기 이루어집니다 그들의 주파수에 항목을. ;/@~.모든 항목의 박스 목록을 만드는 데 사용됩니다.

널리 퍼져있는 순위 개념이므로이 코드는 모든 차원에서 작동 합니다 .

길이 17 스 니펫

*./ @:(#&>)@C.@A.

J는 순열에 관한 몇 가지 기본 요소를 지원합니다.

  • Anagram A. Monadically Anagram 인덱스를 찾은 후, dyadically, 왼쪽 인수의 anagram 인덱스로 지정된 순열을 오른쪽 인수에 적용합니다.
  • 주기-Permute C. 는 순열의 직접 표현과주기 표현을 변환합니다.

이 스 니펫은 아나그램 인덱스를 왼쪽 (0과 사이 !#y)으로, 오른쪽 인수로 y 배열 할 동사입니다 . 그 후 사이클 길이 의 LCM *./ 을 계산합니다 #&>. 원래 배열을 다시 얻는 기간 :

]n=: (p=:?!9) *./ @:(#&>)@C.@A. i.9 NB. period of a random permutation
p&A.^:n i.9 NB. applies permutation n times.

길이 21

<:@(#/.~)@(i.@#@[,I.)

이 작은 동사는 "stats / base"부가 기능에서 비롯된 것으로 histogram 이라고 합니다. bin 시작 목록이 주어지면 ]bn-1,bn]bn이 bin 번호 n의 시작 인 간격 사이의 모든 데이터 발생을 합산합니다 .

다음 과 같은 간격을 찾기 위해 간격 색인I. 을 이용합니다 .

y가 x의 항목 모양 인 경우 x I. y는 j {x가 순서에서 y를 따르고, x가 순서에서 {: x를 따르거나 x가있는 경우 #x가 아닌 음이 아닌 j입니다. 항목이 없습니다.

각 구간의 총계는 스 니펫 16에서 강조 표시된 를 사용하여 수행됩니다 .

tryj.tk에 링크 된 스 니펫은이 히스토그램을 사용하여 중심 한계 정리를 보여줍니다.

(bins=:(%~>:@i.)10) ( [ (graph=:(,&":"0 1 '#'#"0 1~])) (histogram=:<:@(#/.~)@(i.@#@[,I.)) ) (+/%#) ?5 200 $ 0

길이 22

=,&(+/)(~:#[)e.&~.~:#]

Fun in J. 비밀 배열을 왼쪽 인수로, 추측을 오른쪽으로 사용하여 마스터 마인드 엔진을 구현합니다. 반환 된 값은 흰색과 검은 색 나무못의 수입니다. 분해 :

NB.   ExactMatch: checks where digits correspond:
ExactMatch =: =

NB.   GoodDigitWrongPlace: Copies non-matched numbers from both arguments (left and right
NB.   pairs of parentheses, and checks them for same elements(e.), after eliminating
NB.   doubles in both (&~.)
GoodDigitWrongPlace =: (~: # [) (e.&~.) (~: # ])

NB.   Piecing the conditions together, after summing the booleans:
mm =: ExactMatch ,&(+/) GoodDigitWrongPlace

처럼 사용

secret (=,&(+/)(~:#[)e.&~.~:#]) guess

어디에 secret그리고 guess어떤 배열입니까. 실제로 모든 데이터 유형에서 작동합니다.


17
글쎄, 읽을 수없는 이상한 기호 힙을 얻거나 읽을 수없는 ASCII 기호 힙을 얻습니다. 독을 선택하십시오.
John Dvorak

16
@JanDvorak 모든 언어는 배우기 전까지는 읽을 수 없습니다. ;-)
Gareth

5
나는 길고 서술적인 이름이 코드 이해를 돕는다 고 생각했었다. 그럼 내가 계몽 .
hoosierEE 2016 년

@Gareth 그러나 배운 후에도 모든 것을 읽을 수있는 것은 아닙니다 . 이름을 쓰지 않을 것입니다.
flawr

45

RPL (Redstone Programming Language) 및 마인 크래프트

이것은 우리가 이것을 실제 프로그래밍 언어로 생각할 수 있는지 아닌지에 대한 큰 확장이지만, 어쨌든 시도 할 것입니다. 그리고이 두 "언어"는 실질적으로 동일하기 때문에, "Minecraft"언어 (레드 스톤 등) 및 RPL로 스 니펫을 게시 할 수 있습니다. 또한 많은 스 니펫이 Minecraft에 있으므로 공간을 절약하기 위해 그림 자체가 아닌 그림에 대한 링크를 게시합니다. 또한 모든 스 니펫은 일반 레드 스톤이 아닌 마인 크래프트의 프로그래밍 개념입니다 (즉, 레드 스톤 문이 나타나지 않음). 문자 바이트 (RPL에) 또는 항으로 계산한다 (마인에서).

사실 :

RPL은 Tossha the Inventor 의 프로그래밍 언어입니다. 코드를 Minecraft 레드 스톤 및 명령 블록으로 변환 입니다. 입력 및 출력, 루프, 정수 조작, 삼각 함수, 근사 등을 수행 할 수 있습니다.

길이 1 :

버튼 (1 바이트)은 Minecraft에서 가장 간단한 입력 형식입니다. "프로그램"을 시작하거나 중지 할 수도 있습니다. 마찬가지로, 레버 (1 바이트)는 또 다른 형식의 입력이며, "켜짐"및 "꺼짐"상태의 프로그램을 시작 및 중지하는 데에도 사용할 수 있습니다. 기억해야 할 것은 Minecraft는 문자 그대로 3D 프로그래밍 언어이므로 버튼 / 레버가 프로그램에있는 위치에 큰 차이를 만들 수 있습니다.

길이 2 :

레드 스톤 램프에 부착 된 버튼은 매우 기본적인 고양이 프로그램입니다. 입력 (버튼 또는 레버를 사용하여 0또는 1( off또는 on))을 사용하여 램프에서 0또는 1( off또는 on) 처럼 빛의 형태로 출력합니다 .

여기에 이미지 설명을 입력하십시오

길이 3 :

아래에서 볼 수 있듯이, 이것은 가장 짧은 소스 코드 수정 프로그램 중 하나입니다 (Minecraft로 런타임에 소스를 수정할 수 있음). 이제이 특정 프로그램은 실제로 사용되지 않지만이 개념을 다른 프로그램과 결합하여 멋진 프로그램을 만들 수 있습니다 (더 많은 공감대와 함께 제공). 실행될 때이 프로그램은 입력 소스를 제거하고 다시 실행할 수 없게합니다. 여기에 이미지 설명을 입력하십시오

길이 4

이 "스 니펫"은 실제로 지연과 NOT 게이트라는 두 가지 개념을 보여줍니다. 레드 스톤-틱 이있는 특정 레드 스톤 요소를 사용하여 지연 지연 지연됩니다. 레드 스톤 틱은 1/10 분의 1과 같습니다. 레드 스톤 구성 요소마다 지연이 다릅니다. 토치에는 1rt 지연 (1 레드 스톤-틱), 비교기는 1rt 지연, 리피터는 설정 방법에 따라 1, 2, 3 또는 4rt 지연이있을 수 있습니다. 이 예에서, 레드 스톤 리피터는 4rt 지연으로 설정됩니다.

다음은 NOT 게이트입니다. NOT 게이트는 입력을 받아 반전시킵니다. 따라서이 설정에서는 입력이 꺼져 있으면 출력이 켜지고 입력이 켜져 있으면 출력이 꺼집니다.

길이 5

OR 게이트는 Minecraft에서 매우 쉽게 수행 할 수 있습니다. 두 개의 입력이 동일한 출력에 연결됩니다. 그게 다야. 재미있는 속임수 나 다른 일이 없습니다. 아주 간단합니다.

여기에 이미지 설명을 입력하십시오

길이 6

다음은 "코드"를 압축하기위한 팁입니다. 두 입력의 신호 강도가 해당 출력을 방해하지 않을 정도로 작다는 것을 알고 있다면 레드 스톤을 서로 바로 연결할 수 있습니다. 아래 예에는 간단한 호퍼 타이머가 있으며,이 신호는 신호 강도 1을 출력하는 비교기와 함께 각 호퍼에서 약 0.5 초씩 항목을 앞뒤로 전송합니다. 이는 두 출력이 서로 간섭하지 않음을 의미합니다. 이 예에서 램프는 데모 목적으로 만 사용되며 총 블록 수에는 포함되지 않습니다.

여기에 이미지 설명을 입력하십시오


7
당신은 13 upvotes, 나는 10 moar 프로그램을 할 수 있습니까?
Rɪᴋᴇʀ

4
실제로 RPL로 작성된 프로그램은 없으므로 전달하지 마십시오. 이것은 순수하게 마인 크래프트 "코드"입니다.
mbomb007

2
14 개의 프로그램이 부족합니다 m8. 나는 당신이 생각하는 것을보고 싶습니다;)
Conor O'Brien

4
당신은 21 upvotes를 가지고, 나는 15 moar 프로그램을 할 수 있습니까?
wizzwizz4

1
당신은 29 upvotes, 나는 23 moar 프로그램을 할 수 있습니까?
bb010g

42

TI-BASIC

[언어는 사용되는 계산기에 따라 달라 지지만 달리 명시되지 않는 한 TI-84를 사용합니다.]

길이 31 스 니펫

Menu("","1",A,"2",B
Lbl A
Lbl B

메뉴 사용법을 보여줍니다. 위의 것은 아무것도하지 않기 때문에 쓸모가 없지만 프로그램의 다른 부분을 탐색하는 데 사용할 수 있습니다. 첫 번째 인수는 메뉴 제목 다음에 옵션 쌍 (표시된 문자열 다음에 1 자 또는 2 자 레이블)입니다. 보다 직관적 인 예는 다음과 같습니다.

Menu("CHOOSE VALUE","AREA",A,"CIRCUMFERENCE",C
Lbl A
Disp πR²
Stop
Lbl C
2πR

Lbl로 분기하는 데에도 사용할 수 있습니다 Goto. 메뉴에는 사용하기 불편한 몇 가지 제한 사항이 있습니다. 7 개의 메뉴 항목 만있을 수 있으며 각 제목은 최대 14 자일 수 있으므로 모든 것이 한 화면에 맞습니다.

길이 29 스 니펫

Real
√(-16
a+bi
Ans
re^θi
Ans

Real(기본적으로 설정되어 있음) 계산기를 실수 모드로 설정하므로 복소수 관련 계산에 NONREAL ANS오류가 발생합니다. 에 넣었을 때 a+bi모드, 계산기는 복소수 해당되는 경우, 그래서 두 번째 예제 반환 등의 답변을 표시합니다 4i. re^θi모드는 직사각형 좌표 대신 극좌표를 사용하므로 출력4e^(1.570796327i) 합니다.

길이 23 스 니펫

If A≥9
Then
1→X
7→Y
End

Else진술 이있을 수 있지만 이것은 단순한 조건부 입니다. Then그리고 End그것은 단지 하나 개의 문장 인 경우 필요하지 않습니다.

길이 21 스 니펫

(-B+√(B²-4AC))/(2A)→X

모두가 가장 좋아하는 이차 공식입니다. Xa, b 및 c가 ax 2 + bx + c 에서와 같이 각각의 변수에 저장되어 있다고 가정 하여 첫 번째 해를 2 차 방정식 에 저장 합니다.

길이 20 스 니펫

Shade(|X/2|-3,5-X²,0

이는 x의 최소값과 최대 값, 음영 선 사이의 거리 및 거리와 같은 몇 가지 선택적 매개 변수를 사용하여 두 기능의 교차 부분을 음영 처리합니다.

길이 18 스 니펫

LinReg(ax+b) L1,L2

여기서 우리는 선형 회귀 방정식 또는 점 그룹과 가장 일치하는 선형 방정식을 계산하고 x 값은 목록으로 저장되고 L1y 값은로 저장됩니다 L2. 2 차, 3 차 및 지수를 포함하여 다른 많은 회귀 옵션이 있습니다.

길이 17 스 니펫

dbd(1.2711,1.2115

이렇게하면이 날짜가 시작된 날인 2011 년 1 월 27 일과이 날이 작성된 날인 2015 년 1 월 21 일인 두 날짜 사이의 일 수를 계산합니다. (게으른 사람은 1455 일입니다.) 날짜를 인코딩하는 방법은 약간 이상합니다. DDMM.YY 또는 MM.DDYY는 선행 0을 선택 사항입니다.

길이 16 스 니펫

For(A,0,5
Disp A

이것은 언어 프로그래밍 측면의 두 부분을 보여줍니다. 첫 번째는 다른 언어 for와 마찬가지로 일반적인 루프 for(var A=0;a<5;a++)입니다. (또한 End명령을 사용하여 루프를 해제 해야 합니다.) 두 번째는 자체 설명입니다.A 이 경우 루프로 인해이 경우 5 번 .

길이 15 스 니펫

Y1=|X³-4|
Y2=3X

다음은 그래프 계산기 의 잘 알려진 기능인 그래프 방정식의 두 가지 예입니다 . 동일한 평면에 10 개의 서로 다른 방정식을 그래프로 표시 할 수 있으며 교차점, 최대 값, x 값 등 을 찾는 유용한 명령이 많이 있습니다 . 이러한 방정식은 표준 창에 그래프를 그릴 때 다음과 같습니다.

그래프

길이 14 스 니펫

[[1,2][34,5]]T

괄호는 행렬을 만드는 데 사용되며 행렬을 T전치합니다.

[[1 34]
 [2 5]]

길이 13 스 니펫

dayOfWk(9,1,6

이것은 서기 9 월 1 일 6 일 요일을 찾습니다. 출력은 1이 일요일, 2가 월요일 등인 숫자입니다. 이 특정 날짜는 화요일이므로 결과는3 입니다.

길이 12 스 니펫

Circle(1,3,5

기본 그리기 도구 중 첫 번째 도구는 중심이 (1,3)이고 반지름이 5 인 그래프에 원을 그립니다.

길이 11 스 니펫

randInt(0,8

0에서 8 사이의 (의사) 난수를 생성합니다. 생성 할 정수 수를 알려주는 선택적 세 번째 인수가 있습니다. 정규 분포와 이항 분포에 대한 함수, 랜덤 행렬에 대한 함수 및 반복없이 무작위로 정렬 된 목록에 대한 함수를 포함하여 몇 가지 다른 임의 함수가 있습니다. randInt같은 번호를 저장하여 시드 될 수있다 rand: 2→rand.

길이 10 스 니펫

4>5 or 2≠7

여기 TI-BASIC의 평등 및 논리 연산자가 있습니다. 부등식은 first로 평가 0 or 1되고 or어느 쪽이든 true이면 true를 반환하므로1 .

길이 9 스 니펫

.656▶F◀▶D

이것은 십진수에서 분수로 또는 그 반대로 변환 할 수 있으며 매우 유용합니다. 전용도있다 ▶Frac하고 ▶Dec한 방향으로 만 이동 기능. 82/125이 경우 인쇄합니다 .

길이 8 스 니펫

lcm(14,6

14와 6 의 최소 공배수 인 42를 인쇄합니다 .

길이 7 스 니펫

getDate

설명이 필요 없으며 현재 시스템 날짜를 목록으로 인쇄합니다 (이 경우) {2015 1 19}.

길이 6 스 니펫

√({4,9

배열 (또는 목록)은 중괄호로 묶고 쉼표로 구분됩니다. 이것은 map많은 언어 의 기능 과 유사하며, 목록의 각 요소를 반복하고 중괄호 외부의 연산을 적용합니다.이 경우에는 제곱근이므로 결과는 다음과 같습니다.{2 3} 입니다. 닫는 괄호는 선택 사항이므로 지금부터 생략됩니다.

길이 5 스 니펫

4iii6

여기 몇 가지 멋진 일이 있습니다. 먼저 실수 부분 4와 6을 곱한 다음 허수 부분을 곱합니다 : i^3또는 -i. 이 곱하면 -24i. 이것은 펑키처럼 보이는 병렬 곱셈과 TI-BASIC의 허수 처리를 보여줍니다.

길이 4 스 니펫

8°5′

이것은 8도, 5 분이며,도 단위로 변환됩니다 8.0333...

길이 3 스 니펫

8→T

이것은 숫자를 변수로 저장하는 방법을 보여줍니다. 숫자가 먼저오고 점포 화살표와 변수 이름이 있기 때문에 다소 특이합니다. 사실에서 언급했듯이θ θ는 변수로 사용될 수 있으며 변수는 하나의 대문자 만 가능합니다.

길이 2 스 니펫

4M

Mathematica와 마찬가지로, *필요 하지 않은 병치와 곱할 수 있습니다 . 모든 변수는 기본적으로 0으로 초기화되므로 해당 변수에 다른 것을 저장하지 않으면 0이 출력됩니다 (스 니펫 3 참조).

길이 1 스 니펫

e

이것은 오일러 수에 대한 상수 이며로 표시됩니다 2.718281828.

팩 토이 드

변수는 특정 데이터 유형 만 저장할 수 있습니다. 예를 들어, A- Z(및 θ) 저장 수치, str0- str9저장 문자열 및 [A]- [J]저장소 매트릭스 (2 차원 배열).


그런데 소문자 n(아님 n)도 변수로 사용할 수 있습니다.
Ypnypn

흥미 롭군 나는 그 변수를 사용한 적이 없다.
NinjaBearMonkey 2016 년

3
하나의 str0문자 또는 4의 문자 에 대해 논쟁 할 수 있습니다 . TI-BASIC의 모든 명령어의 길이는 1 자입니다.
Ismael Miguel

@IsmaelMiguel 나는 그것에 대해 생각했지만 1 바이트 또는 2 바이트 이며 문자를 정상적으로 계산하기로 결정했습니다.
NinjaBearMonkey

1
나는 당신의 결정을 존중합니다. 이 경우에는 많은 도움이됩니다. 나는 나의 oldie TI-83에서의 프로그래밍을 정말로 즐겼다. (나는 심지어 페인트 프로그램을 디자인했습니다!)
Ismael Miguel

41

GNU Sed

더 제한적인 요구 사항을 스스로 부과하고 sed있습니다. 모든 스 니펫은 완전한 프로그램입니다.

팩 토이 드

sed 튜링 완전한 언어. 여기 증거가 있습니다.

길이 0 스 니펫

나는 길이 0 스 니펫이 엄격하게 필요하다고 생각하지 않지만 실제로 sed에서 무언가를 수행하기 때문에 다음과 같습니다.

Sed는 "Stream EDitor"입니다. 즉 STDIN에서 스트림 (라인 별)을 읽고 편집 한 다음 STDOUT으로 출력합니다. 길이가 0 인 sed 프로그램은 단순히 STDIN을 STDOUT으로 복사합니다. 따라서 cat유틸리티는 sed에 의해 에뮬레이트 될 수 있습니다. 다음은 동일합니다.

cat a.txt b.txt > c.txt

sed '' a.txt b.txt > c.txt

길이 1 스 니펫

=

이 sed 프로그램은 각 행의 행 번호를 STDOUT에 인쇄합니다. 이것은 대략 다음과 같습니다.

nl

또는

cat -n

sed 버전은 줄 번호를 자체 줄에 넣습니다.

길이 2 스 니펫

5q

q라인 5 이후에 STDIN을 STOUT 및 uit에 복사 합니다. 이는 다음과 같습니다.

head -n5

여기에 약간의 패턴이 나타나기 시작했을 수 있습니다. sed많은 표준 코어 유틸리티 도구를 에뮬레이트하는 데 사용할 수 있습니다.

길이 3 스 니펫

iHi

in 모든 줄 앞에 "Hi \ n"을 입력합니다. Meh.

길이 4 스 니펫

/a/d

sed의 많은 힘은 정규식 기능에 있습니다. 이 프로그램은 정규식 a과 일치하는 모든 행 d이 스트림에서 제거되도록합니다. 다른 모든 라인은 여전히 ​​STDOUT으로 출력됩니다. 이것은 다음과 같습니다.

grep -v "a"

길이 5 스 니펫

:l;bl

이것은 무한 루프입니다. 우리는 모두 CPU 호핑 무한 루프를 좋아합니다. label lb정의한 다음 해당 레이블 에 목장 (점프)합니다. 광고 인피니 엄.

길이 7 스 니펫

s/a/A/g

기본적으로 sed는 s각 줄의 첫 번째 항목과 일치하도록 명령을 적용 합니다. 행에서 발생하는 모든 항목을 일치시키고 대체해야하는 경우 명령 g끝에 있는 플래그 s가이를 수행합니다.

길이 8 스 니펫

y/01/10/

거의 사용 되지 않는 y명령은 tr쉘 유틸리티 와 유사 하지만 (유연하지는 않지만) 이 프로그램은 모든을 0s로 전환 1하거나 그 반대로 전환합니다.

길이 9 스 니펫

1!G;$p;h

이 스 니펫은 실제로 8 바이트이지만 기본 코드 골프 규칙에 따라 이것을 9로 계산하므로 기본 출력을 억제하려면 sed -n 매개 변수가 필요합니다.이 프로그램은 스트림의 행을 되돌립니다. 그래서:

sed -n '1!G;$p;h'

정확히 다음과 같습니다.

tac

길이 10 스 니펫

s/[ <TAB>]+$//

이것은 (잘못된) 길이 6 스 니펫을 다시 방문한 것입니다. 줄에서 후행 공백 (공백 및 TAB)을 제거합니다.



더 많은 투표권이 있습니다. 좀 더 주 시겠어요?
luser droog

2
당신의 사실 404'ed.
Wauzl

1
훌륭하지만, 이것들 중 다수는 GNU 확장을 사용하며 표준이 아닙니다. 특히 길이 3 (표준은 i\<newline>Hi<newline>), 길이 5 (표준은 ) sed -e :l -e bl또는 :l<newline>bl<newline길이 10 ( 절대로 작동 +하려면 a *가 필요합니다 ). 길이 9 조각이 참고 -n '1!G;$p;h' 반면, 표준 tac입니다 하지 . :)
와일드 카드

1
@Wildcard 예-나는 이것을 GNU sed로 제한했습니다.
Digital Trauma

39

파이썬

( mbomb007 의 게시물에는 이미 많은 Python 스 니펫이 있지만 몇 가지 사실을 알고 있다고 생각했습니다)

팩 토이 드

파이썬은 가독성에 중점을 둔 동적 유형 언어입니다.

길이 1 스 니펫

1

Python 3에서 위의 내용은 (및 ) True의미 와 동일합니다 . Python 2에서는 값을 재정의 할 수있는 경우에는 필요하지 않습니다 .1 == True0 == FalseTrue

길이 2 스 니펫

<>

<>는에 해당하는 사용되지 않는 비교 연산자 !=입니다. 여전히 Python 2에서 작동하지만 (사용을 권장하지는 않지만) Python 3에서 완전히 제거되었습니다.

길이 3 스 니펫

...

파이썬에는 기본적으로 사용되지 않는 많은 기능이 있지만 타사 라이브러리를 위해서만 있습니다. 이 Ellipsis객체는 그중 하나이며 일반적으로 슬라이싱에 사용됩니다. 예를 들어 다음과 같은 3D numpy 배열 이있는 경우 :

array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

그런 다음 a[..., 0](와 동일 a[:,:,0]) 모든 첫 번째 요소를 제공합니다.

array([[1, 4], [7, 10]])

파이썬 3에서 ...문자가 재미있게 당신은 대신에 "할 일"마커로 사용할 수 있습니다 슬라이싱 구문, 외부에서 사용할 수 있습니다 pass또는 NotImplemented:

def f(x):
    ... # TODO

길이 4 스 니펫

(1,)

파이썬에서 한 요소 튜플.

파이썬 목록 (예 :가 [1, 2, 3, 4]) 변경할 수있는, 그리고 튜플 (예 (1, 2, 3, 4))있는 메신저 변경 가능. 튜플의 일반적인 용도 중 하나는 목록을 해시 할 수 없으므로 사전 키입니다.

일반적인 초보자 실수는 위의 쉼표, 즉 (1)괄호로 묶인 숫자 1 만 남기는 것 입니다. 한 요소 튜플은 닫는 괄호 앞에 쉼표가 필요한 유일한 시간 SyntaxError입니다. 빈 튜플에 쉼표 를 넣으려고 하면 a 가 증가하고 ()길이가 2 이상인 튜플의 경우 선택 사항입니다.

길이 5 스 니펫

0or x

이 스 니펫에는 몇 가지 사항이 있으므로 살펴 보겠습니다.

or||많은 언어에서 와 같습니다 . 파이썬에서, A or B단락 회로, 반환 A(평가하지 않고 B있는 경우) A그렇지 않으면 반환 truthy입니다 B. 예를 들어 항상 진실한 것처럼 1 or x항상을 반환 1하고 정의되지 않은 1경우에도 작동합니다 x. 반면에 is가 정의되어 있으면 0 or x반환 하거나 그렇지 않은 경우에는 a를 던집니다 .xxNameError

골프를 할 때, 우리는 일반적으로 숫자와 사이에 공백을 놓을 수 or같은 1 or x되고 1or x. 이것은 1or숫자로 시작하여 잘못된 파이썬 식별자 이기 때문에 가능합니다 .

그러나 한 가지 예외 0or가 있습니다 SyntaxError. 왜? 파이썬에서 8 진 리터럴은 0o(예 :)로 시작 0o20 == 16하고 파서는 r!

참고 : Python 2에서 8 진 리터럴은 선행 0으로 시작할 수도 있습니다 (예 :) 020.

길이 6 스 니펫

*x,y=L

이 스 니펫은 파이썬에서 L목록, 튜플 또는 다른 종류의 반복 가능한 특별한 할당 유형을 보여줍니다 .

파이썬에서는 튜플과리스트를 "풀고"있습니다 :

a,b = [1,2]

1에 a2를 할당합니다 b. 이 구문은 다음과 같은 다중 할당에도 사용됩니다.

a,b = b,a+b

피보나치 시리즈를 계산하는 프로그램을 작성할 때 유용합니다.

양쪽의 길이가 일치하지 않으면 a ValueError가 발생합니다. 그러나 파이썬 3은 새로운 구문, 확장 가능한 반복적 언 패킹 (또는 더 구어 적으로 "별표 할당")을 도입하여 다음과 같은 작업을 수행 할 수있게합니다.

*x,y = [1, 2, 3, 4, 5]

이 할당 y마지막 요소, 5, 및 x목록의 나머지 부분 즉, [1, 2, 3, 4]. 다음과 같이 할 수도 있습니다.

a,b,*c,d,e = [1, 2, 3, 4, 5, 6, 7]

어느 하나에 할당한다 a(2)에 b, [3, 4, 5]c, 6 d및 7 e.

길이 7 스 니펫

zip(*x)

zip 많은 목록을 가져 와서 압축하는 함수입니다.

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

참고 : Python 3에서는 zip대신 객체가 반환되므로 위와 같은 목록을 원하면 호출을 래핑해야합니다.list()

관련 목록이 두 개 이상 있고 해당 항목을 연결하려는 경우 매우 편리한 기능입니다.

이제 목록의 압축풀고 싶다고 가정 해보 십시오. 어떻게 하시겠습니까? 우리는 zip다시 사용할 수 있지만 불행히도 이것은 다음을 제공합니다.

>>> zip([(1, 4), (2, 5), (3, 6)])
[((1, 4),), ((2, 5),), ((3, 6),)]

문제는 모든 것이 하나의 목록에 있지만 zip개별 목록을 별도의 함수 인수로 사용 한다는 것입니다 . 이 문제를 해결하기 위해 *list / tuple / etc를 사용 하는 splat 연산자를 소개합니다 . 함수 인수로 압축을 풉니 다.

f(*[1,2]) ==> f(1, 2)

결과는 다음과 같습니다.

>>> zip(*[(1, 4), (2, 5), (3, 6)])
[(1, 2, 3), (4, 5, 6)]

길이 8 스 니펫

x='a''b'

처음 이걸 보았을 때, 나는 조금 뒤로 물러났습니다. 서로 옆에 두 개의 줄이 있다는 것은 무슨 의미입니까? 대답은 간단했습니다.

>>> x
'ab'

파이썬은 단지 두 문자열을 연결합니다! 긴 문자열을 다음과 같이 나눌 수 있기 때문에 가독성에 매우 유용합니다 (주변 괄호 참조).

x = ('This is a very long sentence, which would not look very nice '
     'if you tried to fit it all on a single line.')

길이 9 스 니펫

0!=2 is 2

당신은 이미, 파이썬은 비교 연산자의 체인을 허용 알고있을 5 < x <= 7경우에만 사실 5 < xx <= 7. 당신이 그것을 몰랐다면 ... 다음 놀람!

어쨌든 덜 알려진 것은 is/ is not/ in/ not in도 비교 연산자이기 때문에 체인을 연결할 수도 있다는 것입니다. 즉, 상기 코드에 해당 (0 != 2) and (2 is 2)되는, True.

참고 : 두 가지가 같은 가치 인지 여부 가 아니라 두 가지가 동일한 객체 인지 여부를 확인하기 2 is 2때문에 반 으로 약간의 미묘함이 있습니다 . 파이썬은 너무 작은 정수를 캐시 IS 하지만 입니다 !is1+1 is 2True999+1 is 1000False

길이 10 스 니펫

x=[];x+=x,

목록을 추가하면 어떻게됩니까? 인쇄를 시도 x하면 다음과 같은 이점이 있습니다.

[[...]]

다행히 파이썬 print은 재귀 목록을 인쇄하려고 시도하지 않을 정도로 지능적입니다. 우리는 다음과 같이 재미있는 것들을 많이 할 수 있습니다.

>>> x[0][0][0][0][0]
[[...]]
>>> x[0] == x
True

이 기능은 사전과도 함께 작동하며 그래프와 같이주기를 사용하여 데이터 구조를 작성하는 한 가지 방법입니다.

길이 11 스 니펫

help(slice)

help함수는 Python에서 디버깅하는 데 매우 유용합니다. REPL에서 인수없이 호출 help()하면 도움말 세션을 시작하여 함수 / 데이터 유형 등의 문서를 찾을 수 있습니다. 특정 인수로 호출 help하면 관련 항목에 대한 정보가 제공됩니다.

예를 들어, help(slice)다음 정보를 제공합니다 (매우 길어서 잘립니다).

Help on class slice in module __builtin__:

class slice(object)
 |  slice(stop)
 |  slice(start, stop[, step])
 |  
 |  Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
 |  
 |  Methods defined here:
 |  
 |  __cmp__(...)
 |      x.__cmp__(y) <==> cmp(x,y)
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |
 | ...

에서 slice볼 수 있듯이 slice인덱싱 할 객체를 만들 수 있습니다 . 예를 들면 다음과 같습니다.

>>> L = list(range(10))
>>> L[slice(2, 5)]         # L[2:5]
[2, 3, 4]
>>> L[slice(2, None)]      # L[2:]
[2, 3, 4, 5, 6, 7, 8, 9]

디버깅에 유용한 또 다른 함수는입니다 dir().이 함수는 인수없이 호출 될 때 현재 범위의 모든 이름을 반환하고 인수와 함께 호출 될 때 지정된 객체의 모든 속성을 반환합니다.

길이 12 스 니펫

round(5.0/2)

이것은 무엇을 평가합니까? 답은 파이썬 버전에 따라 다릅니다!

파이썬 2에서는 두 정수를 나누면 정수 나누기 (ie 5/2 == 2)가되지만 파이썬 3에서는 float 나누기 (ie 5/2 == 2.5)를 얻습니다 . 그러나 이것은 부동 소수점과 정수 사이의 나누기이므로 항상 부동 소수점이되어야합니다. 그러면 왜 다른 결과를 얻습니까?

round두 파이썬 버전 에 대한 문서를 살펴보면 답을 찾을 수 있습니다.

  • 에서 파이썬 2 , round0에서 멀리 반올림 tiebreaks.
  • 에서 파이썬 3 , round으로 반올림에 의해 tiebreaks 가장 가까운 짝수의 정수 .

즉, 5.0/2 = 2.5반올림 3파이썬 2 만 반올림 2이상한 소리를 수있는 가장 가까운 짝수의 정수를 향해 파이썬 3 라운딩에서,하지만 실제로라고 은행원의 반올림을 , 그리고 편견을 줄이기 위해 유사 양과 음의 값을 치료하려고합니다.

길이 13 스 니펫

class C:__x=1

파이썬은 객체 지향적 인 클래스를 가지고 있습니다. 위 C의 단일 속성 __x은 1로 설정된 클래스 입니다 .

점 표기법을 사용하여 클래스 속성에 액세스 할 수 있습니다. 예를 들어 수업이 있다면

class MyClass(): my_attr = 42

인쇄 MyClass.my_attr는 예상대로 42가됩니다.

그러나 우리가 똑같이하고 C.__x위에 정의 된대로 액세스하려고하면 다음과 같은 결과 가 나타납니다.

AttributeError: type object 'C' has no attribute '__x'

무슨 일이야? C분명히 __x속성이 있습니다!

그 이유는 파이썬으로 시작하지 않는__ "private"변수로 시작하는 속성이 에뮬레이션 되기 때문 입니다. 파이썬은으로 시작하는 속성의 이름을 맹 글링하여 __클래스 이름을 추가하여 이름 재사용 충돌을 피합니다. 위의 예에서 실제로 액세스하기로 결정 1했다면 대신

>>> C._C__x
1

길이 14 스 니펫

NotImplemented

파이썬에는 클래스가있을뿐만 아니라 연산자 오버로딩도 있습니다. 예를 들어 수업을 할 수 있습니다

class Tiny():
    def __lt__(self, other):
        return True

__lt__보다 작은 연산자는 어디에 있습니까 ? 이제 인스턴스를 만들면 Tiny이 작업을 수행 할 수 있습니다

>>> t = Tiny()
>>> t < 1
True
>>> t < "abc"
True

우리가 정의한 이후 __lt__에 항상 돌아갑니다 True. 우리는 또한 할 수 있습니다

>>> 42 > t
True

그러나 다음과 같은 휴식이 있습니다.

>>> t > 42
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    t > 42
TypeError: unorderable types: Tiny() > int()

잠깐, 어떻게 작동합니까? 로보다 큰 동작을 지정하지 않았 Tiny으므로 마지막 사례가 깨지는 것은 놀라운 일이 아닙니다. 그러나 int(42)는 그것이 우리의 Tiny물체 보다 크다는 것을 어떻게 알 수 있습니까?

파이썬에는 내장 상수 NotImplemented가 있는데, 이것은 비교 특수 메소드에 의해 리턴 될 수 있습니다. 사용해 봅시다 :

class Unknown():
    def __gt__(self, other):
        # __gt__ for greater-than
        print("Called me first!")
        return NotImplemented

이제 새로운 클래스의 인스턴스를 만들면 :

>>> u = Unknown()

우리는 할 수있어:

>>> t < u
True
>>> u > t
Called me first!
True

우리가 볼 수 있듯이, u > t파이썬은 Unknown먼저 더 큰 메소드를 호출하려고 시도했지만 구현되지 않았 음을 발견했으며 Tiny대신 다른 클래스 ( )에 대해 더 작은 메소드를 시도했습니다 !

길이 15 스 니펫

x=[],;x[0]+=[1]

이것은 약간 재미있는 것입니다. 먼저 튜플 내부의 빈 목록을 지정 x합니다 . 그런 다음 빈 목록을 두 번째 목록으로 확장하려고 시도합니다 .[],([],)x[0]+=[1][1]

이제 목록을 변경할 수 있으며 튜플 것을 기억 메신저 는 불변의 객체 내에서 변경 가능한 객체를 변경하려고하면 어떻게됩니까 - 가변?

>>> x=[],;x[0]+=[1]
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    x=[],;x[0]+=[1]
TypeError: 'tuple' object does not support item assignment

오, 오류가 발생합니다. 그러나 인쇄하려고하면 x어떻게됩니까?

>>> x
([1],)

응? 목록이 변경되었습니다!

여기서 무슨 일이 일어나고 있는지 궁금하다면 이 블로그 게시물 을 확인하십시오 .

길이 16 스 니펫

@lru_cache(None)

캐시 만 추가하십시오! 이것은 Python 3에서 사용할 수 있는 데코레이터 의 간단한 예입니다 .

다음과 같은 순진한 피보나치 구현이 있다고 가정합니다.

def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

프로그래밍 과정에 대한 대부분의 소개에서 알 수 있듯이 이것은 피보나치를 구현 하는 매우 나쁜 방법이며, 기본 사례에서 많은 수의 1을 효과적으로 추가하기 때문에 지수 런타임으로 이어집니다. f(10)? 순식간에 실행됩니다. f(32)? 시간이 걸리지 만 도착합니다. f(100)? 아니.

그러나 결과를 캐시하면 상황이 훨씬 빨라집니다. 우리는 항상 캐시에 대한 사전을 사용할 수 있지만 대신 다른 것을 시도해 봅시다.

from functools import lru_cache

@lru_cache(None)
def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

보시다시피, 내가 한 모든 lru_cache것은 functools모듈 에서 가져오고 @lru_cache(None)내 기능 앞에 추가하는 것입니다. @이 경우 메모를 위해 함수를 감싸는 데코레이터를 나타냅니다. lru_cache첫 번째 인수는 maxsize캐시의 최대 크기입니다. 여기서는 None최대 크기가 없음을 나타내 도록 설정했습니다 .

이제 우리가 그것을 사용하려고하면 :

>>> f(100)
573147844013817084101

그리고 1 초도 걸리지 않았습니다!

참고 : f(1000)재귀 깊이 오류가 발생하지만 다른 이야기입니다.


파이썬은 is연산자에 어떤 범위의 작은 정수를 "잡을" 까요?
mbomb007

@ mbomb007 이 질문에서 , 그것은 -5에서 256으로 보입니다 . 당신은 시도 -5-1 is -6하고 255+2 is 257테스트 할 수 있습니다 .
Sp3000

37

조금

Factoid : 2 개의 공감대를 사용하여 Jot을 정의 할 수 있으며 튜링이 8로 완료되었음을 증명할 수 있습니다 (길이 4, 6 또는 7을 사용하지 않음).

길이 1

1

이것은 Jot에서 두 가지 기능의 예입니다. 첫 번째는 빈 문자열이며, 이는 identity 함수로 평가됩니다. 두 번째는 1Jot의 그룹화 연산자 인입니다. ( 람다 미적분 표기법)으로 1평가되며 , 여기서 프로그램은 (여기서는 빈 문자열)입니다. 따라서이 프로그램은 로 단순화 된 기능 입니다 .λxy.[F](xy)[F]1λxy.(λz.z)(xy)λxy.xy

길이 2

10

이제 우리는 Jot :에 다른 기호를 소개합니다 0. [F]지금까지 프로그램의 값을 나타내는 경우 조합 논리 에서 0[F]SK, 어디서 S, 그리고 어디에서 왔는지 평가합니다 . 이제 전체 언어를 정의했습니다.K

길이 5

11100

이제 조합 논리 에서 Jot 로의 맵핑을 정의하여 Jot이 완료되었음을 증명할 것입니다 . 이 Jot 프로그램은 K 결합기 입니다.

길이 8

11111000

이것이 S 결합기입니다.

길이 3

1AB

여기서, AB오히려 임의의 표현 적 으면서 자리의 일부가 아니지만. 표현 AB조합 적 논리는 매핑 1AB으로, 필기에 AB재귀 적으로이 세 가지 규칙에 의해 변형. QED

길이 N

1
10
11
100
101
110
[...]

이진수로 표현 된 모든 자연수는 유효한 Jot 프로그램입니다. 결과적으로 알고리즘 적으로 임의 길이의 더 많은 스 니펫을 생성 할 수 있습니다. 공감대가 충분하면 정지 문제를 해결할 수 있습니다 .


2
두 개의 공감대가 주어졌습니다. 이제 언어를 정의하십시오.
John Dvorak

@ JanDvorak이 작업 중입니다 ...이 것을 연구한지 너무 오래되어서 모두 잊었습니다. :)
Phil Frost

1
왜 이것이 더 많은지지를 받아야하는지 모르겠습니다. 단순히 길이가 증가하는 임의의 이진수를 생성하려고합니다. |
Optimizer

1
당신은 upvote 번호 4에 대해 그렇게 말했다. 그러나 여기서 우리는 "방금 생성 한 난수"
Optimizer를보고 있습니다.

1
정지 문제를 어떻게 해결할 수 있습니까? 무한 (무한 수) 프로그램을 사용하는 것과 관련이 있다고 생각합니까?
Filip Haglund 12

37

세게 때리다

사실 :

매우 심각한 ShellShock 버그는 1989 년부터 Bash에 존재했으며 25 년 동안 발견되지 않은 채 남아있었습니다. Bash를 작성하는 기쁨의 많은 부분은 많은 특이성과 불일치에 직면하고 있습니다.

길이 1 스 니펫 :

[

에 대한 별칭 test형식의 코드를 허용 내장if [ a == b ]; then -실제로 [는 구문 요소가 아닌 독립 실행 형 명령 ]이며 완전히 장식 적입니다 ([에서 요구하더라도 요구 사항은 임의적이며을 사용하여 제거 할 수 있음 alias [=test).

길이 2 스 니펫 :

||

논리처럼 or대부분의 언어에서는 이지만 프로세스에서는 입니다. 명령 ||이 0이 아닌 값을 반환하는 경우에만 명령을 실행합니다 .

길이 3 스 니펫 :

x=y

과제. 멋지고 예측 가능하지만 다른 대부분의 언어와 달리 여분의 공백은 허용되지 않습니다. 당신은 단지 주위가 아닌 bash의 것들 사이에 여분의 공간을 거의 어디에나 붙일 수 있기 때문에 재미 있습니다 =.

길이 4 스 니펫 :

$IFS

내부 필드 분리기 이 변수는 Bash가 루프에서 반복 및 문자열에서 배열 채우기와 같은 많은 내장 조치에 대해 데이터를 분할하는 방법에 영향을줍니다. 올바르게 사용하면 매우 강력 할 수 있습니다. 그러나 더 자주 그것은 미묘하고 예측할 수없는 버그의 원인입니다.

길이 5 스 니펫 :

${x^}

문자열을 x로 바꾸십시오. 그러나 첫 문자는 대문자입니다! 자주 사용되는 기능으로 자체 언어 구문이 있습니다.

길이 6 스 니펫 :

x=($y)

IFS가 현재 설정되어있는 모든 항목 (기본적으로 공백)을 분할하여 문자열 또는 요소 y 목록에서 배열 x를 채 웁니다. 고급 bash 프로그래밍에 매우 유용한 기능입니다.

길이 7 스 니펫 :

${x[y]}

배열! 하지만 잠깐만 요 .. y는 숫자 인덱스가 아닌 문자열입니까? 실제로 Bash는 연관 배열을 지원합니다! 많은 사람들이 이것을 모른다. declare -A x먼저 해야합니다 .

길이 8 스 니펫 :

${x##*,}

x를 마지막 ,문자 (또는 지정한 것) 까지 모두 대체하십시오 . csv의 마지막 필드를 얻는 데 유용합니다. 이것은 쉽게 할 수없는 cut일이며 왼쪽에서 필드 만 계산합니다. %와 %%는 오른쪽에서 같은 것을 잘라냅니다. %와 #은 미국 키보드에서의 위치로 선택되었으므로 왼쪽과 오른쪽을 의미하는 것은 분명하지만 미국 키보드를 사용하지 않는 모든 사람에게는 큰 가치가 없습니다. :)

길이 9 스 니펫 :

[ a = b ]

대부분의 다른 언어에서 비교 연산에서 단일 동등 항목은 할당 형식으로 의도하지 않은 동작을 생성합니다. 그러나 Bash에는 없습니다. 당신이 무엇이든간에 공간을 생략하지 마십시오!

길이 10 스 니펫 :

if [ a=b ]

필수 공간을 잊어 버린 경우에 발생합니다. 오류가 발생하지 않습니다. 항상 TRUE를 반환합니다 -하더라도 ab해제, 또는 무엇이든 그들이 설정하고 변수, 중요하지 않습니다 - 그것은 항상 true를 반환합니다. if [ "$password"="$correctpass" ]이 "기능"의 재미있는 잠재력을 보는 것과 같은 코드를 생각 하십시오.

길이 11 스 니펫 :

x=${y//a/b}

정규식 하위 문자열 교체! x를 y의 값으로 설정하지만 모든 인스턴스가 b로 바뀝니다.

길이 12 스 니펫 :

[[:upper:]]*

패턴 매칭 - 그냥 쉘에서 * 와일드 카드를 사용하여 국한되지 않습니다, 당신은 같은 모든 POSIX 표준 일치를 사용할 수 있습니다 alnum, alpha, digit

길이 13 스 니펫 :

function x(){

약간의 C 구문이 신비하게 들어 왔습니다! 중괄호에 대한 완전히 다른 많은 용도 중 하나이며 Bash를 다른 언어처럼 보이게하는 선택적 장식 요소의 또 다른 예- 여기에서 ()또는 function생략 할 수 있습니다 (둘다는 아님). 일관성없는 공백 또한 더 재미 - 애프터 공간이 {필수입니다,하지만 하지 닫는 전에 }같이,function x { y;}

길이 14 스 니펫 :

echo {Z..A..3}

또 다른 완전 중괄호 사용. 지정된 단계로 범위를 확장합니다. 이 경우 Z에서 A까지 모든 세 번째 문자를 생성합니다. seq를 사용하지 않고 시퀀스를 생성하는 데 유용하지만 변수와 함께 사용할 수 없으므로 기능이 제한됩니다.

길이 15 스 니펫 :

echo {a,b,c,d}x

시퀀스 생성에서 중괄호에 대해 유사하지만 동일하지 않은 또 다른 용도; prints ax bx cx dx이며 단일 명령의 시퀀스 또는 목록에서 문자열 목록을 생성하는 데 유용합니다. 그러나 다시 중괄호 안의 변수와 함께 사용할 수 없으므로 유용성이 제한됩니다.


실제로 ]순전히 장식적인 것은 아닙니다. [마지막 인수가 아닌 경우 작동을 거부합니다 ].
FUZxxl

예. 그러나 화장품 이외의 다른 목적은 없습니다. 당신이 대체 할 경우 [는 다른 형태로 test, 그 다음은 ]내가 단순히 실제 bash는 구문, 단지 시각적 인 설탕이 아니다 지점을 만들고 있어요 - 호출에 아무 것도 변경하지 않고 생략 할 수 있습니다.
Riot

bash 구문은 아니지만 후행 ][구문이므로 C에서 세미콜론으로 명령문을 종료하는 방법과 마찬가지로 구문을 제공해야합니다.
FUZxxl

필수 사항이지만 C 세미콜론과 같은 방식은 아닙니다. 그것에 대한 요구 사항은 간단 alias [=test하고 다음과 같이 쓰면 볼 수 있듯이 전적으로 임의적입니다 if [ 1 = 1; then. 그러나 요점을 고려하여 내 말을 분명히합니다 :)
Riot

1
function x(){구문에 관하여 : 말한 것처럼 파렌을 떨어 뜨릴 수 있지만 function부품을 떨어 뜨릴 수도 있습니다 . 실제로 POSIX 셸이 함수를 정의하는 방식이므로 더 이식성이 뛰어납니다. 13 자로 전체 기능을 정의 할 수 있습니다. 예 :x(){ startx;}
kojiro

37

APL

팩 토이 드

APL ( P의 rogramming의 L의 anguage)가 고안 수식 표기 통역 시작 켄 아이버슨 . 언어가 설계되었을 때 사람들은 전화 타이프라이터를 사용하여 컴퓨터와 통신했습니다. 이것들의 문자 집합은 제한적이지만, 그들의 구성으로 인해 복잡한 문자를 구성하기 위해 여러 문자를 같은 위치에 넣을 수 있습니다. 이 기능은 APL에서 많이 사용되며 읽기 전용 언어라는 악명 높은 평판에 기여합니다.

http://www.tryapl.org 에서 대부분의 예제를 시험해 볼 수 있습니다 .

길이 1

전등갓이라고 불리는 캐릭터 는 그 모양과 존재로부터 얻는 깨달음 모두에 대한 주석을 소개합니다. 역사적으로 (조트)와 (신발) 을 과장하여 만들어졌습니다 .

길이 2

⍳3

모나 딕 (1 인수) 함수 (iota)는 처음 몇 개의 자연수로 구성된 벡터를 생성합니다. 예를 들어, 위에서 언급 한 ⍳3것은 1 2 3처음 세 자연수의 벡터를 산출 합니다. APL의 몇몇 구현에서,이 수득 것 0 1 2대신에,이 값에 따라 ⎕IO상기 I OTA O rigin.

길이 3

5\3

monadic과 달리 , dyadic \(확장) 함수는 왼쪽의 인수만큼 오른쪽의 인수를 복사합니다. 따라서, 5\3수율 3 3 3 3 3. 1 2 3\4 5 6다음 과 같은 벡터 인수 를 사용하여 그 역할을하는 것이 좋습니다.

길이 4

A←⍳3

A값을에 할당합니다 ⍳3. (왼쪽 화살표)는 대입 연산자입니다. 과제는 진술에서 가장 왼쪽 일 필요는 없습니다. 할당은 함수 호출과 같이 구문 분석되고 나중에 사용할 수 있도록 할당 된 값을 산출합니다.

길이 5

∘.×⍨A

3x3 곱하기 표, 즉

1 2 3
2 4 6
3 6 9

이것은 약간 복잡하므로 설명하겠습니다. ⍺∘.f⍵(읽기 : 오메가 알파 일점 F 점)가 인 외적그리고 위에 f. 외부 곱은 및 f에서 가능한 각 요소 쌍에 적용한 결과의 표입니다 . 이 예에서는 is (곱하기)이므로 곱셈 테이블이 생성됩니다. 오퍼레이터 (물결 분음)이 통근 즉, 그 인수 와 동일 하고 좌측 피연산자 같다없이 . 통근 연산자가 없으면이 스 니펫은입니다 . 외부 제품 운영자는 매우 다양합니다. 당신이 대신 하는 경우 어떻게되는지 확인하십시오 !f×⍺f⍨⍵⍺f⍵f⍨⍵⍵f⍵a∘.×a=×

길이 6

{×/⍳⍵}

계승 함수. 한 쌍의 중괄호는 dfn (동적 함수), 즉 익명 함수 (람다 식 참조)를 묶습니다 . DFN에 인수 변수에 바인딩 하거나 (이항 반대로 두 개의 인수, 하나의 인자)를 DFN는 기능 모나드로 불려 갔을 경우. 올바른 인수에 적용 하여에서 1까지 정수를 생성 합니다 . /(슬래쉬) 연산자, 즉, 감소 f/⍵인서트 f의 항목 간의 . 예를 들어, +/⍳5is 1+2+3+4+5입니다. 이 경우 우리는로 축소하고 의 계승 인의 ×항목을 산출합니다 .⍳⍵

길이 7

2×3*4+5

수율 39366. ⍺*⍵(알파 스타 오메가)는 의 거듭 제곱으로 올라갑니다 . APL에는 매우 간단한 우선 순위 규칙이 있습니다. 모든 것이 오른쪽에서 왼쪽으로 평가되며 모든 기능이 오른쪽 연관입니다. 연산자는 함수보다 더 강력하게 바인딩되며 왼쪽에서 오른쪽으로 평가됩니다. 따라서, 명시적인 괄호로 표현 된 위의 표현 2×(3*(4+5))은 평소와 반대로 쓰여질 것 (2×(3*4))+5입니다.

길이 8

¯1+3 3⍴A

이 스 니펫은

0 1 2
3 4 5
6 7 8

두 가지 중요한 개념을 설명합니다. 첫 번째 개념은 오른쪽 인수를 왼쪽 인수에 지정된 모양으로 재구성 하는 (rho) 함수 입니다. 배열의 모양은 배열에서 각 축 길이의 벡터입니다. 스칼라의 모양은 빈 벡터입니다. 따라서 3 x 3 행렬로 재구성 됩니다. 두 번째 개념은 여기에 덧셈을 사용하는 방법입니다. 음수 1 ( 음수를 지정하는 접두사 , 연산자 인 반면 연산자)을 의미합니다. 두 피연산자는 다른 모양을 가지므로 더 작은 모양의 피연산자는 다른 피연산자에 분산되어 생성 된 행렬의 모든 항목에서 하나를 뺍니다.3 3⍴AA¯1¯-

길이 9

+.×⍨3 3⍴A

A, 3x3 행렬로 다시 모양이 변경되었습니다. .(도트) 연산자는 두 가지 기능을 걸리고 구축 내적 제 기능을 나타내고, 또한 상기 제 2 기능 승산. 평범하고 오래된 행렬 곱셈은 다음 +.×과 같습니다. 공통 변형은 ≠.∧( 같지 않으며 캐럿) 논리적이며 부울 행렬입니다. 많은 흥미로운 것들이 +및 대신에 특정 연산자를 사용하여 내부 제품으로 모델링 될 수 있습니다 ×.

길이 10

(.5×⊢+÷)⍣≡

(읽기 : 왼쪽 괄호 5 개 오른쪽 곱하기 오른쪽 곱하기 + 오른쪽 괄호 나누기 동일) 바빌로니아 방법을 사용하여 실수의 제곱근을 계산합니다 . 왼쪽 인수는 제곱근을 계산하려는 숫자이고, 오른쪽 인수는 제곱근의 초기 추측입니다. 원래 의미있는 초기 추측을 제공하고 싶었지만 문자가 부족했습니다 ( 숫자 자체를 초기 추측으로 사용하도록 추가 ).

어떻게 작동합니까? (.5×⊢+÷)먼저 왼쪽부터 시작하겠습니다 . 이 표현은 J 에서 시작된 암묵적 표기법을 사용하며, 나중에 Dyalog APL로 다시 포팅되었습니다. 암묵적인 표기법은 초보자에게는 조금 어려우므로이 섹션을주의 깊게 읽으십시오. +/÷≢"정상"구문 분석 규칙이 음성의 단일 부분으로 해석되지 않는와 같은 분리 된 시퀀스를 기차라고합니다. 2 개 또는 3 개의 기능으로 구성된 트레인은 기능을 생성하고 (반복 분해능으로) 모든 길이의 기능 트레인도 기능을 생성합니다. 세 함수의 열차 fgh같은 동작 {(⍺f⍵)g⍺h⍵}, 즉, fh에 적용되는 결과의 함수 이러한 결과의 인자에 적용된다 g. 배열의 기차와 같은 두 가지 기능Afg 것처럼 작동{Af⍺g⍵} 이이되는g결과 함수의 인수에 적용 A되고 그 결과가에 적용됩니다 f. 두 기능의 트레인은 시맨틱도 가지고 있는데, 이는 문서에서 설명되었지만이 예제에서는 사용되지 않았습니다.

이 특정 열차에서는 하나의 새로운 기능 (오른쪽 압정)이 사용됩니다. 그것은 {⍵}올바른 인수를 산출하는 것처럼 동작 합니다. 따라서 전체 표현은와 동일합니다 {.5×⍵+⍺÷⍵}. 이는 바빌론 공식의 반복 단계 일뿐입니다. 암묵적인 표기법이 골퍼에게 어떻게 도움이되는지 쉽게 알 수 있습니다. 적용 가능한 경우 귀중한 캐릭터를 상당히 면도 할 수 있습니다.

퍼즐의 마지막 조각은 (star diæresis), 파워 오퍼레이터입니다. 오른쪽 인수가 배열 인 경우, f⍣A⍵적용 f까지 의 총 A시간. 예를 들어, f⍣3⍵동일하다 fff⍵. 카운트는 음수 일 수 있으며,이 경우 APL은 역함수를 유추하여 f적용합니다. 에 대한 권리 주장이 경우 함수는, 너무, f⍣g⍵적용 f까지 (fY)gY어디 Y의 반복 응용 프로그램의 결과 f. 특히 경우가 g있다 =(동일) 또는 (동일한) f⍣≡계산 수정 지점 의을f. 이것이 바로 바빌로니아 방법에 필요한 것입니다! 결과가 수렴 될 때까지 반복하고 싶습니다. 경우 마지막으로, 사물의 한 쌍의 이항 함수로 호출에 적용, 왼쪽 인수에 바인딩 f즉, 왼쪽에 ⍺f⍣g⍵동일 (⍺∘f)⍣g⍵A∘f처럼 동작합니다 {Af⍵}.


더 많은 표를 얻었습니다! 좀 더 주 시겠어요?
luser droog

@luserdroog 물론, 좀 더 생각해 보자.
FUZxxl

이것을 편집하고 확장 할 수 있습니까?
Adám

@ Adám 예, 부탁합니다.
FUZxxl

∘.×⍨a 나에게 가치 오류를 제공합니다 . 올바르게 사용하고 있습니까?
Cyoce

37

MATLAB

스 니펫 26-행렬을 반복

이것은 내가 최근에 발견 한 것입니다. 일반적으로 주어진 루프에서 for 벡터를 반복합니다. 그러나 벡터 대신 행렬을 사용할 수도 있습니다 ( rand(10)0과 1 사이의 숫자가 균일하게 분포 된 10x10 행렬 생성).

for k=rand(10);disp(k);end

그러면 반복마다 랜덤 행렬의 열 벡터가 표시됩니다.

스 니펫 25-쉬운 플로팅

우리는 플로팅는 MATLAB에서 쉽게 알 수 있지만, 아주 쉽게 기능이있다 ezplot( E-Z그것을 얻을 나는 마침내 그것을 가지고 때까지 철자대로, 꽤 걸 렸어요? Z항상 sed대신 c, 어떤 ...) 모든 사람은 타원 곡선을 추천했습니다 :

ezplot('y^2-x^3+9*x-10.3')

타원 곡선

스 니펫 24-통합

적분에 대한 구식 단어 (그러나 여전히 수치 계산에 사용 중)는 '사분면'입니다. 다음 단어의 결과가 무엇인지 추측 할 수 있습니까?

quad(@(x)4./(1+x.^2),0,1)

스 니펫 23-이미지

물론 Matlab은 이미지 (예 : 의료 이미지 분석)를 다루어야하는 과학자들 사이에서 매우 인기가 있으므로 여기에 매우 편리한 기능이 있습니다. 첫 번째 인수는 이미지이고 두 번째 인수는 각도이며 세 번째 선택적 인수는 함수가 이미지를 원래 크기로 자르도록 지시합니다.

imrotate(rand(99),9,'c')

이리

스 니펫 22-음악

load handel;sound(y,Fs)

이런 식으로 들릴 것입니다 (youtube 링크)

스 니펫 21-차별화 및 통합

polyint(polyder(p),c)

이 두 함수를 사용하여 다항식을 쉽게 구별하고 통합 할 수 있습니다. 적분 할 때 상수가 될 두 번째 인수를 전달할 수 있습니다.

스 니펫 20-다항식으로 돌아 가기

p=poly(r);cp=poly(A)

에 근점이있는 다항식을 원하십니까 r? 쉬움 : p=poly(r). 행렬의 다항식을 원하십니까 A? 쉬움 : cp=poly(A). 그래서 roots(p)정확히 r(또는 순열의 r).

스 니펫 19-또 다른 마술

fminsearch(fun,x0);

이 기능을 절대적으로 좋아하는 사람들이 있습니다. 기본적으로에 대한 조건없이 fun초기 값 x0(벡터가 될 수 있음) 으로 최소값을 검색합니다 fun. 이것은 오차 / 벌칙 / 객관적인 기능을 구별 할 수없는 (또는 너무 게으른) 소형 모델에 적합합니다. 그것은 사용 Nelder-미드 단체 법 당신이 어떤 가정을 할 수없는 기능이 꽤 빠릅니다.

스 니펫 18-다항식 소개

p=polyfit(x,y,deg)

Matlab은 다항식에 대처하기위한 훌륭한 솔루션을 제공합니다. 으로 점의 근사값을 구하는 polyfit최소 제곱 다항식을 얻 deg습니다 x,y. p다항식의 계수를 저장 하는 벡터 를 얻습니다 . 다항식을 나타내는 데 필요한 유일한 것이기 때문입니다. 스 니펫 15로 돌아 가면을 작성하여 동일한 작업을 수행 할 수 있습니다 c = polyfit(x,y,2). 예를 들어 [1,-2,3]다항식을 나타냅니다 x^2 - 2*x+3. 물론 다른 기본 기능이나 임의의 기능을 맞추는 기능도 있습니다.

스 니펫 17-각도와 불연속

unwrap(angle(c))

복소수의 '연속'벡터의 인수를 얻으려면 종종 불연속적인 것처럼 보이는 값을 다시 얻습니다. 예를 들면 angle([-1-0.2i,-1-0.1i,-1,-1+0.1i,-1+0.2i])당신을 얻을 것이다 [-2.94,-3.04,3.14,3.04,2.94]이후 angle단 사이의 각도를 반환 -pi하고 pi. 기능 unwrap이 이것을 처리합니다! 이와 같이 불연속이 발생하면이 2*pi를 제거하기 위해 여러 개를 추가합니다 . '[-2.94, -3.04, -3.14, -3.24, -3.34]'2 차원 행렬에서도 작동합니다! 음의 실수 부분으로 복소수의 인수를 플로팅하면 첫 번째 그래픽이 표시되고 첫 번째 이미지가 표시되고 랩 해제하면 두 번째 이미지가 표시됩니다.

풀지 않고 풀다

[x,y] = meshgrid(-1:0.01:0,-0.5:0.01:0.5);
z = x+i*y;
imagesc(angle(z))
imagesc(unwrap(angle(z)))

스 니펫 16-스칼라 곱

[1;2;3]'*[4;5;6]

물론 (와 같은 dot) 메서드가 내장되어 있지만 행렬 변환 연산자를 사용 '하면 간단합니다. 행 또는 열 벡터가 있는지 모르는 a(:)'*b(:)경우 a(:)항상 열 벡터를 반환하는 위치를 사용할 수 있습니다 .

스 니펫 15-선형 최소 제곱, 마술 지팡이가있는 못생긴 방법

[x.^2,x,x.^0]\y

xx 축에 y값이 있고 노이즈 y 값인 (열) 벡터입니다 . 유형 c=[x.^2,x,x.^0]\y과 2 차 다항식의 계수를 얻습니다. 물론 마법 지팡이를 사용하지 않는 MATLAB의 10 억 내장 기능 중 하나를 사용할 수 있습니다 (지루한 방법)?

x = (-1:0.1:2)';
y = 3*x.^2-2*x+1+randn(size(x)); %add some gaussian (normal) noise
A = [x.^2,x,x.^0];
c = A\y              %output: c = ]3.0049; -2.3484; 1.1852]
plot(x,y,'x',x,A*c,'-')

린 레그

스 니펫 14-그래프

gplot(graph,x)

이것이 그래프를 그리는 방법입니다. graph는 인접 x행렬을 포함하고 각 노드의 좌표를 포함하는 nx2 행렬이어야합니다. 임의의 그래프를 graph = triu( rand(8)>.7)만들 수 있습니다 (0과 1을 포함하는 매트릭스를 만들고 흥미로운 그래프의 위 삼각형 만 가져옵니다). x = rand(8,2)그런 다음 멋진 스타일로 플롯gplot(graph,x,'k-.d')

그래프 (저는 이것을 현대 미술로 선언합니다.)

스 니펫 13-메쉬 그리드

meshgrid(a,b)

가장 단순하지만 유용한 기능 중 하나입니다. 두 변수에 따라 실제 값을 갖는 함수를 플로팅하려면 x 축 값과 y 축 값 (a 및 b)에 대한 값으로 구성된 벡터를 정의하면됩니다. 그런 다음 meshgrid를 사용하면 크기가 len (a) x len (b) 인 두 행렬을 만들 수 있습니다. 여기서 하나는 a열로 벡터 만 있고 다른 하나는 열만 벡터 b로 행을가집니다. 사용 예 : a = -3:0.2:3;[x,y]=meshgrid(a)(두 벡터가 동일하면 하나만 전달하면 충분합니다.) 그런 다음z=x.^2+-y.^2 예를 들어mesh(x,y,z). 이것은 임의의 수의 차원에서 작동합니다! 따라서 이것은 플로팅뿐만 아니라 다른 벡터 등의 가능한 모든 조합을 얻는데도 좋습니다 ... (따라서 새로운 코드 골프 언어를 만들려면 여기에 있어야합니다. 기능 이름 ...)

망사

스 니펫 12-플로팅

plot(x,x.^2)

벡터를 가지고 나머지를 x=-3:0.5:3시키 plot십시오. 플로팅을위한 더 많은 기능이 있습니다. 이것은 항상 사용할 수있는 매우 기본적인 기능입니다. 이미 쓰기에 충분 plot(v)하고 데이터 v가 배열 인덱스에 대해 표시됩니다. 얼마나 간단합니까? 플롯의 스타일을 지정하려면 문자열을 세 번째 인수로 추가하십시오. 예를 들어 'r:o'데이터 점 주위에 원이있는 빨간색 점선이 생깁니다. 여러 개의 플롯을 원하면 더 많은 인수를 추가하거나 벡터 대신 행렬을 사용하십시오. 바보.음모

스 니펫 11-함수 핸들

f=@(x,y)x+y

이것은에 저장된 함수 핸들의 예입니다 f. 이제 전화 f(1,2)해서 얻을 수 3있습니다. matlab의 함수 핸들은 수학 함수 (예 : 플로팅)에 매우 유용하며 한 줄로 정의 할 수 있습니다. 그러나 한 가지 단점은 조건부 또는 부분 단위를 사용할 수 없으므로 재귀가 없다는 것입니다. 이것을 원한다면, function명령문 을 사용하고 새로운 함수를 선언해야하며, 각각의 함수는 별도의 파일에 저장되어야합니다 ... (WHYYYYYY ????)

추신 : why콘솔에 입력하면 또 다른 재미있는 이스터 에그가 나타납니다.

The tall system manager obeyed some engineer.
The programmer suggested it.
It's your karma.
A tall and good and not excessively rich and bald and very smart and good tall and tall and terrified and rich and not very terrified and smart and tall and young hamster insisted on it.

... 콘솔을 요구하기에 필사적이라면 매우 위안이됩니다 why...

스 니펫 10-매트릭스는 어떻게 보입니까?

spy(eye(9))

아시다시피 eye(9)9x9 단위 행렬을 만듭니다. spy행렬의 0/0이 아닌 항목을 나타내는를 만듭니다. 그러나 이진 2D 데이터를 표시하는 데 사용할 수도 있습니다. spy인수하지 않고 전화 하면 멋진 부활절 달걀을 얻을 수 있습니다 =)

신원을 감시하다 스파이 부활절

스 니펫 9

kron(a,b)

kron함수 는 두 행렬 의 크로네 커 곱을 평가합니다 . 이것은 불연속 다차원 선형 연산자에 매우 유용합니다. 나는 또한 코드 골프를 위해 때때로 그것을 사용했다. 당신의 항목의 모든 가능한 제품을 원하는 a과를 b? kron(a,b), 여기 있습니다.

스 니펫 8

5*a\b.*b

좋아, 나는 3 명의 다른 연산자를 섞었다. 를 사용하여 행렬에 스칼라를 곱할 수 있습니다 *. 그런 다음 행렬의 모든 항목에 해당 스칼라가 곱해집니다. 그러나 *행렬 곱셈도 수행합니다. 점을 앞에 추가하면 .*연산자가 생깁니다. 이것은 크기는 같지만 항목이 현명한 두 행렬을 곱 합니다. (이것은 또한 같은 부문 사업자와 함께 할 수 /\.)

다음으로 백 슬래시 연산자를 왼쪽 분할로 사용할 수 있지만 ( /오른쪽 분할을 수행하는 것과 달리 ) MATLAB의 가장 강력하고 특징적인 연산자이기도합니다. '매트릭스 분할'을 수행합니다. 당신이 선형 방정식 시스템을 가지고 있고 A*x=b그것을 풀고 싶다고하면 x, 그냥 입력하면 x=A\b됩니다. 그리고 \(당신은 또한 사용할 수 /있지만 그 행렬 덜 일반적입니다) 신속 먼저 매트릭스를 분석하고이 반전 - 곱셈을 수행하는 가장 빠른 알고리즘을 찾기 위해 결과를 사용! (예를 들어 여기 참조 )

그러나 정의가 불충분하거나 과도하게 정의 된 시스템 (역이 존재하지 않거나 매트릭스가 정사각형이 아닌 경우 (예 : 최소 제곱 법))에도 사용할 수 있습니다. 이것은 정말 matlab 의 마술 지팡이 입니다.

스 니펫 7

[a,b;c]

좋아 보이지는 않지만 매우 편리한 도구입니다. 매트릭스 연결. 두 표현식 사이의 쉼표는 가로로 연결됨을 의미하며 (즉, 동일한 높이를 가져야 함) 세미콜론은 이전 '줄'이 다음 '라인'위에 있음을 의미합니다. 그냥 간단한 예 : a = [1,2;3,4]; b = [5;6]; c =[7,8,9]; d=[a,b;c];같은 발생합니다 d같은 d=[1,2,5; 3,5,6; 7,8,9](그것을 얻을?).

스니핑 6

eye(7)

이 함수는 완전한 7x7 항등 행렬을 생성합니다. 그렇게 쉽습니다. 같은 기능을하는 다른 기능도 nan,inf,ones,zeros,rand,randi,randn있습니다. (두 개의 인수를 전달하면 결과 행렬의 높이 / 너비를 설정할 수 있습니다.) 나중에 보여 주듯이, 행렬 (2d 배열)을 쉽게 만들고 (매우 시각적으로) 연결할 수 있습니다. 부분 미분 방정식을 수치 적으로 풀어야하는 경우에 용이합니다. (PDE를 풀 때 일반적인 접근 방식은 미분 연산자를 구별하는 것입니다. 기본적으로 해결해야 할 거대한 선형 방정식 시스템을 얻을 수 있습니다.이 행렬은 일반적으로 희소하고 (제로가 아닌 요소가 거의 없음) 일종의 이것이 필요한 매트릭스를 쉽게 '구성'할 수있는 이유입니다.

스 니펫 5

a(a>0.5)

어레이에 액세스하는 모든 방법으로 피곤하지 않기를 바랍니다. 이것은 어떤 조건을 만족시키는 배열의 모든 요소를 ​​얻는 쉬운 방법을 보여줍니다. 이 경우 모든 요소의 벡터 a가 0.5보다 큽니다. 이 표현식 은 조건을 만족하는 각 요소에 대한 a>0.5행렬 a0그렇지 않은 각 요소에 대한 행렬과 동일한 크기의 행렬을 반환합니다 .

스 니펫 4

a(:)

다시 내용을 a열 벡터 (nx1 행렬)로 반환합니다 . 데이터를 열 또는 행 벡터로 저장했는지 또는 데이터가 2 차원 (예 : 2 차원 유한 차분 법) 인 경우 알 수없는 경우에 유용합니다.

스 니펫 3

1:9

세미콜론 연산자를 사용하여 벡터 (이 경우 1xn 행렬)를 쉽게 만들 수 있습니다. 이 경우 벡터를 얻습니다 [1,2,3,4,5,6,7,8,9]. 이것은 또한 예를 들어 벡터 a(2:4)의 제 2, 제 3 및 제 4 요소에 액세스 할 때 다른 벡터의 슬라이스에 액세스하기에 특히 바람직하다 a. 단계 크기와 같이 사용할 수도 있습니다 0:0.5:10.

스 니펫 2

i;

세미콜론은 콘솔로의 출력을 억제합니다. 당신은 그것을 좋거나 나쁜 것으로 볼 수 있지만, 나는 물건을 디버깅하기 위해 그것을 좋아합니다. 세미콜론으로 출력을 억제하지 않는 한 계산 라인 등은 콘솔에 결과를 자동으로 인쇄합니다.

스 니펫 1

i

복소수는 기본 숫자 유형입니다. ( ifor 루프에서 계산 변수로 사용 하는 사람들이 너무 나쁘면 이 경우 재정의됩니다.)

소개

모르는 사람들을 위해 MatLab은 프로그래밍 언어 (매트 IDE라고도하는 멋진 IDE를 가지고 있습니까?)는 우선 수치 계산 및 데이터 조작을위한 것입니다. ( "Octave"라는 오픈 소스 대응이 있습니다.) ** 해석이 빠르지는 않지만, 장점은 매트릭스를 쉽게 조작 할 수 있고 많은 알고리즘이 매우 빠르게 실행되도록 최적화 된 방식으로 구현된다는 것입니다 행렬에 적용될 때. 또한 배우기 매우 쉬운 언어이지만, '프로그래밍'습관이 나쁜 것으로 가정하므로 초보자 언어로 권장하지 않습니다.

* 통역 언어이므로 값 비싼 프로젝트의 경우 속도가 매우 느릴 수 있지만 내장 된 병렬화 방법이 있으며 여러 컴퓨터를 함께 사용하여 프로그램을 실행할 수도 있습니다. 그러나 정말로 빨리 가고 싶다면 여전히 C 또는 Fortran 또는 그와 같은 미친 물건에 의존한다고 생각합니다. 그러나 여전히 많은 구현 알고리즘 (행렬 곱셈, 선형 방정식 해결 시스템 등)이 크게 최적화되어 성능이 뛰어납니다. 그러나 Matlab 자체에서 동일한 알고리즘을 프로그래밍하면 기다릴 필요가 있습니다 =) .)

** 프로그램을 일종의 컴파일 할 수 있지만 주로 소스 코드를 읽을 수없는 파일 (사람의 경우)로 변환합니다.


1
이 문제가 자주 발생합니다 ... i무언가로 설정 한 다음 복잡한 단위가 아닌 경우 예기치 않은 동작이 발생합니다.
feersum

3
좋은 부활절 달걀! 'edit spy'를 입력하면 코드 난독 화의 예를 찾을 수 있습니다. :-)
Abulafia

1
나는 이것을 높이기 위해 갔다가 이미 가지고 있음을 깨달았다. 아아, 내가 다시 찬성 할 수 있다면. 계속가요, @flawr!
Alex A.

2
보여줄 것들에 대한 영감이 부족한 경우 Mathworks 블로그를 추천 할 수 있습니다 . Loren Vershure의 MATLAB의 예술 (Art of MATLAB)에서는 종종 글자 수 한도 내에서 표시 할 수있는 모범 사례를 설명합니다. 호기심 위해 고려 matlab에 포기 하고, 문서화되지 않은 기능과 특징에 대해 당신이 갈 수 Yair 알트만에 의해 문서화되지 않은 matlab에
데니스 Jaheruddin

1
@flawr-사실, MATLAB은 역사적으로 뉴 멕시코 대학교의 컴퓨터 과학 (Cleve Moler는 당시 회장)의 학생들을 위해 쉽게 인터페이스되었다는 사실을 언급하는 것이 좋습니다. LINPACK아이스팩 (... 지금에 의해 대체되고 LAPACK FORTRAN을 배울 필요없이) ... 때문에 사용의 용이성, 그것은 : 매우 빠르게 다른 교육 기관으로 확산
rayryeng

35

CJam

아래 스 니펫을 사용해보십시오.

길이 20 스 니펫 :

q~{]__~z\z<=\~*0>*}*

최소 모드 계산기 . 질문에서 발췌 :

minmod의 함수 친숙한 변형이다 편미분 방정식에 대한 기울기 제한 고해상도 구조에서 나타난다. 여러 개의 경사면이 주어지면 경사면 사이의 상대적 표시를 처리하면서 가장 평평한 경사를 선택합니다.

이 함수는 임의의 수의 매개 변수를 사용합니다. 그런 다음 minmod (x 1 , x 2 , ..., x n ) 은 다음과 같이 정의됩니다.

  • 모든 x i 가 엄격하게 양수인 경우 min (x 1 , x 2 , ..., x n )
  • 모든 x i 가 엄격히 음수 인 경우 max (x 1 , x 2 , ..., x n )
  • 그렇지 않으면 0 입니다.

길이 18 스 니펫 :

l'[,65>Dm>_el+_$er

ROT13 엔코더. a-zA-ZSTDIN을 통해 입력 문자열에서 문자 만 이동합니다.

길이 15 스 니펫 :

T1{_2$+}ri2-*]p

STDIN을 통해 입력으로 제공되는 N피보나치 시리즈 의 첫 번째 숫자 를 인쇄하는 전체 프로그램 N입니다.

길이 12 스 니펫 :

{{_@\%}h;}:G

간단한 GCD 기능. 이것은 2706 410 G스택에 GCD를 얻는 것과 같이 사용될 수 있습니다 .

길이 11 스 니펫 :

123456 789#

#전력 운영자입니다. 이 스 니펫은 거의 모든 수학 연산에서 BigInts를 지원하는 CJam의 멋진 기능을 보여줍니다. 위 코드의 출력은

1596346205622537943703716803040694151242100030904924074732295184521676912291137885341977590649991707684635184329980991487148618486236239062505001539322685142817506810040361209550544146292158784625519911512640361780862459268161619223326802388689703997604303632605734938879647069477372395799326590488746599202521617640394227957532720581758771344616555153473551874187964029973716015080326283503474062024803237072761129557356772954771383125420283743787215768524095651476398918270831514362626616089349128838080859262141293069421199363839940462244772673481244848208112002212957221705577938865719802035511067875502253218277834350725436729497351901219311577128600087062378434520948898301738545267825952998284599001356281260973911216650526574435975050678439968995805415462116669892745933523276658479456263859786003695570642598885206779863730608803831608206418317758451327165760242416052588688579435998154295782751455020445483571514197850814391880423853968520336337963918534259580183058727377932419280412466915889059399591196961188841001024998633317094826403760131868252088477018937989608302521450181593409274231460335072324865982559395114735391976545471553525054490202974741119144469523879456646833238659929705233941114530149037245274032070536718197592615630616792756562341411027203615235147973615347081993563361626845258162606172599728677944001956482301240050182368840648532697569098833480384074404562991348377266778603059081932412368912313845464302833428950934701568958836851009236647605585910687215977468114323293396641238344799575626940766355697576957869656153567798618227770961980620119004224798449940378878601283741944503399682599666873704888519152796472231721010884561046439019823540214190109829183178504573391524533915085342799888899681052113605127068137552531204917650779012455136663716975904242872042805633443567570913936237754642040107392687168596924804730637819953463737212774674563401663682370631910559669378413063684132477269578881395521544729393136204246705936061735379354437327940116154383441927197123218522827575163913310005036963663583344508839784971260123709283218409462028161021477446586507813599051643059982983426688872855309396405653159417356549291603532443699350168178837164682957610433456205211423600319694496115159970718912091395232327389520091646132878609779171226748990343349416763319432268713023302555895744813731889452605219001900815755497209921418814092923394321459962373890912709775151652200071533644718727513889263907829300496554849544461628702471995210369421320165755673222520834013956492183306187393652197405863508709529644837118590847002900783148394313160749018413291215958936871830666201928218294362550829287373305552379418641499562597137520153409556227576809855521876196531587454478159211299517511047868125975115347272184123454929507976958328038242400918390689757262398695703472270927183494613959476164389143107240083171566284628032072645081703351075328092783401422849512230275075331561337345714881104575020436358133210849231625973013523497330004645467493618279226202227586584610761439335895760888873155403816627190368675397978355381544497413492223577022267403347927237298551052219150516984577176643706356698282552857754120841266435149587248192704898338826251727748499150285409036076919533685800933215325289882260771526293167171975367192287689881199864600661035143522211647660445960687046757311913589429739868592726372013684511683081229044622752191694278221303073075505531920922815724661725685493922212700535444400760813940151761980008355835574184921854364539924999643954874549857103642483664109073938527328920827803218865362851320233433429604394590974694396314165313743853607609394553133883545319222169958204731303672940856293527174545435349105954532301106962634516087237739490953930886293289854731305112253177512851251930821765454042415085420000484369355605183062368648992392499663861508991984554431113080399485470268940148600970493633737364443822752829774334511729579419931500217970224646496435527826186627011323464848141074486509849545954714213290443775688291020289759390171236344528896

길이 10 스 니펫 :

"`%W_"_W%`

우리는 이미 quine을 완료했습니다. CJam에서 가장 짧은 리버스 퀴니 중 하나입니다. 역 quine은 소스 코드를 역순으로 인쇄하는 quine입니다.

길이 9 스 니펫 :

5,K,+_&S*

이 스 니펫은 CJam의 많은 기능을 보여줍니다.

5, "create an array of numbers 0 to 4"
K, "create an array of numbers 0 to 19"
+  "List concatination"
_  "Duplicate top stack element"
&  "Set distinct operator in this case"
S* "Join array elements with space character"

길이 8 스 니펫 :

"`_~"`_~

CJam에서 가장 작은 퀴인 중 하나입니다. 이것은 실제로 어떤 식 으로든 소스 코드를 읽지 않는다는 의미에서 진정한 소란입니다. (CJam에서는 소스 코드를 읽을 수조차 없습니다)

길이 7 스 니펫 :

"AB"_m*

m*상위 2 개의 스택 요소의 모든 카티 전 곱을 만듭니다. 예를 들어, 위의 코드를 넣어 ["AA" "AB" "BA" "BB"]의 직교 제품이다, 스택에 "AB""AB".

길이 6 스 니펫 :

"_~"_~

멋진 반복 코드입니다. 이것을 실행하지 마십시오 :). 이 코드 표현은 CJam에서 가장 간단한 퀴니의 기초입니다. 문자열 "_~"을 스택에 넣고 복사 ( _)하고 평가합니다. 최대 재귀 예외에 도달 할 때까지 차례로 동일한 작업을 다시 수행합니다.

길이 5 스 니펫 :

{A}:F

CJam에서 기본 기능이 작동하는 방식입니다. 위 식은 코드 블록 {A}을 variable에 할당합니다 F. 이제 코드에서 F어디에서나 코드 블록을 실행할 수 있습니다 ( 10이 경우에)

길이 4 스 니펫 :

"A"~

를 사용하여 모든 코드 블록 또는 문자열 또는 단일 문자를 평가할 수 있습니다 ~. 위의 표현은10

길이 3 스 니펫 :

Kmr

0에서 K20 까지의 전형적인 난수 생성기 .

길이 2 스 니펫 :

es

현재 타임 스탬프 (에포크에서 밀리 초)를 제공합니다. CJam et은 현재 시간의 다양한 부분 (일, 시간 등)으로 구성된 배열을 반환하는보다 유용한 형식의 현지 시간 도 있습니다 .

길이 1 스 니펫 :

A

CJam은 사전 정의 된 변수로 거의 모든 대문자를 가지고 있습니다. A, 10 B11과까지 K이다 (20)는 P이다 pi (3.141592653589793), N새로운 라인이며 많은 사람들을 . 변수에 초기 값이 필요할 때 또는 1 바이트에 두 자리 숫자가 필요한 경우에도 매우 유용합니다.

팩 토이 드

CJam은 GolfScript에서 영감을 얻었지만 네트워크 GET 호출 지원을 포함하여 그 위에 많은 기능을 빌드합니다.

추신 : 나는 5 upvotes마다 또는 2 시간마다 (둘 중 더 빠른) 답변을 업데이트하려고합니다.


ROT13 예제와 관련하여 몇 가지 문제가 있습니다 : p 그러나 나는
quine에

@aditsu 문제가 무엇입니까?
Optimizer

nz 문자의 경우를 변경합니다. 또한 아무 이유없이 @가 있으므로 대신 D를 넣을 수 있습니다.
aditsu

@aditsu a-zA-Z 범위에 걸친 ROT 13이 케이스 변경의 이유임을 확신하십시오. 읽을 수 없습니까? 그것의 유일한 당신의 자신의 언어 : P @ 나는 18 문자를 위해 거기에 생각한다 : D
Optimizer

그것은 ROT13이 일반적으로하는 것이 아닙니다. 내 언어를 읽을 수 있는지 묻는 이유를 이해하지 못합니다. 문제는 프로그램의 기능을 이해하는 것이 아니라 예상 한 것을 수행하지 않는다는 사실입니다.
aditsu

34

공통 리스프

LIST Processing의 Lisp는 오늘날까지 가장 오래된 언어 중 하나입니다 (FORTRAN 만 더 오래됨). 코드가 데이터이고 데이터가 코드 인 첫 번째 언어로 주목할 만하다. 호모 닉 (homoiconicity)이라고합니다. 가비지 콜렉션이있는 최초의 언어이기도합니다. 존 매카시 (John McCarthy)가 1958 년 논문에서 완전히 이론적 인 언어로 원래 디자인 한이 책은 스티브 러셀 (Steve Russel)이 평가 기능이 컴퓨터에서 구현 될 수 있다는 것을 깨달았을 때 실제 언어가되었습니다. 인공 지능에서 가장 많이 사용되며 괄호의 우세에서 즉시 인식 할 수 있습니다. Common Lisp는 기존의 Lisp 방언을 표준화 된 형태로 통합하기 위해 설계되었습니다.

나는 모든 스 니펫을 자체적으로 실행할 수 있도록 노력할 것입니다.하지만 반드시 가치있는 것은 아닙니다. 또한 Common Lisp를 사용하기 때문에 기본 개념과 많은 구문이 다른 방언에 적용되지만 특정 기능은 작동하지 않습니다 (예 : Scheme).

길이 1

*

코딩을 위해 S- 표현식과 목록을 사용하는 것을 강조하기 때문에 Lisp에는 원자라고하는 괄호를 포함하지 않는 유효한 표현이 거의 없습니다. REPL (read-eval-print loop)에 직접 입력 된 것은 변수로 취급되며 그대로 평가됩니다. *REPL에 의해 인쇄 된 이전 값을 보유합니다.

길이 2

()

이것은 Lisp에서 가장 중요한 상징 중 하나 인 빈 목록입니다. Lisp의 모든 적절한 목록은 C의 모든 적절한 문자열이로 끝나는 것과 비슷한 빈 목록으로 종료됩니다 \0.

길이 3

(*)

이것은 괄호로 묶인 기호로 구성된 기본 함수 호출입니다. Lisp에는 연산자가 포함되어 있지 않으며 기능도 있습니다. 실제로 이진 함수가 아니기 때문에 곱셈을 선택했습니다. Lisp의 곱셈 연산자는 무제한의 인수를 취합니다. 인수가 주어지지 않으면 1곱셈에 대한 항등 연산자를 반환합니다 .

길이 4

`(1)

이것은 단점 셀이며 한 쌍의 요소라고 말하는 또 다른 방법입니다. Lisp에서 각 목록은 cons 셀에 연결된 cons 셀로 구성되며, 여기서 첫 번째 요소 ( car)는 값이고 두 번째 요소 ( cdr)는 다음 cons 셀을 가리 킵니다. 이것은 링크 된 목록을 기반으로하는 Lisp의 기초를 형성합니다. 이 특정 단점 셀은 1자동차로, 빈 목록은 cdr로 사용합니다.

길이 7

(not t)

Lisp에서 진실의 가치를 다루고 싶습니다. 이 반환 nil됩니다. 커먼 리스프 년 t동안 사실에 대한 상징이다 nil()거짓 표현하고 서로 동일하지만,이 정의는 모든 리스프 방언의 표준가 아닙니다; 예를 들어, Scheme #f은 false와 '()빈 목록을 구분 합니다.

길이 9

(cdr ())

앞에서 말했듯이 cdr은 목록의 꼬리 요소이며 함수로 얻을 수 있습니다 cdr. 마찬가지로 함수를 사용하여 head 요소 인 car를 얻을 수 있습니다 car. 아주 간단 하죠? 빈 목록의 자동차와 cdr은 둘 다 nil입니다.

길이 10

(cons 1 2)

마지막으로 목록 작업을 시작하기에 충분한 길이입니다. cons첫 번째 매개 변수는 car이고 두 번째 매개 변수는 cdr 인 cons 셀을 만듭니다. 그러나 인쇄물을 인쇄하는 대신 (1 2)제공합니다 (1 . 2). 길이 2 스 니펫으로 돌아 가면 적절한 목록이 빈 목록으로 끝나야하므로 마지막 죄수 셀의 cdr은 빈 목록을 가리켜 야합니다. 이 경우 마지막 죄수 셀은을 가리 키 2므로 Lisp는 우리에게 부적절한 목록이 있다고 알려주지 만 a없이 C 문자열을 만드는 방법과 같이 여전히 그렇게 할 수 있습니다 \0.

길이 11

(cons 1 ())

이제 우리는 올바르게 구성된 첫 번째 목록을 만들었습니다. 자동차 1와 cdr이 있는 단일 죄수 셀 입니다 (). 당신은 다른 모든 목록에 대해, 나는 역 따옴표 / 틱으로 이끌었다는 것을 알 수 있습니다. 다른 적절한 목록은 첫 번째 인수를 나머지 요소를 매개 변수로 사용하는 함수로 평가하려고 시도합니다. 엄밀히 말하면 ()목록은 아닙니다. 빈 목록을 나타내는 a (와 a 로 구성된 기호 )입니다. Lisp을 사용하면 기호 이름에 거의 모든 인쇄 가능한 문자를 사용할 수 있으며 원하는대로 기호를 재정의 할 수 있습니다.

길이 12

(cdr `(1 2))

이것은 일부 사람들이 추측 (2)하지 않은 2것처럼 출력 됩니다. 각 cdr은 다른 단점 셀이나 빈 목록을 가리켜 야합니다. 분명히 2빈 목록은 아니므로 자동차 2와 cdr의 다른 단점 셀이어야합니다 ().

길이 13

'#1=(1 . #1#)

이렇게하면 단일 값이 1 인 원형 목록이 생성됩니다. 인쇄 된 경우 "(1 1 1 ...")가 영원히 인쇄되므로 실제로 무한 목록으로 간주 될 수 있습니다 ( cdr무한 시간을 수행 할 수 있음) 항상 같은 결과를 얻을 수 있습니다!) T전역 변수에 할당하지 않으면 *print-circle*로 인쇄됩니다 #1=(1 . #1#).


그 마지막 편집! 누군가가 비틀즈를 테마로 한 esolang : D
fede s를

1
@ 페더스. 존 매카시, 폴 매카트니 ...이 언어는 CarthyCartney라고합니다.
고양이

33

GNU 메이크

나는 이것에 대해 사지에 나갈 것입니다. makePPCG에 처음 등장한 것은 이번이 처음이라고 생각합니다 .

팩 토이 드

make는 기능적 언어로 간주 될 수 있습니다.

길이 0 스 니펫

길이 0 스 니펫이 필요하다고 생각하지 않지만 여기에 하나가 있습니다. 나는 이것이 모든 길이 0 프로그램 중 가장 유용하다고 생각합니다. 빈 Makefile (또는 makefile이 전혀 없음)으로 make에는 여전히 많은 내장 규칙이 있습니다. 예를 들어 .c 파일이 현재 디렉토리에 존재하는 경우 .c 파일을 .o 또는 이진 파일로 컴파일하는 기본 내장 규칙이 있습니다. 따라서 우리가 할 경우 :

make hello.o

make는 .c에서 .o 규칙을 찾고 hello.c를 컴파일하여 hello.o를 제공합니다.

마찬가지로 우리가 할 경우 :

make goodbye

현재 디렉토리에 goodbye.c 파일이 있으면 goodbye 바이너리로 컴파일됩니다.

길이 1 스 니펫

TAB

네, TAB 캐릭터입니다. 이것은 그 자체로 많은 것을하지는 않지만 Make에 큰 의미가 있습니다. 특히 규칙에서 목표 정의를 따르는 모든 레시피 라인은 TAB으로 시작해야합니다. TAB과 공백이 섞일 때 makefile을 디버깅 할 때 모든 종류의 좌절이 발생합니다.

길이 2 스 니펫

$@

레시피에 사용하기위한 자동 변수입니다. 규칙 대상의 파일 이름으로 확장됩니다. 있습니다 기타 유용한 자동 변수는 .

길이 3 스 니펫

a:=

간단하게 확장 된 변수 할당입니다. 변수 a는 Makefile이 처음 구문 분석 될 때 즉시 ""로 설정됩니다. 대신 우리가 할 경우 a=, 할당은 재귀 적으로 확장됩니다. 즉, 변수가 실제로 참조 될 때까지 확장이 지연됩니다.

길이 4 스 니펫

W:;w

최소한의 유용한 유용한 규칙 사양. W단순히 w쉘 명령을 실행하는 규칙 으로 대상 을 정의합니다 . 그러므로

make W

다음과 같습니다.

w

이것은 레시피가 새로운 라인으로 분리 된 동일한 라인의 타겟을 따르기 때문에 대체 규칙 구문입니다. 더 일반적으로 레시피 라인은 TAB각 레시피 라인을 시작 하는 문자 와 함께 별도의 대상 라인을 따라갑니다 .

길이 5 스 니펫

$(@D)

다른 자동 변수. 와 비슷 $@하지만 파일 이름과 후행 / 제거와 함께 경로의 디렉토리 부분으로 확장됩니다.


아마도 어떤 문자열 기능은 $(basename )또는 $(patsubst )? ( 예. )
LUSER의 droog

32

놀라운

길이 14 스 니펫

}0}1
Mulx
HxHx

이 스 니펫은 Marbelous 라이브러리를 더 보여주고 새로운 개념, 즉 다중 셀 보드를 소개합니다. Mulx보드 입력으로 두 구슬을 얻어 2 개 구슬을 출력한다. 의 가장 왼쪽 셀에 들어가는 구슬 Mulx은 해당 }0보드 의 장치와 가장 오른쪽 셀에 해당합니다 }1. 마찬가지로 출력도 다른 셀에서 나옵니다. 보드의 너비 MAX(1, highest output device + 1, highest input device + 1)는 입력 장치에 해당하지 않는 셀이 그 위에 떨어지는 모든 대리석을 버리기 때문에 계산할 수 있습니다 .

길이 13 스 니펫

7E
??
>Y!!
{0

이것은 각 진드기에 무작위로 인쇄 가능한 ASCII 문자를 뱉어내는 보드입니다. Marbelous에는 임의의 값을 생성하는 두 가지 방법이 있습니다. 이 ??공하고, 포괄적 수신 입력 대리석 사이의 임의의 값을 반환하고, ?n: ?0최대 ?Z각각. 다음과 매우 유사하게 작동합니다 ??. 또한 !!모든 출력이 채워지지 않더라도 보드를 종료합니다. ?nMarbelous에서 장치를 어떻게 보드로 구현할 수 있는지 알아낼 수 있습니까 ???

길이 12 스 니펫

}0}1
Fb//
Dp

여기서 우리는 Marbelous의 몇 가지 라이브러리 기능이 작동하는 것을 볼 수 있습니다. Fbn은 입력 대리석 인 n 번째 피보나치 수를 출력합니다. Dp입력 대리석을 STDOUT에 10 진수로 인쇄합니다. 이것들은 Marbelous에서 구현되며 온라인 인터프리터 에서 라이브러리 포함을 확인할 때 호출 될 수 있습니다 . 파이썬 인터프리터의 경우 각 파일을 명시 적으로 포함해야합니다. 이 보드의 보완은 github 에서 찾을 수 있습니다 . 이 특정 프로그램은 2 개의 입력을 받고 피보나치 보드를 두 번 호출합니다. 호출 된 보드는 호출 한 보드의 1 틱 내에 반환됩니다.

길이 11 스 니펫

}0}0
{<{0{>

이것은 약간의 설명이 필요합니다. }0장치가 동일한 번호 (0)를 갖고 있기 때문에이 보드가 호출 될 때, 그들은 같은 값을 포함, imputs 있습니다. 하단 행에있는 3 개의 장치가 출력됩니다. {<보드의 왼쪽에 {0출력 하고 보드 의 첫 번째 셀 아래에 {>출력하고 오른쪽에 출력합니다. 모든 개별 출력 장치가 채워진 경우에만 출력이 푸시됩니다. 그러나이 경우 올바른 출력 장치에 도달하지 못합니다. 보드는 활동이 부족하여 종료되고 어쨌든 두 가지 값을 출력합니다. 어떻게 /\Marbelous 보드로 구현할 수 있는지 상상할 수 있습니까 ?

길이 10 스 니펫

..40
FF
\\

여기 Marbelous에서 중요한 역할을하는 몇 가지가 있습니다. 먼저 추가가 있습니다. 보드에서 두 구슬의 경로를 추적하면 동시에 같은 셀에서 끝날 것입니다. 이런 일이 발생하면 함께 추가됩니다. (재미있는 사실 : 언젠가는 구슬을 합치 지 않고 스택을 형성해야한다고 생각했습니다.) 그러나 Marbelous는 8 비트 언어이므로 구슬을 추가하는 FF것은 1을 빼는 것과 같습니다.

길이 9 스 니펫

00
\\/\]]

이것은 Marbelous에서 초보적인 고양이 버전을 구현하는 가장 짧은 방법입니다. 00 \ / \ 매 초 틱마다 장치 00에 가치있는 구슬 을 넣는 루프입니다 ]]. 이것은 STDIN 장치입니다. 이 장치에 대리석이 떨어지면 STDIN에서 첫 번째 문자를 읽으려고 시도합니다. 문자가 있으면 아래로 밀립니다 (이 경우 다시 인쇄). 없는 경우 원래 amrble이 오른쪽으로 푸시됩니다. (이 경우 휴지통)

길이 8 스 니펫

}0
~~
{0

이 스 니펫은 몇 가지 기능을 보여줍니다. 먼저} 0을 통해 입력을받습니다. 이 경우 이것은 메인 보드이며 명령 행 입력으로 대체됩니다. 이 함수를 호출 할 수도 있습니다.이 경우 명령 행 입력 대신 인수가 사용됩니다. 그런 다음 ~~비트 연산자가 아닙니다. 그런 다음 }0모든 }n장치가 채워지면 함수 반환 값으로 이러한 값이 반환됩니다. (Marbelous는 함수 당 하나 이상의 반환 값을 지원합니다)

길이 7 스 니펫

00
\\/\

이것은 Marbelous에서 만들 수있는 가장 컴팩트 한 무한 루프입니다. 이 \\장치는 대리석을 오른쪽으로 밀고 구슬을 /\복사하여 한 사본을 왼쪽으로 밀고 다른 사본을 오른쪽으로 밀었습니다. 보드는 너비가 두 셀에 불과하므로 오른쪽의 대리석이 지워집니다.

길이 6 스 니펫

46MB75

재귀의 예는 다음과 같습니다 MB(암시 적으로 명명 된 메인 보드는 모든 호출에서 FuSTDOUT으로 인쇄 하기 전에 모든 틱에서 호출됩니다 (결과는 다음과 같습니다) FuFuFuFuFuFu....

길이 5 스 니펫

2A
++

약간의 산술, 가치를 가진 구슬은 2A첫 번째 진드기에 떨어지고 그 자체는 ++세포 에서 발견됩니다 . 이것은 운영자입니다. 이 특정 연산자는 그 위에 올라간 대리석을 증가시켜 떨어 뜨립니다. 대리석은 이제 가치 2B가 있으며 보드에서 떨어집니다. +STDOUT으로 인쇄 됩니다.

길이 4 스 니펫

:
24

두 명의 통역사가 동의하지 않습니다.이 예제에서 파일의 첫 번째 보드에 이름을 지정했습니다 (이름은 빈 문자열 임). 파이썬 인터프리터는 이것이 메인 보드라고 가정하고 프로그램을 실행할 때이 보드를 호출합니다 (인쇄$ ). 자바 스크립트 인터프리터가 메인 보드를 찾지 못해 진입 점이 없습니다. 이것은 Marbelous 용 라이브러리 파일을 작성할 때 유용 할 수 있습니다.

길이 3 스 니펫

:Bo

이것은 이름이없는 보드이며, 몸이 없으며, 보드 Bo의 셀 에 글을 써서이 보드를 호출 할 수 있습니다 ( Bo자체 포함 ).

길이 2 스 니펫

3A

이 코드는 1x1 셀 (각 셀은 두 문자 너비) 보드의 본문이며 암시 적으로 이름이 지정됩니다 MB(메인 보드 용). 3A대리석이 보드에서 떨어질 때의 16 진수 값의 ASCII 값을 인쇄합니다 . 이 프로그램의 출력은 다음과 같은 소스 코드가됩니다.

길이 1 스 니펫

:

와 함께 #, 이것은 놀라운 두 가지 유일한 1 문자 프로그램 중 하나입니다. #그것은 그다지 흥미롭지 않은 주석의 지표입니다. :보드를 선언하려고한다고 몹시 알려줍니다. 두 컴파일러 중 어느 것도 실제로 보드의 이름을 지정하거나 정의하지 않는 것을 신경 쓰지 않습니다. 이 프로그램은 아무것도하지 않습니다.

사실 :

Marbelous는이 사이트의 사람들에 의해 개발되었으며,이 언어로 실행중인 일부 이름은 Rube and simply Marbles 입니다.


2
나를 이길. 좋은 발췌 문장!
Sparr

길이 12 스 니펫은 두 개의 입력을 받고 두 개의 다른 피보나치 수를 인쇄하는 것 같습니다. 의도적인가요?
Sparr

@Sparr, 예, Marbelous에서 함수가 어떻게 작동하는지 보여주었습니다.
overactor

설명에 추가하면 될까요? 당신이 쓴 것에서, 스 니펫은 하나의 입력을 받고 하나의 fib 번호를 출력 할 것으로 기대합니다.
Sparr

내 피보나치 기능이 잘 맞도록 40 점을 얻었 으면 좋겠습니다.
Sparr

31

앞으로

Forth에는 int와 floats의 두 가지 유형 만 있고 float는 선택 사항입니다! 그러나 여전히 char, string, long long int, 포인터, 함수 포인터, 구조체 등을 갖습니다. 그것은 당신이 그것을 사용하는 방법에 모두 있습니다!

길이 1

.

.명령 (또는 "단어"라고 함)은 데이터 스택 위에 정수 값을 인쇄합니다. 스택이 비어 있으면 런타임 오류가 발생합니다. 또한 스택에서 값을 제거합니다.이를 유지하는 방법을 알아 보려면 투표하십시오.

길이 2

.s

.s단어는 그 중 하나를 제거하지 않고, 현재 스택에 값을 표시합니다. 또한 총 값 수를 표시합니다. Gforth에서는 .s기본적으로 상위 9 개 값만 표시하도록 제한되어 있습니다. 더 보여줄 방법을 찾을 수 있을까요?

길이 3

see

유형 see모든 넷째 단어 다음에 그 단어의 소스 코드를 볼 수 있습니다. 대부분의 Forth 단어는 Forth 자체에서 정의되며 소수의 프리미티브 만 어셈블리에서 정의됩니다.

길이 4

1 0=

Forth가 접미사 연산자가있는 스택 기반 언어라고 언급 했습니까? 입력 하면 스택으로 1 0=푸시 1된 다음 0=단어가 실행됩니다.이 단어는 스택에서 최상위 값을 팝하고 true0 false이 아닌 경우 푸시 합니다 . 0=편의 단어이다 0 =; 이 같은 일반적인 값 + 단어 조합에 대한 그것과 같은 몇 가지 속기 단어입니다 1+0<>. 또한 falseForth가 0이고 0이 아닌 값이 true 인 경우 내장 테스트 단어 true는 실제 결과를 반환 true하고 모든 비트 세트가 설정된 값입니다 -1.

길이 5

-1 u.

-1스택 위로 밀고 튀어 나와 부호없는 정수로 인쇄합니다. Forth 버전에서 부호없는 int의 최대 값을 신속하게 확인하는 데 사용할 수 있습니다 (단, 기본적으로 지원되는 최대 정수 값은 아님). "int와 함께 .언제 인쇄해야하는지 어떻게 알 수 u.있습니까?" 답 : .서명 u.이 있거나 서명이 없을 때. "이것이 내가 의미 한 바가 아닙니다." "스택 상단의 값이 서명 된 시점과 서명되지 않은 시점을 어떻게 알 수 있습니까?" 답변 : 당신은 프로그래머입니다 – 그게 당신의 일입니다! 스택의 각 정수가 int, unsigned int, a int*, a를 나타내는 지 알아야합니다 .char*, 함수 포인터 또는 기타 또는 그렇지 않으면 코에 악마가 생깁니다. Forth는 당신을 위해 그것을 추적하지 않을 것입니다. 이게 뭐야, C?

길이 6

." Hi"

인쇄 Hi합니다. ."는 Forth 단어 (모든 Forth 단어와 마찬가지로 공백이나 EOF 뒤에 와야 함)는 다음을 통해 입력 스트림을 읽고 그 "사이의 모든 바이트를 인쇄합니다. 뒤에 공백을 두 개 이상 넣으면 ."공백 바로 뒤에 공백 ."이 인쇄됩니다. 시퀀스가 지원되지 않습니다 탈출 (그래서 당신이 가진 문자열을 인쇄 할 수 없습니다 "거기에와를 .")하지만, Gforth 덧붙였다 .\"을 지원합니다 언어에.

길이 7

: + - ;

콜론, 단어 이름, 단어를 실행하려는 단어 및 세미콜론을 작성하여 Forth에서 자신의 단어를 정의합니다. 단어는 공백이 아닌 문자 시퀀스 일 수 있습니다 (공백은 Forth가 한 단어가 끝나고 다른 단어가 끝나는 위치를 알려주는 방법), 구두점 및 심지어 연산자 (결국 단어) 일 수 있습니다. 위의 스 니펫 +은 의미로 재정의 -되므로 이제 추가하려고 할 때마다 대신 빼십시오. 사용하는 기존 단어는 +의 원래 정의에 대한 참조를 저장하므로 영향을받지 않습니다 +.

참고 : 일부 단어는 외부 단어와 다른 단어의 정의 내에서 다른 작업을 수행하지만 제어 구조 이외의 모든 단어는 매우 난해합니다. 대부분의 단어는 외부에서와 같은 정의 내에서 동일한 일을하지만 때로는 그 일이 분명 : show-see see see ;하지 않습니다.

길이 8

: 42 - ;

나는 단어가 공백 문자의 순서가 될 수 말했을 때, 나는 의미 있는 순서. 아니요, Forth에는 각 개인 번호에 대한 단어가 없습니다. 숫자는 조금 특별합니다. Forth가 공백이 아닌 시퀀스를 만나면 먼저 알려진 단어인지 확인합니다. 그렇지 않은 경우 숫자로 구문 분석하려고 시도합니다. 실패하면 오류가 발생합니다. 숫자와 철자가 같은 단어를 정의한다는 것은 단어를 대신받지 않고 더 이상 숫자의 철자를 직접 입력 할 수 없다는 것을 의미하지만 Gforth 및 기타 다양한 Forth는 어쨌든 숫자를 철자하는 여러 가지 방법을 제공합니다 .

길이 9

IF 1 THEN

마지막으로 친숙한 것! 분명히이 코드는 인수 1가 참 인지 테스트 하고, 그렇다면 인수 뒤에 무엇이든 실행합니다 THEN. 잘못된. 실행이 도달하면 IF, 스택의 상단에있는 값이 떨어져 튀어되며, 경우에 값 (즉, 0이 아닌) 사실, 실행은 내부에 무엇이든의 계속 IF ... THEN애프터의 어떤 다음과 THEN; 값이 0이면 after로 바로 건너 뜁니다 THEN. 때문에이 말은 (넷째 즉 측면에서이다!) 내부적으로 구현하는 방법에, 그 주, IFTHEN하지에서 만 단어의 정의 내에서 사용할 수있는 "상태를 해석한다."

길이 12

( x y -- y )

이것은 주석입니다. 그것은 바로 (다음에서 다음으로 갑니다 ). (인터프리터에서 줄 바꿈도 끝낼 수 있습니다.) 이것은 Forth의 구문에 "내장"되어 있지 않습니다. (는 입력 스트림의 모든 것을 버리고 다음 단어를 통해 버리는 단어 )입니다. (그렇습니다. Forth는 소스 코드를 읽는 방법을 조작 할 수 있습니다. Perl은 실행하지 않고 구문 분석 할 수없는 유일한 언어는 아닙니다!) 단어이기 때문에 공백으로 따라야합니다. 그렇지 않으면 Forth가 불평 할 것입니다. (x정의되지 않았습니다. 또한 우리는 (계속해서 발을 쏠 수있는 지속적인 캠페인의 일환으로 재정의 할 수 있습니다 .

그러나 댓글 내용이 더 흥미 롭습니다. 이 주석은 어떤 단어에 대한 스택 효과 를 특정합니다 . --목록 의 왼쪽 부분 은 단어를 실행하기 전에 스택의 맨 위에 있어야 하는 것을 나열하고 (맨 위는 오른쪽에 있음) 오른쪽 --은 스택의 맨 위에 있는 모양을 설명합니다 (다시) , 상단은 오른쪽에 있습니다). 일반적인 규칙은 : name비트 바로 다음에 정의한 단어의 소스에 이러한 주석을 추가하는 것입니다. 또한 스택 요소의 이름을 지정하여 해당 유형을 나타내는 표준을 따르는 매우 강력한 규칙 도 있습니다 .

또한, 스택 효과는 nip단어를 위한 것 입니다. 댓글에서 그 내용을 알 수 있어야합니다.

길이 13

1 2 3 4 d+ d.

앞에서 언급했듯이 Forth 값의 유형은 모두 사용 방법에 있습니다. 값을 포인터로 취급하면 포인터이고 해당 값이 좋은 포인터 가 아닌 경우 값 으로 취급하는 것은 귀하의 잘못입니다. 그러나 값을 처리하는 유형에 관계없이 항상 데이터 스택에서 하나의 셀을 차지합니다. 이중 셀 또는 배정 밀도 정수 는 예외 입니다. 이들은 스택에서 두 값으로 표시되는 정수이므로 평소보다 두 배 많은 비트로 산술을 수행 할 수 있습니다. 더 중요하거나 더 높은 비트의 셀은 덜 중요하거나 더 낮은 비트의 위에 놓이므로 1 0이중 셀 표현은10 1Forth의 일반 셀 크기에 따라 2 ^ 32 또는 2 ^ 64입니다. 당연히, 이중 셀 값을 처리하려면 이중 셀 값에서 명시 적으로 작동하는 단어를 사용해야합니다. 이들은 일반적으로 d(또는 ud부호없는) 뒤에 대응하는 단일 셀 단어의 이름이옵니다 : d+추가, d<비교, d.인쇄 등.


Forth의 경우 +1 아직 끝나지 않은 언어를 찾기 시작했습니다. 이미 여기에서 만나서 반갑습니다.
mbomb007

2
또한 +1675에 도달하면 출력 할 멋진 ASCII 이미지가 있습니다. : D
mbomb007

31

피스

추가 스 니펫을 위해 골프 문제에 대한 솔루션과 문제에 대한 링크를 게시하겠습니다.

길이 17 :

<ussC,cG\_GUQ*zQQ

n입력 문자열을 영원히 반복 한 다음 밑줄을 시퀀스 자체로 채운 다음 영원히 반복하여 형성되는 무한 시퀀스 의 첫 문자를 찾으십시오 .

빈칸 채우기

길이 14 :

#QX=Qhf>FT.:Q2

고유 한 요소 목록이 제공되면 인접한 요소 쌍을 교체하여 모든 중간 결과를 인쇄하여 목록을 정렬하십시오.

일련의 숫자를 순서대로 재 배열

길이 13 :

?hu]+HG_UQYQY

다음 구조를 작성하십시오 [0, [1, [2, [3]]]]..

목록의 범위에 홈

길이 12 :

uxyG*HQjvz2Z

XOR 곱셈.

XOR 곱셈

길이 11 :

lfqSzST.:wz

첫 번째 단어의 하위 문자열이 두 번째 단어의 아나그램 인 수를 계산하십시오.

부모 문자열 내에서 아나그램 탐지

길이 9 :

fqJjQT_J2

입력이 회 문인 최하위를 찾습니다.

최하부 회문

길이 5 :

!%lQ1

입력이 2의 거듭 제곱인지 확인하십시오. 로그베이스 2를 취하고 결과 mod 1을 취하고 논리를 취하지 마십시오.

+,-연산을 사용하지 않고 정수가 2의 거듭 제곱인지 확인

길이 4 :

sjQ2

입력의 밑이 2 인 표현을 더하여 입력의 해밍 가중치를 계산합니다.

부호없는 16 비트 정수로 1의 수를 센다

길이 3 :

^G2

^ int 시퀀스에서 첫 번째 인수의 직교 곱을 n 번으로 제공합니다. 여기서 n은 두 번째 인수입니다.

이 경우 G알파벳 ( abcdefghijklmnopqrstuvwxyz) ^G2이므로을 aa통해 두 문자 문자열을 모두 제공합니다 zz.

길이 2 :

lT

lnormaly로서 작용하면서, len()이후도 2 로그베이스로 사용될 수 T초기화 변수이고 10이 지문, 3.3219280948873626, (10)의베이스 (2)를 기록.

길이 1 :

H

HPyth의 빈 사전 (해시 테이블)이며 Pyth에서 v(eval) 또는 $(Python literal) 을 사용하지 않는 사전을 얻는 유일한 방법 입니다.

사실 :

Pyth에는 리터럴 이외의 다중 문자 구성이 없습니다. 또한 Pyth는 기본적으로 일대일 파이썬으로 컴파일합니다.


로 시작하는 명령이 있기 전에 팩트가 추가 되었습니까 .?
Leaky Nun

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