(m) 문자를 사용하지 않고 ŋarâþ crîþ 알파벳 노래를 출력합니다


12

목표는 입력하지 않고 다음 텍스트를 출력하는 프로그램을 작성하는 것입니다.

ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos.

그러나 캐치 L가 있습니다. 소스의 각 문자 (유니 코드의 일반 범주가로 시작하는 모든 문자 )에 대해 20 문자의 벌금이 부과됩니다! (참고로 인쇄 할 텍스트는 81 자입니다.)

아래의 Perl 6 코드는 145 바이트와 84 개의 문자를 가지므로 1,845 점을 얻습니다.

say "ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos."

아래 코드에는 152 바이트와 70자가 있으므로 1,552 점을 얻습니다.

$_="C e N ŋa V o S;
Þ Š R L Ł.
M a P F G T Č;
în J i D Ð.
ar ħo ên ôn ân uħo;
Crþ Tŋ neŋ es nem.
elo cenvos.";s:g/<:Lu>/{$/.lc~'a'}/;.say

표준 허점 은 금지되어 있습니다.

원래, 나는 편지를 모두 금지한다고 생각했지만, 이것을 가능하게하는 많은 언어가 있다고 생각하지 않습니다. 당신은 시도보다 환영합니다.

(ŋarâþ crîþ [ˈŋaɹa̰θ kɹḭθ]는 내 언어 중 하나입니다. 여기에서 이름을 대문자로 바꾸고 싶었지만 여기에서는 못생긴 큰 eng을 얻었습니다.

편집 : 줄 중 하나가 잘못되었음을 깨달았지만 이미 답변이 있기 때문에 계속하겠습니다. 세 번째 줄의 올바른 버전은 ma a fa ga pa ta ča; 원하는대로 수정 된 텍스트를 대신 생성하도록 선택할 수 있습니다.


11
kolmogorov-complexity , limited- source 및 특별한 채점은 샌드 박스에서 신중하게 고려하면 큰 도움이됩니다. 현재는 단지 다음 소수의 코드 포인트의 모든을 작성하는 모든 인코딩 할 몇 가지 바로 가기와 더불어, 내장과 텍스트로를 설정하는 것이 문제에 대한 최선의 방법처럼 보인다 a얼마나 많은에 따라, 여부 -들 문자는 20 자이므로 큰 페널티이므로 (다른 모든 바이트로 점수를 매기는 경우 잘 정의되지는 않습니다 ...)!
관련이없는 문자열

4
그리고 유니 코드 호출을 고려할 때 대부분의 golflangs에서 사용하는 특수 코드 페이지를 관리하는 몇 가지 명시적인 규칙이 필요할 수 있습니다 (점수를 확인하는 스크립트 링크와 함께).
관련이없는 문자열

답변:


21

7 , 410 자, 7 인코딩에서 154 바이트, 0 자 = 154 점

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

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

문자 사용을 싫어하는 도전에서 숫자만으로 구성된 언어보다 사용하기에 더 좋은 언어는 무엇입니까?

이것은 충돌을 통해 종료되는 전체 프로그램이므로 stderr에 외부 출력이 있지만 stdout은 정확합니다.

설명

첫 번째 반복에서 7 프로그램은 단순히 여러 요소를 스택으로 푸시합니다 (7에 존재하는 12 개 명령 중 8 개만 소스 프로그램에 표시 될 수 있으며 8 개는 코드 작성에 특화되어 있기 때문에) 특정 데이터 구조를 스택에 푸시). 이 프로그램은 6명령을 사용하지 않으며 (이것은 중첩 구조를 만드는 가장 간단한 방법이지만 소스 프로그램에 문자 그대로 나타나지 않는 경향이 있습니다) 7구조를 결정하는 명령 일뿐입니다 . 7새로운 빈 요소를 스택 맨 위로 푸시합니다 ( 05명령은 스택 맨 위에 추가). 따라서 프로그램에 공백을 추가하여 구조를 표시 할 수 있습니다.

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424030455 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

프로그램 끝 근처의 요소는 마지막으로 푸시되므로 두 번째 반복이 시작될 때 스택의 맨 위에 있습니다. 이 반복 및 이후의 모든 반복에서 7 인터프리터는 자동으로 스택의 최상위 사본을 작성하여 프로그램으로 해석합니다. 리터럴 41403은 (리터럴이 아닌 라이브 코드)를 푸시합니다 ( 474637 개는 12 개의 명령을 가지고 있지만 그중 8 개만이 이름을 가지고 있습니다. 즉, 예를 들어 상단 스택 요소에 4추가하는 명령입니다 4. 따라서 두 번째 반복에서 실행되는 프로그램은 47463입니다. 그게 뭐에요 :

47463 
4        맨 위 두 스택 요소 스왑, 7 사이에 빈 요소
        추가 스택 맨 위에 빈 스택 요소 추가
   4      맨 위 두 스택 요소를 스왑하고 6 사이 빈 요소 추가
    6     어떤 명령이 맨 위 스택 요소를 생성하는지 계산하십시오.
        아래 요소에 추가하십시오 (그리고 오래된 스택을 팝하십시오)
    3    상단 스택 요소를 출력하고 아래 요소를 팝

스택에서 발생하는 일을 보면 이해하기가 더 쉽습니다.

  • ... d를 c는 (실행 코드 : ) 4746347463
  • ... d 개 C의 b를 비우 (실행하려면 코드 : )47463 7463
  • ... d 개 C의 b를 비우 (실행 코드 : )47463 463
  • ... D의 C B A는 (코드를 실행합니다 : )47463 63
  • ... D의 C B " "(코드를 실행합니다 : )47463 3
  • d c b 비어 있음 (실행 코드 : empty )47463

즉, 스택 a 의 최상위를 차지하고 코드를 생성했을 가능성이 가장 높은 코드를 처리 한 다음 해당 코드를 출력합니다. 7 인터프리터는 반복이 끝날 때 스택 맨 위에서 빈 요소를 자동으로 표시하므로 47463원래 프로그램에서와 마찬가지로 스택 맨 위로 다시 끝납니다 . 다음에 어떤 일이 발생하는지 쉽게 알 수 있어야합니다. 스택 언더 플로가 발생하고 프로그램이 중단 될 때까지 모든 스택 요소를 하나씩 차례로 이동하여 모두 출력합니다. 따라서 기본적으로 프로그램의 소스 코드 를보고 출력 대상을 결정 하는 간단한 출력 루프를 만들었습니다 (우리는 스택에 푸시 된 데이터 구조를 출력하지 않습니다 0.5대신, 어떤 구조가 생성되었는지보고 출력하여 사용 된 명령을 다시 작성합니다). 따라서 첫 번째 데이터 출력 부분 551220304010420030455(두 번째 스택 스택 요소 3341351…114525를 생성하는 소스 코드 )이고 두 번째 출력 (세 번째 스택 스택 요소를 생성하는 소스 코드) 등입니다.

그러나 이러한 소스 코드는 인코딩되지 않은 상태로 출력되지 않습니다. 7은 출력 인코딩을위한 여러 가지 다른 도메인 특정 언어를 포함합니다. 도메인 별 언어가 선택되면 명시 적으로 지울 때까지 사용 상태를 유지하지만 아직 선택된 언어가 없으면 출력되는 코드의 첫 번째 숫자에 따라 사용할 언어가 결정됩니다. 이 프로그램에서는 두 언어가 사용됩니다 5513.

551이것은 매우 간단합니다. 기본적으로 텔레타이프를 통해 문자를 5 비트 문자 집합으로 전송하는 데 사용되는 모든 기존의 Baudot / teletype 코드이지만 모든 문자를 소문자로 수정했습니다. 출력 할 첫 번째 코드는 다음과 같이 디코딩됩니다.

551  22 03 04 01 04 20 03 04  55
     c  a  SP e  SP n  a  SP  reset output format

보시다시피, 우리는 각 문자를 두 개의 8 진수로 맞추고 있는데 이것은 꽤 괜찮은 압축 비율입니다. Baudot이 필요로하는 32 개의 가능성과 반대로 0-5 범위의 숫자 쌍은 36 개의 가능성을 제공하므로 나머지 4 개는 특수 명령에 사용됩니다. 이 경우 55끝에는 기억 된 출력 형식이 지워 지므로 다음에 출력 할 때 다른 형식을 사용할 수 있습니다.

3개념적으로 더 간단하지만 비틀기입니다. 기본 아이디어는 세 자리 그룹 (0-5 범위에서 출력에서 ​​원래 소스 코드를 다시 만들 수 있음을 보장하는 숫자이므로)을 세 자리 숫자로 해석하는 것입니다. 기본 6에 숫자를 넣고 이진수로 바이트로 출력하십시오 (따라서 단순히 여러 바이트를 출력하여 원하는 출력으로 멀티 바이트 문자를 출력 할 수 있습니다). 그러나 비틀림은 기수 6에 216 개의 3 자리 숫자 (가능한 선행 0)와 256 개의 가능한 바이트가 있다는 사실에서 비롯됩니다. 7은 332₆ = 128₁₀에서 두 개의 다른 바이트로 숫자를 연결하여이 값을 얻습니다. 바이트 191 또는 255를 332출력하는 바이트 128 또는 192, 333바이트 129 또는 193 등 515을 출력 할 수 있습니다.

프로그램은 두 가지 가능성 중 어느 것을 출력 할 수 있는지 어떻게 알 수 있습니까? 520이것을 명시 적으로 제어 하기 위해 3 자릿수의 숫자를 사용하는 것이 가능 하지만이 프로그램에서는 다음을 수행 할 필요는 없습니다 .7의 기본값은 출력이 유효한 UTF-8 방식으로 모든 모호한 바이트를 선택하는 것입니다! UTF-8이 원하는 한 (그리고 우리는이 경우), 그것을 모호하게 남겨두고 프로그램은 어쨌든 작동합니다.

3…섹션 의 끝은입니다. 525그러면 출력 형식이 재설정 551되어 다음 섹션 으로 돌아갑니다 .


이것은 패킹되지 않은 표현에서는 410 바이트 + 0 자이거나 묶은 표현에서는 154 바이트 + 많은 문자입니다. 하나의 바이트와 다른 하나의 문자를 계산하면 건전한 것처럼 보입니다.
Grimmy

1
@ 그림 : 바이트와 문자를 혼동하고 있습니다. 압축 표현은 410 개의 8 진수를 인코딩하는 7의 인코딩에서 154 바이트로 구성되며, 각각은 문자가 아닌 숫자입니다. 당신의 추론 ɓ은 Jelly에서 문자가 아니라는 것을 암시합니다 (Jelly의 인코딩에서의 인코딩이 문자가 아닌 전형적인 8 비트 문자 세트로 해석되는 경우 제어 코드 "CSI"에 대응하기 때문). Jelly와 마찬가지로 7도 사용자 정의 인코딩을 사용합니다. 그러나 7은 문자를 사용하지 않기 때문에 인코딩 할 때 문자를 인코딩 할 필요가 없으므로 인코딩 할 수 없습니다.
ais523

10

하스켈, 0 자, 423 바이트 = 423 점

(['\10'..]!!)<$>[89,87,22,91,22,100,87,22,321,87,22,108,87,22,101,22,105,87,49,0,244,87,22,343,87,22,104,87,22,98,87,22,312,87,36,0,99,87,22,87,22,102,87,22,92,87,22,93,87,22,106,87,22,259,87,49,0,228,100,22,96,87,22,95,22,90,87,22,230,87,36,0,87,104,22,285,101,22,224,100,22,234,100,22,216,100,22,107,285,101,49,0,89,87,104,244,22,106,87,321,22,100,91,321,22,91,105,22,100,91,99,36,0,91,98,101,22,89,91,100,108,101,105,36]

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


6

젤리 ,  274 (260)  212 바이트 + 2 개 문자 =  314 300  252

Nick Kennedy 덕분에 -48 바이트

“19ב+49;7883,8220,8216,7884Ọ“19937801,1169680277365253“38“68112“;107¤+1+\“@“&%"("/%"@%"6%"0"3%$!<%" %"2%"-%"?%#!.%"%"1%")%"*%"4%"=%$!9/",%"+"'%":%#!%2">0"8/";/"7/"5>0$!&%2<"4%@"/(@"(3"/(.#!(-0"&(/603#“_32¤”;";/V

(용도 !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”V유니 코드 문자이며, 각 한 번 사용)

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




@ NickKennedy 나는 골프를 치는 숫자를 가지고 놀았지만, 물러서서 서수를 상쇄하지 않고 좋은 물건을 찾았습니다. 감사합니다!
Jonathan Allan

3

PowerShell에서 , 스코어 601 546

-join(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14|%{[char]($_+32)})

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

순진한 접근; 방금 코드 포인트를 가져 와서 10 진수로 변환하고 32를 뺀 다음이 코드는 단일 문자열로 다시 묶기 char전에 이것을 코드로 취급합니다 -join.




3

젤리 , 321 바이트 + 2 문자 = 361 점

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

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

이것은 끔찍하고 누군가가 확실히 더 잘할 수 있습니다.

점수를 확인하십시오 .


1
실제로 그것보다 덜 나쁘다
ASCII-only

2

파이썬 3 , 380 바이트 + 5 문자 = 480

print("""\143\141 \145 \156\141 \513\141 \166\141 \157 \163\141;
\376\141 \541\141 \162\141 \154\141 \502\141.
\155\141 \141 \160\141 \146\141 \147\141 \164\141 \415\141;
\356\156 \152\141 \151 \144\141 \360\141.
\141\162 \447\157 \352\156 \364\156 \342\156 \165\447\157;
\143\141\162\376 \164\141\513 \156\145\513 \145\163 \156\145\155.
\145\154\157 \143\145\156\166\157\163.""")

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


1

Retina , 140 자, 159 바이트, 14 자 = 439 점


%# ' 1# !# 9# 2 6#;¶þ# š# 5# /# ł#.¶0# # 3# (# )# 7# č#;¶î1 ,# + &# ð#.¶#5 ħ2 ê1 ô1 â1 8ħ2;¶%#5þ 7#! 1'! '6 1'0.¶'/2 %'1926.
T`!--/-9`ŋ\`-{

온라인으로 사용해보십시오! 편집 : K`줄 바꿈 으로 전환 하여 한 글자를 저장했습니다 . 이제 Retina 0.8.2에서도 작동하지만 제목이 너무 깁니다.


1

JAPT -S , 304 286 바이트 + 2 1 문자 S = 344 306

글쎄, 이것은 단지 신이 아닙니다!

"3 1
5
14 1
235 1
22 1
15
19 1 -37 -86 158 1
257 1
18 1
12 1
226 1 -50 -86 13 1
1
16 1
6 1
7 1
20 1
173 1 -37 -86 142 14
10 1
9
4 1
144 1 -50 -86 1 18
199 15
138 14
148 14
130 14
21 199 15 -37 -86 3 1 18 158
20 1 235
14 5 235
5 19
14 5 13 -50 -86 5 12 15
3 5 14 22 15 19 -50"·®¸®°d96} ¬

시도 해봐


1

PHP -a, 402 바이트 + 200 점수 = 602 점

foreach([67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,8,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14] as $i){echo ''.mb_chr($i+32);}

포트 Artermis 닭의 대답 , 나의 첫번째 codegolf 항목!

나를 그렇게하고자하는 잎 chr()단지 UTF-8을 지원할 수; 여분의 3 바이트 + 40 문자가 아파요!


PPCG에 오신 것을 환영합니다 :)
Shaggy

1

05AB1E , 점수 209 (1 자에 189 바이트 + 20 점)

•£?;\:'%¢;.'¡£/':¢?'¢°':¢°#@¢«>#%¡¤;®[¢:¥¢:©¢:¦¢;®¢>#¡£#¨¢#&¢+¢#,¢:§¡¤#¬¢#@¢#)¢#(¢#<¢#¢#/¡£#¯¢#.¢#>¢#±¢#«¡¤#?¢;¢#\¢#°¢#:¢'¢#%•[₅‰`©®_#∞158+902201401301670804020409010150250102709022¾¡.¥>:ç?

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

유일한 문자는 ç입니다. 통화 기호 €£¢는 유니 코드 문자로 간주되지 않습니다.


0

파이썬 3 , 397 바이트 + 19 자 = 777 점

print(''.join(chr(i+32)for i in[67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14]))

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

AdmBorkBork의 답변 포트 .




562 , -2 python 2를 사용하는 경우
ASCII 전용

TIO는 내 조직에서 일하지 않으므로 집에 가서 추가해야합니다.
Artemis는 여전히

0

R , 384 바이트 + 12 자 * 20 점 = 684 점

정말 독창적이지 않습니다.

cat(intToUtf8(c(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14)+32))

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


0

05AB1E 득점 (383) 365 (325 바이트 + 2 개 문자 패널티 20 *)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

@HyperNeutrino 의 젤리 답변 포트 .

여기서 개선하려고합니다. 숫자는 여러 개의 숫자 로 나눌 수 있지만 불행히도 바이트를 저장하지 않으며 압축 된 큰 제수에는 적어도 1자가 포함됩니다.

@Grimy 덕분에 -18 (+2 바이트 및 -20 페널티) , 문자 J(join)를 .««(연결 하여 줄임 )로 바꿉니다 .

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


1
J.««-18 일 수 있습니다 . 또는 완전히 다른 접근법은 내 대답을 참조하십시오 .
Grimmy

트윗 담아 가기 :) 그리고 좋은 대답!
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.