태그 보관물: kolmogorov-complexity

kolmogorov-complexity

그들 모두를 지배하는 하나의 반지. 모두를 포함하는 하나의 문자열 > 0) {

목표 : 1000 이하의 모든 양의 정수를 포함하는 문자열을 출력합니다.

명백한 대답은 그들 모두를 연결하는 것이며, 2890 자의 문자열을 작성하여 (manatwork 덕분에) 이러한 쉬운 대답을 피하기 위해 문자열의 길이는 1500 자 미만이어야합니다. 다음은 1200 자 문자열을 출력하는 간단한 Java 코드입니다.

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;

import static org.junit.Assert.assertTrue;

/**
 * Created with IntelliJ IDEA.
 * User: fab
 * Date: 05/11/13
 * Time: 09:53
 * To change this template use File | Settings | File Templates.
 */
public class AStringToContainThemAll {

    @Test
    public void testsubStrings() throws Exception {
        String a = generateNewString();
        boolean cool = true;
        for (int i = 0; i < 1000; i++) {
            assertTrue(a.contains(Integer.toString(i)));
        }
    }

    private String generateNewString() {
        List<Integer> myTree = new ArrayList<Integer>();
        String finalString = new String("100");
        for (int i = 10; i < 1000; i++) {
            myTree.add(i);
        }
        while (myTree.size() > 0) {
            if (finalString.contains(Integer.toString(myTree.get(0)))) {
                myTree.remove(0);
            } else {
                String substringLong = finalString.substring(finalString.length() - 2, finalString.length());
                boolean found = false;
                loop:
                for (Integer integer : myTree) {
                    if (integer.toString().startsWith(substringLong) && !finalString.contains(integer.toString())) {
                        finalString = finalString.concat(integer.toString().substring(2, 3));
                        myTree.remove(integer);
                        found = true;
                        break loop;
                    }
                }
                if(! found){
                    finalString = finalString.concat(myTree.get(0).toString());
                    myTree.remove(0);
                }
            }


        }
        return finalString;
    }
}

최단 코드 승리, 최단 문자열 보너스 포인트!



답변

골프 스크립트-13 바이트, 1315 출력

991,{`.$2>>},

위의 숫자는 첫 번째 숫자가 숫자의 가장 큰 숫자 인 0-990 에서 숫자를 선택합니다 . 즉, 정렬 된 문자열 표현의 마지막 숫자는 사전 식으로 문자열 자체보다 작습니다. 논리는 다음과 같습니다.

3 자리 숫자 abc 의 경우 a 가 숫자의 가장 큰 숫자가 아닌 경우 나중에 두 경우 중 하나에 해당하므로 숫자를 건너 뜁니다.

  1. B <C (예를 들어, 123 )
    이기 때문에 C가 가장 자리이며, 숫자 운전실 스킵 없습니다. 이 예 (312)는 생략되지 않으며 것 다음 값 313 연접 ( 312 313 )를 포함 123 .

  2. B ≥ C (예, 132 )
    때문에 , B가 가장 자리이며, 숫자 BCA는 생략 될 수 없다. 이 예에서, 321 은 생략되지 않으며, 연결될 때 ( 321 322 )는 132를 포함하는 다음 값 ( 322) 도 생략되지 않을 것이다. 만약 B = C를 (예 : 122 ),이 경우에도 적용된다. 값 BCA는 전처럼, 스킵되지 않고 있기 때문에 , A는 반드시 미만이고 , B , BC <A + 1> 중 스킵되지 않는다. 이 예에서 221222 122를 포함합니다.

위 코드는 마지막 세 번째가 아닌 세 번째 숫자를 테스트하기 때문에 0-99의 모든 값 이 결과에 포함됩니다. 1-99 의 값은 건너 뛸 수 있지만, 모든 3 자리 시퀀스가있는 경우 모든 1 자리 및 2 자리 시퀀스도 존재해야하기 때문입니다.

991-999 의 값은 ( 909 910 , 919 920 , … 989 990 )에 의해 생성되므로 생략 될 수도 있습니다 .

1315 바이트의 출력에서 ​​이는 1500 미만의 문제 사양에 따라 편안합니다.

산출:

0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101110111200201202210211212220221222300301302303310311312313320321322323330331332333400401402403404410411412413414420421422423424430431432433434440441442443444500501502503504505510511512513514515520521522523524525530531532533534535540541542543544545550551552553554555600601602603604605606610611612613614615616620621622623624625626630631632633634635636640641642643644645646650651652653654655656660661662663664665666700701702703704705706707710711712713714715716717720721722723724725726727730731732733734735736737740741742743744745746747750751752753754755756757760761762763764765766767770771772773774775776777800801802803804805806807808810811812813814815816817818820821822823824825826827828830831832833834835836837838840841842843844845846847848850851852853854855856857858860861862863864865866867868870871872873874875876877878880881882883884885886887888900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990

변형 # 1

14 바이트, 1233 출력

991,{`.$-1>>},

세 번째가 아닌 비교할 마지막 숫자를 엄격하게 선택하면 100 미만의 불필요한 값 이 많이 제거되어 결과 문자열이 줄어 듭니다 .

101120212230313233404142434450515253545560616263646566707172737475767780818283848586878890919293949596979899100101110111200201202210211212220221222300301302303310311312313320321322323330331332333400401402403404410411412413414420421422423424430431432433434440441442443444500501502503504505510511512513514515520521522523524525530531532533534535540541542543544545550551552553554555600601602603604605606610611612613614615616620621622623624625626630631632633634635636640641642643644645646650651652653654655656660661662663664665666700701702703704705706707710711712713714715716717720721722723724725726727730731732733734735736737740741742743744745746747750751752753754755756757760761762763764765766767770771772773774775776777800801802803804805806807808810811812813814815816817818820821822823824825826827828830831832833834835836837838840841842843844845846847848850851852853854855856857858860861862863864865866867868870871872873874875876877878880881882883884885886887888900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990

변형 # 2

16 바이트, 1127 출력

991,99>{`.$2>>},

미리 99 미만의 모든 값을 제거 하면 결과 문자열을 훨씬 더 단축 할 수 있습니다.

99100101110111200201202210211212220221222300301302303310311312313320321322323330331332333400401402403404410411412413414420421422423424430431432433434440441442443444500501502503504505510511512513514515520521522523524525530531532533534535540541542543544545550551552553554555600601602603604605606610611612613614615616620621622623624625626630631632633634635636640641642643644645646650651652653654655656660661662663664665666700701702703704705706707710711712713714715716717720721722723724725726727730731732733734735736737740741742743744745746747750751752753754755756757760761762763764765766767770771772773774775776777800801802803804805806807808810811812813814815816817818820821822823824825826827828830831832833834835836837838840841842843844845846847848850851852853854855856857858860861862863864865866867868870871872873874875876877878880881882883884885886887888900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990

골프 스크립트-19 바이트, 1016 출력

910,99>{`.2$\?)>+}/

위의 값은 99 에서 909까지 이며, 아직 나타나지 않은 값을 추가합니다 ( 909 는 일반적 으로이 방법으로 추가 된 마지막 값입니다). 99 를 앞쪽으로 이동 하면 뒤쪽에 910이 필요하지 않도록 최적화됩니다 .

산출:

99100101102103104105106107108109111112113114115116117118119120122123124125126127128129130132133134135136137138139140142143144145146147148149150152153154155156157158159160162163164165166167168169170172173174175176177178179180182183184185186187188189190192193194195196197198199200202203204205206207208209222223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333334335336337338339340344345346347348349350354355356357358359360364365366367368369370374375376377378379380384385386387388389390394395396397398399400404405406407408409444445446447448449450455456457458459460465466467468469470475476477478479480485486487488489490495496497498499500505506507508509555556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666667668669670677678679680687688689690697698699700707708709777778779780788789790798799800808809888889890899900909

골프 스크립트 26 바이트, 999 출력

909.,99>{`..$.2><3$@?+>+}/

점을 유의 1,016 이전 용액 제조 문자열이 각각 여러 두 추가 숫자 갖는 제외한 거의 최적 인 (111) (즉, 11111대신 111, 22222대신 222등). 이 여분의 숫자를 제거하고 (이 값들 각각에 3 개가 아닌 1 개의 숫자 만 삽입), 909앞쪽 으로 회전 하여 9(이전 버전과는 달리 9100앞뒤로 이동 하여 ) 최적의 솔루션을 만들 수 있습니다. ).

언 롤링 및 댓글 :

909.,99>  # add 909 to the stack, and duplicate
          # create an array from 0..908, and
          # remove the first 99 elements (99..908)
{
  `..     # stringify, duplicate twice

  $.2><   # non-divisibility by 111 check
          # true if the last char of the sorted
          # string is greater than the first char

  3$@?    # first position of this number in
          # the total string so far (-1 if not found)

  +>      # add the two previous results,
          # and slice from that point
          # (see explanation below)

  +       # concat what remains to the total string

}/        # loop over the set

추가 할 문자를 선택하는 논리는 다음 세 가지 경우입니다.

  1. 111n , ns
    첫 번째 검사의 값은 1 이고 두번째 검사의 값은 -1 입니다.
    슬라이스는 인덱스 0 부터 시작합니다. 전체 문자열을 반환합니다.
  2. 111n , ns
    첫 번째 검사의 값은 1 이고 두번째 검사의 값은 ≥ 2 입니다.
    슬라이스는 인덱스 ≥ 3 부터 시작합니다. 빈 문자열을 반환합니다.
  3. 111n , ns
    첫 번째 검사의 값은 0 이고 두번째 검사의 값은 -1 입니다.
    슬라이스는 인덱스 -1 부터 시작합니다. 마지막 문자 만 반환합니다.

논리의 합은 아직 나타나지 않은 모든 값이 111 의 배수가 아닌 한 전체에 추가된다는 것 입니다.이 경우 하나의 문자 만 추가됩니다. 다른 모든 값은 무시됩니다.

생성 된 문자열은 Peter Taylor의 답변에서 생성 된 최적의 문자열과 다릅니다 .

역사:

899,{101+.111%{`.2$\?0<*}{3/9%}if+}/

899,{101+`.2$\?0<\.~111%2*)<*+}/0

899,{101+`.2$\?0<\..2>-!2*>*+}/0

899,{101+`...2>|,1|<2$@?0<*+}/0

999,{`..$.2>>2*>2$@?0<*+}/3>0

899,{101+`..$.2><3$@?+>+}/0

산출:

909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900


답변

GolfScript ( 35 31 26 자)

10,{:x),{:&x=x+,{x&@}/}/}/

출력

000100110111200201210211220221222300301302310311312320321322330331332333400401402403410411412413420421422423430431432433440441442443444500501502503504510511512513514520521522523524530531532533534540541542543544550551552553554555600601602603604605610611612613614615620621622623624625630631632633634635640641642643644645650651652653654655660661662663664665666700701702703704705706710711712713714715716720721722723724725726730731732733734735736740741742743744745746750751752753754755756760761762763764765766770771772773774775776777800801802803804805806807810811812813814815816817820821822823824825826827830831832833834835836837840841842843844845846847850851852853854855856857860861862863864865866867870871872873874875876877880881882883884885886887888900901902903904905906907908910911912913914915916917918920921922923924925926927928930931932933934935936937938940941942943944945946947948950951952953954955956957958960961962963964965966967968970971972973974975976977978980981982983984985986987988990991992993994995996997998999

(1020 문자) 이것은 Lyndon 단어 연결 방식의 변형입니다. 원시적 인 1 문자 단어를 사용하는 대신 짧은 코드에는 111의 배수를 사용하지만 해당 숫자가 반복적으로 발생합니다. 결합 그룹의 최소 요소를 사용하는 대신 루프를 단축시키기 때문에 최대 요소를 사용합니다.


10,:^{:x^>{x.@:&<+^>{.x>{x&@}*}/}/}%3>0.

40 자 (아마도 여전히 향상 될 수 있음)에서 길이는 999자인 최적 문자열을 생성합니다.

100200300400500600700800901101201301401501601701801902102202302402502602702802903103203303403503603703803904104204304404504604704804905105205305405505605705805906106206306406506606706806907107207307407507607707807908108208308408508608708808909109209309409509609709809911121131141151161171181191221231241251261271281291321331341351361371381391421431441451461471481491521531541551561571581591621631641651661671681691721731741751761771781791821831841851861871881891921931941951961971981992223224225226227228229233234235236237238239243244245246247248249253254255256257258259263264265266267268269273274275276277278279283284285286287288289293294295296297298299333433533633733833934434534634734834935435535635735835936436536636736836937437537637737837938438538638738838939439539639739839944454464474484494554564574584594654664674684694754764774784794854864874884894954964974984995556557558559566567568569576577578579586587588589596597598599666766866967767867968768868969769869977787797887897987998889899900

이것을 역 문자열로 만들려고하면 111의 배수를 생략하는 데 문제가 있습니다.

999가 최적의 길이임을 확인하려면 (위의 간단한 설명은 모든 사람을 설득하지 못하기 때문에) 0에서 9 사이의 모든 3 자리 문자 시퀀스를 포함하는 전체 de Bruijn 시퀀스에서 시작합니다 (순환 문자열로 사용됨). 그 중 1000 개가 있으며 길이는 1000 자 이상이어야합니다. 그것은 보통 그 길이 노드 두자리 서열되는 그래프 오일러 도보 검증 정확히 1,000 자 수 xy10 가장자리가 하나의 숫자로 표시된 각 zxyyz.

우리는 시퀀스 시작이 필요하지 않으므로 0de Bruijn 시퀀스가 ​​주어지면 000끝까지 회전 할 수 있습니다 . 그런 다음 시작으로 반올림하는 시퀀스 중 하나가 필요하지 않지만 0before 숫자로 시작하는 시퀀스를 완료 하려면 두 개의 s 가 필요 000하므로 999 문자 문자열을 얻기 위해 그 중 하나를 삭제할 수 있습니다. 나머지 0는 모두로 시작하지 않는 숫자로 사용됩니다 0.


답변

GolfScript, 17 자

999,{`1$1$?0<*+}/

문자열에 아직없는 경우 각 숫자를 추가하는 일반적인 접근 방식 (주 : 999는 확인 또는 추가되지 않지만 출력에 이미 포함되어 있음)

출력은 1133 자입니다.

01234567891011131415161718192021222425262728293032333536373839404344464748495054555758596065666869707677798087889099100102103104105106107108109110112114115116117118119120124125126127128129130132133134135136137138139140142143144145146147148149150152153154155156157158159160162163164165166167168169170172173174175176177178179180182183184185186187188189190193194195196197198199200203204205206207208209219220221223225226227228229230231235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290294295296297298299300304305306307308309311329330332334336337338339340342346347348349350354355356357358359360364365366367368369370374375376377378379380384385386387388389390395396397398399400405406407408409422439440443445447448449450453457458459460465466467468469470475476477478479480485486487488489490496497498499500506507508509533549550554556558559560564568569570576577578579580586587588589590597598599600607608609644659660665667669670675679680687688689690698699700708709755769770776778780786790797799800809866877879880887888897898899900908932943954965976979987989


답변

코드가 없지만 999자가 출력 길이의 하한이라는 직관적 인 증거를 누군가가 이해할 수 있다고 생각했습니다.

첫째, 모든 1 자리 및 2 자리 숫자는 3 자리 숫자의 일부이므로 100보다 작은 것을 무시하십시오. 100-999 (포함)는 900 3 자리 숫자입니다.

문제를 해결하는 가장 최적의 방법은 모든 문자를 가능한 많이 사용하는 것입니다. 이는 숫자가 다음과 같이 가능한 많이 겹치는 것을 의미합니다.

123
 234
  345

따라서 첫 번째 숫자는 3자를 추가하고 이후의 각 숫자는 1자를 추가합니다. 3 + 899 = 902자를 하한으로 제공합니다.

그러나 0이 있으면 새로운 3 자리 숫자를 시작할 수 없습니다. 그러나 다른 0 자리가 아닌 한 다른 3 자리 숫자의 중간에 재사용 할 수 있습니다.

120
 203  <- Ok.
  034 <- not a number 100-999.

그러나:

100
 002  <- not a number 100-999.
  023 <- not a number 100-999.

따라서 출력에 나타나는 각 0은 출력을 1 자로 확장합니다. 마지막 두 문자는 더 이상 숫자와 겹치지 않으므로 0 일 수 있습니다.

???
 ??0
  ?00

가운데에는 0이 정확히 81 개의 숫자가 있고 (? 0?), 끝에는 0이 정확히 하나 인 81이 있고 (?? 0) 두 개의 0이있는 9가 있습니다 (? 00).

모든 ?? 0 숫자는? 0? 숫자 또는? 00 숫자이지만 둘다는 아닙니다. ? 0? ? 00은 절대 0을 공유 할 수 없으므로 출력에 최소 81 + 9 * 2의 0이 있어야합니다.

이것은 3 + 899 + 81 + 9 * 2-2 = 999 문자의 하한을 제공합니다.

이것이 주제가 아닌 것으로 여겨지지만 사과하기에는 너무 길었습니다.


답변

펄, 37 34 33 32 (1136 1132 자)

for$@(1..999){$_.=$@x!/$@/}print

for $ @ (1..999) {$ _. = $ @ if! / $ @ /} 인쇄

for $ i (1..999) {$ _. = $ i if! / $ i /} 인쇄

for (1..1e3) {$ s. = $ _ if $ s! ~ / $ _ /} print $ s

출력 :

12345678910111314151617181920212224252627282930323335363738394043444647484950545557585960656668697076777980878890991001021031041051061071081091101121141151161171181191201241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901931941951961971981992002032042052062072082092192202212232252262272282292302312352362372382392402432442452462472482492502532542552562572582592602632642652662672682692702732742752762772782792802832842852862872882892902942952962972982993003043053063073083093113293303323343363373383393403423463473483493503543553563573583593603643653663673683693703743753763773783793803843853863873883893903953963973983994004054064074084094224394404434454474484494504534574584594604654664674684694704754764774784794804854864874884894904964974984995005065075085095335495505545565585595605645685695705765775785795805865875885895905975985996006076086096446596606656676696706756796806876886896906986997007087097557697707767787807867907977998008098668778798808878888978988999009089329439549659769799879891000

더 짧은 문자열 : 38 37 34 (1020 자) :

$_.=$@x!/$@/while$@=--$@%1e3;print

for ($ @ = 1e3; $ @-;) {$ _. = $ @ if! / $ @ /} 인쇄

for ($ i = 1e3; $ i-;) {$ _. = $ i if! / $ i /} 인쇄

출력 :

999998997996995994993992991990988987986985984983982981980978977976975974973972971970968967966965964963962961960958957956955954953952951950948947946945944943942941940938937936935934933932931930928927926925924923922921920918917916915914913912911910908907906905904903902901900888887886885884883882881880877876875874873872871870867866865864863862861860857856855854853852851850847846845844843842841840837836835834833832831830827826825824823822821820817816815814813812811810807806805804803802801800777776775774773772771770766765764763762761760756755754753752751750746745744743742741740736735734733732731730726725724723722721720716715714713712711710706705704703702701700666665664663662661660655654653652651650645644643642641640635634633632631630625624623622621620615614613612611610605604603602601600555554553552551550544543542541540534533532531530524523522521520514513512511510504503502501500444443442441440433432431430423422421420413412411410403402401400333332331330322321320312311310302301300222221220211210201200111110101100

특히 처음 99999의 복제에 만족하지 않습니다! 더 많은 검사를 통해 더 많은 코드를 만들 수 있다고 생각합니다 …

편집 : @ Peter Taylor의 제안을 추가했습니다.

편집 2 : @primo의 훌륭한 제안! 감사합니다


답변

APL (20, 출력 : 1020)

{∨/⍺⍷⍵:⍵⋄⍵,⍺}/⍕¨⍳999

설명:

  • {∨/⍺⍷⍵:⍵⋄⍵,⍺}: 의 하위 문자열 인 경우 return , 그렇지 않으면 return⍵,⍺
  • /: 축소
  • ⍕¨: 각각의 문자열 표현
  • ⍳999:의 정수 1999.

산출:

9999989979969959949939929919909889879869859849839829819809789779769759749739729719709689679669659649639629619609589579569
      55954953952951950948947946945944943942941940938937936935934933932931930928927926925924923922921920918917916915914913
      91291191090890790690590490390290190088888788688588488388288188087787687587487387287187086786686586486386286186085785
      68558548538528518508478468458448438428418408378368358348338328318308278268258248238228218208178168158148138128118108
      07806805804803802801800777776775774773772771770766765764763762761760756755754753752751750746745744743742741740736735
      73473373273173072672572472372272172071671571471371271171070670570470370270170066666566466366266166065565465365265165
      06456446436426416406356346336326316306256246236226216206156146136126116106056046036026016005555545535525515505445435
      42541540534533532531530524523522521520514513512511510504503502501500444443442441440433432431430423422421420413412411
      410403402401400333332331330322321320312311310302301300222221220211210201200111110101100

APL (41, 출력 : 999)

'0',⍨⊃{⍵,⍺⍴⍨(1=⍴∪⍺)∨3×~∨/⍺⍷⍵}/⌽⍕¨100+⍳898

설명:

  • ⌽⍕¨100+⍳898: ('999' '998' ... '101')(APL에서는 축소가 오른쪽에서 왼쪽으로되므로 반대 순서로 F/a b c ≡ a F (b F c))
  • /: 줄이다
  • ⍵,⍺⍴⍨: 오른쪽 인수 다음에 N왼쪽 인수 의 첫 문자가옵니다 N.
  • 3×~∨/⍺⍷⍵: 3경우 의 문자열 아니다 , 그렇지 않으면,0
  • (1=⍴∪⍺): 하나의 고유 한 characcter 만있는 1경우 그렇지 않은 경우0
  • : 앞의 두 값의 최대 공약수 : 그래서, 1경우 에없는 단 하나 개의 독특한 성격을 가지고 3있는 경우 에없는 ,하지만 더 이상의 독특한 성격을 가지고 0그렇지.
  • '0',⍨: 결과의 끝에 0을 추가하십시오

산출:

10110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451
      46147148149150152153154155156157158159160162163164165166167168169170172173174175176177178179180182183184185186187188
      18919019219319419519619719819920020220320420520620720820922232242252262272282292302332342352362372382392402432442452
      46247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294
      29529629729829930030330430530630730830933343353363373383393403443453463473483493503543553563573583593603643653663673
      68369370374375376377378379380384385386387388389390394395396397398399400404405406407408409444544644744844945045545645
      74584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566
      56756856957057657757857958058658758858959059659759859960060660760860966676686696706776786796806876886896906976986997
      00707708709777877978078878979079879980080880988898908999009099100


답변

루비 : 50 46 자 (1020 자 출력)

s=""
999.downto(0){|i|s[n=i.to_s]||s+=n}
$><<s

샘플 실행 :

bash-4.1$ ruby -e 's="";999.downto(0){|i|s[n=i.to_s]||s+=n};$><<s'
999998997996995994993992991990988987986985984983982981980978977976975974973972971970968967966965964963962961960958957956955954953952951950948947946945944943942941940938937936935934933932931930928927926925924923922921920918917916915914913912911910908907906905904903902901900888887886885884883882881880877876875874873872871870867866865864863862861860857856855854853852851850847846845844843842841840837836835834833832831830827826825824823822821820817816815814813812811810807806805804803802801800777776775774773772771770766765764763762761760756755754753752751750746745744743742741740736735734733732731730726725724723722721720716715714713712711710706705704703702701700666665664663662661660655654653652651650645644643642641640635634633632631630625624623622621620615614613612611610605604603602601600555554553552551550544543542541540534533532531530524523522521520514513512511510504503502501500444443442441440433432431430423422421420413412411410403402401400333332331330322321320312311310302301300222221220211210201200111110101100

시운전 :

bash-4.1$ ruby -e 's="";999.downto(0){|i|s[n=i.to_s]||s+=n};$><<s' | ruby -ne 'p (0..999).reject{|i|$_[i.to_s]}'
[]

루비 : 102 97 자 (999 자 출력)

s=""
999.downto(0){|i|s[n=i.to_s]||[2,1].map{|j|n[0,j]==s[-j,j]&&s+=n[j,9]and break}&&s+=n}
$><<s

샘플 실행 :

bash-4.1$ ruby -e 's="";999.downto(0){|i|s[n=i.to_s]||[2,1].map{|j|n[0,j]==s[-j,j]&&s+=n[j,9]and break}&&s+=n};$><<s'
999899799699599499399299199098898798698598498398298198097897797697597497397297197096896796696596496396296196095895795695595495395295195094894794694594494394294194093893793693593493393293193092892792692592492392292192091891791691591491391291191090890790690590490390290190088878868858848838828818808778768758748738728718708678668658648638628618608578568558548538528518508478468458448438428418408378368358348338328318308278268258248238228218208178168158148138128118108078068058048038028018007776775774773772771770766765764763762761760756755754753752751750746745744743742741740736735734733732731730726725724723722721720716715714713712711710706705704703702701700666566466366266166065565465365265165064564464364264164063563463363263163062562462362262162061561461361261161060560460360260160055545535525515505445435425415405345335325315305245235225215205145135125115105045035025015004443442441440433432431430423422421420413412411410403402401400333233133032232132031231131030230130022212202112102012001110100

시운전 :

bash-4.1$ ruby -e 's="";999.downto(0){|i|s[n=i.to_s]||[2,1].map{|j|n[0,j]==s[-j,j]&&s+=n[j,9]and break}&&s+=n};$><<s' | ruby -ne 'p (0..999).reject{|i|$_[i.to_s]}'
[]