1

저는 J에서 초보자이기 때문에이 언어를 사용하는 간단한 작업, 특히 bubblesort 알고리즘을 구현하기로 결정했습니다. 선언적 언어로 수정 된 목록을 작성하는 대신 C와 같은 명령형 언어로 배열 요소를 사용하여 자연스럽게 해결되기 때문에 함수형 언어에서 이러한 종류의 문제를 해결하는 것은 관용적이지 않습니다. 여기J : 버블 정렬 암묵적 구현에서의 자체 참조

(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: # 

문장의 구조있어 :

(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: # 5 3 8 7 2 
2 3 5 7 8 

것은 나를 혼란 :

┌────────────────────────────────────────────────────────────────────────────┬──┬─┐ 
│┌───────────────────────────────────────────────────────────────┬──┬───────┐│^:│#│ 
││┌───────────────────┬─┬───────────────────────────────────────┐│^:│┌─┬─┬─┐││ │ │ 
│││┌──────┬─┬────────┐│,│┌──┬─┬────────────────────────────────┐││ ││1│<│#│││ │ │ 
││││┌──┬─┐│@│┌─┬─┬──┐││ ││$:│@│┌───────────────────┬─┬────────┐│││ │└─┴─┴─┘││ │ │ 
│││││<.│/││ ││2│&│{.│││ ││ │ ││┌──────┬─┬────────┐│,│┌─┬─┬──┐││││ │  ││ │ │ 
││││└──┴─┘│ │└─┴─┴──┘││ ││ │ │││┌──┬─┐│@│┌─┬─┬──┐││ ││2│&│}.│││││ │  ││ │ │ 
│││└──────┴─┴────────┘│ ││ │ ││││>.│/││ ││2│&│{.│││ │└─┴─┴──┘││││ │  ││ │ │ 
│││     │ ││ │ │││└──┴─┘│ │└─┴─┴──┘││ │  ││││ │  ││ │ │ 
│││     │ ││ │ ││└──────┴─┴────────┘│ │  ││││ │  ││ │ │ 
│││     │ ││ │ │└───────────────────┴─┴────────┘│││ │  ││ │ │ 
│││     │ │└──┴─┴────────────────────────────────┘││ │  ││ │ │ 
││└───────────────────┴─┴───────────────────────────────────────┘│ │  ││ │ │ 
│└───────────────────────────────────────────────────────────────┴──┴───────┘│ │ │ 
└────────────────────────────────────────────────────────────────────────────┴──┴─┘ 

하는의 배열에 적용 할 수 그러나 이것은 내가 작성한 코드는 바깥 쪽 괄호 안의 문을 참조하는 $:입니다.

$:이 이 들어있는 긴 동사를 나타냅니다 : Help는 말한다.

The other book (~ 300 킬로바이트)는 말한다 :

3+4 
7 
    5*20 
100 

+와 같은 기호 및 * 위의 문구에서 플러스시간에 대한 동사에 전화 기능을 나타냅니다 있습니다. 당신은 그것이 왼쪽에서 을 읽어 간단한 영어 문장과 같이 구성되어 경우에 J 문구 하나 개 이상의 동사가있을 수 있습니다, 그 4+6%24 즉, 다음과 무엇에 6을 추가 의미입니다 을 (를) 2으로 나눈 값입니다.

의이 바깥 쪽 ()의를 생략 내 코드를 다시 보자 :

((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: # 5 3 8 7 2 
2 3 5 7 8 

Reuslts은 동일합니다. 나는 왜 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)$:에 대한 가장 긴 동사로 처리되지만 전체 표현식이 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: #이 아니라 단지 (<./@(2&{.)), $:@((>./@(2&{.)),2&}.)이 아니라 왜 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) 만 처리되는지 나 자신을 설명 할 수 없었습니다. 왜냐하면 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)이 동사이면 #과 결합하여 다른 동사도 형성해야하기 때문에, 나는. 이자형. 하나는 전체 문장 (첫 번째 발췌 문장)을 동사로 취급 할 수 있습니다. 아마 동사의 길이가 한 결합으로 제한되는 것에 대한 약간의 제한이있을 것입니다. 다음 코드 (from here)에서

보면 : 식에서

factorial =: (* [email protected]<:) ^: (1&<) 
    factorial 4 
24 

factorial 나는 전체 기능을 말한다. 이자형. (* [email protected]<:) ^: (1&<).내가 $: 대신 함수 이름을 사용했습니다이 예에 따라

:

bubblesort =: (((<./@(2&{.)), [email protected]((>./@(2&{.)),2&}.)) ^: (1<#)) ^: # 
    bubblesort 5 3 8 7 2 
2 3 5 7 8 

나는 전체 기능을 참조 bubblesort을 예상하지만 결과가 정확하기 때문에 나를 위해 진실하지 않는 것 같습니다.

또한 약간의 리팩터링을 사용하는 경우 다른 구현을보고 싶습니다.

감사합니다.

답변

1

이다 :

두 인수를 취하고 통상 동사 결과 음성의 일부. 예를 들어, *:^:3은 번 (^:연결)의 제곱을 반복하는 함수입니다. $:이 들어있는 긴 동사를 의미

((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) 

때문에, 그냥 작성된 코드를 말한다 : ^:으로

은 더 이상 동사의 인수 결과에 적용, 상기 범주에 속하는 위.

마찬가지로, 다음 ^: 새로운 이상 동사 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)#에서 만드는 : 그것은 이전보다 더 오래이기 때문에 다시 $:에 의해 참조

(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: # 

.

bubbleiter =: ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) 
    bubblesort =: bubbleiter ^: # 
    bubblesort 3 1 2 9 2 9 86 5 9 6 9 6 45 
1 2 2 3 5 6 6 9 9 9 9 45 86 

This article$:에 관한 몇 가지 의견이 있습니다 : 그것은 바람직하지 않은 행동이기 때문에

는, 아마도 유일한 해결책은 $:((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)을 참조하도록 그것은 oneliner하지 비록 전체 동사를 분할하는 것입니다

설명문 $: (자체 참조) 은 무엇이며 사용 방법은 으로 밝혀졌습니다. 다소 불행한 시작이었습니다. ing point 일부는 완전히 새로운 것입니다. 이 언어는 고급 기능이며, 모양이 비정형 인 일이 일반적으로 J.John 은 Roger 님이 님이이 언어를 지금 디자인하고 있다면 그가 포함되지 않았 음을 님이 이야기했습니다.

한번 더 정리해 :

  • ^:함께이고 인수로부터 새로운 동사한다;
  • $:은 가장 길게는 동사을 나타냅니다.

데이터 세트 3 1 2 9 2 9 86 5 9 6 9 6 45에 대한 답변은 estanford입니다. 나는 숙제 작업을 주어 졌어 http://rosettacode.org/wiki/Sorting_algorithms/Bubble_sort#J

1

찾고 있습니다. 그 동안에는 bubblesort가 구체적으로 필요하기 때문에, 또는 보통 정렬이 필요하기 때문에 (예 : /:~ 대신 사용할 수 있습니까?)

편집 : 3 1 2 9 2 9 86 5 9 6 9 6 45과 같은 데이터 집합에서 버블 정렬을 실행 해 보았습니까? 시스템은 내 컴퓨터에서 해봤을 때 매달 렸지만, 끝 부분을 _로 대체하면 작동합니다. this reference (175 킬로바이트) 함께 따르면

+0

을 : 여기 –

+0

그래서 정렬 방법이 지정되지 않았습니까? 그것은 좋은 소식입니다. - J sort operators/:와 \ : 꽤 정교한 백엔드를 가지고 있으며 주어진 입력 데이터에 대한 인터프리터의 최적 성능 추정에 따라 삽입 정렬, 퀵 정렬 및 선형 정렬 알고리즘 중에서 선택하십시오. 동사 (/ : ~) 동사 열차를 사용하면 최소한의 노력으로 전문적인 수준의 정렬 속도를 얻을 수 있습니다. 그러면 언어 능력으로 교사에게 좋은 인상을 줄 수 있습니다. – estanford

+0

물론, J에 포함 된 함수를 정렬하는 방법을 알고 있지만 학습 초기 단계에서 수동으로 구현하는 것은 재미 있습니다. 또한 J 프로그래머 (IRC, 포럼 등)가 어울리는 곳이 있는지 알고 싶습니다. C, Haskell, Python 프로그래머를위한 수백 개의 프로그램이 있습니다. –

0

이 J에 거품 정렬을 구현하기위한 또 다른 접근 방식, 클라이언트는 서버가 해당 목록을 수신 정렬되지 않은 목록을 전송하는 클라이언트 - 서버 응용 프로그램을 구현 정렬 수행 결과 목록을 클라이언트에 다시 보냅니다. 사실, 분류가 어떻게 구현되는지는 이해가되지 않지만 수동으로 구현 된 예제는 명령형 언어 만 사용하기 때문에 선생님에게 깊은 인상을 줄 것입니다. 그리고 나는 그들이 J 및 다른 언어에 대해 들어 보지 못했음을 95 % 확신합니다. 암묵적인 언어! ;)