Stampa la canzone dell'alfabeto ŋarâþ crîþ senza usare (m) alcuna lettera


12

Il tuo obiettivo è scrivere un programma che non accetta input e genera il seguente testo:

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.

Ma c'è un problema: per ogni lettera (qualsiasi personaggio la cui categoria generale in Unicode inizia con L) nella tua fonte, ricevi una penalità di 20 caratteri! (Per riferimento, il testo da stampare ha 81 lettere.)

Il codice Perl 6 di seguito ha 145 byte e 84 lettere, quindi ottiene un punteggio di 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."

Il codice seguente ha 152 byte e 70 lettere, quindi ottiene un punteggio di 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

Sono vietate le scappatoie standard .

Inizialmente, ho pensato di vietare del tutto le lettere, ma non credo che ci siano molte lingue che lo rendono possibile. Sei più che benvenuto a provare.

(ŋarâþ crîþ [ˈŋaɹa̰θ kɹḭθ] è uno dei miei conlangs. Volevo capitalizzare il suo nome qui, ma qui ho il brutto big eng. Oh beh, la lingua non usa mai le lettere maiuscole nella sua romanizzazione comunque.)

Modifica: ho capito che una delle righe è sbagliata, ma la terrò dal momento che ci sono già delle risposte. La versione corretta della terza riga è ma a fa ga pa ta ča; a tua scelta, puoi scegliere di produrre invece il testo corretto.


11
kolmogorov-complessità , fonte limitata e punteggio speciale sono tutti i tipi di cose che traggono grande beneficio da un'attenta considerazione nella sandbox. Attualmente, sembra che l'approccio migliore a questa sfida sia semplicemente quello di scrivere tutti i punti di codice in decimale, quindi trasformarli in testo con un built-in, con qualche scorciatoia per codificare tutti gli as - o no, a seconda di quanti le lettere sarebbero necessarie, perché 20 caratteri sono una penalità molto grande (anche se quando tutto il resto è segnato da byte, non è del tutto ben definito ...)!
Corda non correlata

4
E considerando l'invocazione di Unicode, sono probabilmente richieste alcune regole esplicite che governano codici speciali usati dalla maggior parte dei golflang (oltre a un collegamento a uno script per convalidare il punteggio).
Corda non correlata

Risposte:


21

7 , 410 caratteri, 154 byte nella codifica di 7, 0 lettere = punteggio 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

Provalo online!

In una sfida che non piace usare le lettere, quale linguaggio migliore usare di una che consiste solo di cifre?

Questo è un programma completo che esce tramite crash, quindi c'è un output estraneo a stderr, ma stdout è corretto.

Spiegazione

Un programma 7, alla sua prima iterazione, inserisce semplicemente un numero di elementi nello stack (perché dei 12 comandi esistenti in 7, solo 8 di essi possono essere rappresentati in un programma sorgente e quelli 8 sono specializzati per scrivere codice per inserire nello stack strutture di dati particolari). Questo programma non usa il 6comando (che è il modo più semplice per creare strutture nidificate, ma altrimenti tende a non apparire letteralmente in un programma sorgente), quindi sono solo i 7comandi a determinare la struttura; 7spinge un nuovo elemento vuoto nella parte superiore dello stack (mentre i comandi 0... si 5aggiungono appena all'inizio dello stack). Possiamo quindi aggiungere spazi bianchi al programma per mostrare la sua struttura:

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424030455 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

Gli elementi vicino alla fine del programma vengono spinti per ultimi, quindi sono in cima allo stack all'inizio della seconda iterazione. Su questa iterazione e su tutte le iterazioni future, l'interprete 7 crea automaticamente una copia della parte superiore dello stack e la interpreta come un programma. Il letterale 41403spinge il (codice non letterale, live) 47463(7 ha 12 comandi ma solo 8 di essi hanno nomi; come tale, uso grassetto per mostrare il codice e non grassetto per mostrare il letterale che genera quel codice, il che significa che, ad esempio, 4è il comando che aggiunge 4all'elemento superiore dello stack). Quindi il programma che gira sulla seconda iterazione è 47463. Ecco cosa fa:

47463 
4        Scambia i primi due elementi dello stack, aggiungi un elemento vuoto tra
  7       Aggiungi un elemento dello stack vuoto nella parte superiore dello stack
   4      Scambia i due primi elementi dello stack, aggiungi un elemento vuoto tra
    6     Scopri quali comandi genererebbero l'elemento dello stack superiore;
        aggiungilo all'elemento in basso (e fai apparire la vecchia parte superiore dello stack)
    3    Output l'elemento stack superiore, pop l'elemento in basso

Questo è più facile da capire se guardiamo cosa succede allo stack:

  • ... d c b a 47463 (codice da eseguire 47463:)
  • D c b svuota a (codice da eseguire :)47463 7463
  • ... d c b vuoto a vuoto (codice da eseguire :)47463 463
  • D c b vuoto vuoto vuoto a (codice da eseguire :)47463 63
  • D c b vuoto vuoto " a " (codice da eseguire :)47463 3
  • D c b vuoto (codice da eseguire: vuoto )47463

In altre parole, prendiamo la cima dello stack a , elaboriamo quale codice ha più probabilità di averlo prodotto e produciamo quel codice. L'interprete 7 estrae automaticamente gli elementi vuoti dalla cima dello stack alla fine di un'iterazione, quindi finiamo con il 47463retro in cima allo stack, proprio come nel programma originale. Dovrebbe essere facile vedere cosa succederà dopo: finiremo per sfornare ogni elemento dello stack uno dopo l'altro, emettendoli tutti, fino a quando lo stack trabocca e il programma si arresta in modo anomalo. Quindi abbiamo praticamente creato un semplice ciclo di output che esamina il codice sorgente del programma per determinare cosa produrre (non stiamo producendo le strutture di dati che sono state inviate allo stack dal nostro 0...5comandi, stiamo invece ricreando quali comandi sono stati usati osservando quali strutture sono state create e emettendole). Pertanto, il primo elemento di output dei dati è 551220304010420030455(il codice sorgente che genera il secondo elemento stack dall'alto), il secondo è 3341351…114525(il codice sorgente che genera il terzo elemento stack dall'alto) e così via.

Ovviamente, però, questi pezzi di codice sorgente non vengono emessi senza codifica. 7 contiene diverse lingue specifiche del dominio per la codifica dell'output; una volta scelta una lingua specifica del dominio, questa rimane in uso fino a quando non viene esplicitamente cancellata, ma se nessuna delle lingue è stata ancora scelta, la prima cifra del codice in uscita determina quale delle lingue utilizzare. In questo programma, vengono utilizzate solo due lingue: 551e 3.

551è piuttosto semplice: è fondamentalmente il vecchio codice Baudot / teletype usato per trasmettere lettere su teletipi, come un set di caratteri a 5 bit, ma modificato per rendere tutte le lettere minuscole. Quindi il primo blocco di codice in uscita viene decodificato in questo modo:

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

Come si può vedere, stiamo adattando ogni personaggio a due cifre ottali, che è un rapporto di compressione abbastanza decente. Le coppie di cifre nell'intervallo 0-5 ci offrono 36 possibilità, al contrario delle 32 possibilità di cui Baudot ha bisogno, quindi le restanti quattro sono usate per comandi speciali; in questo caso, 55alla fine cancella il formato di output ricordato, permettendoci di usare un formato diverso per il prossimo output che produciamo.

3è concettualmente ancora più semplice, ma con una svolta. L'idea di base è quella di prendere gruppi di tre cifre (di nuovo, nell'intervallo 0-5, poiché quelle sono le cifre per le quali possiamo garantire che possiamo ricreare il codice sorgente originale dal suo output), interpretarli come tre cifre numero in base 6, e lo emette semplicemente come un byte in binario (permettendoci così di emettere i caratteri multibyte nell'output desiderato semplicemente emettendo più byte). La svolta, tuttavia, deriva dal fatto che ci sono solo 216 numeri a tre cifre (con possibili zeri iniziali) nella base 6, ma 256 possibili byte. 7 aggira il problema collegando numeri da 332₆ = 128₁₀ verso l'alto a due byte diversi; 332può emettere byte 128 o 192, 333byte 129 o 193 e così via, fino ai 515quali uscite byte 191 o 255.

Come fa il programma a sapere quale delle due possibilità emettere? È possibile utilizzare terzine di cifre dall'alto 520verso l'alto per controllarlo esplicitamente, ma in questo programma non è necessario: l'impostazione predefinita di 7 è quella di selezionare tutti i byte ambigui in modo tale che l'output sia UTF-8 valido! Si scopre che c'è sempre al massimo un modo per farlo, quindi fino a quando è UTF-8 che vogliamo (e lo facciamo in questo caso), possiamo semplicemente lasciarlo ambiguo e il programma funziona comunque.

La fine di ciascuna delle 3…sezioni è 525, che reimposta il formato di output, permettendoci di tornare alla 551sezione successiva.


Si tratta di 410 byte + 0 lettere nella rappresentazione non compressa o 154 byte + molte lettere nella rappresentazione compressa. Contare i byte in uno e le lettere nell'altro sembra poco costoso.
Grimmy,

1
@Grimy: stai confondendo i byte con i personaggi. La rappresentazione impacchettata è costituita da 154 byte nella codifica 7 che codifica per 410 cifre ottali, ciascuna delle quali è una cifra e non una lettera. Il tuo ragionamento implica che, diciamo, ɓin Jelly non è una lettera (perché la sua codifica nella codifica di Jelly corrisponde al codice di controllo "CSI" se interpretato in un tipico set di caratteri a 8 bit, piuttosto che una lettera). Proprio come Jelly, 7 utilizza anche una codifica personalizzata; ma poiché 7 non usa lettere, la codifica non ha bisogno di codificare lettere e quindi non può.
ais523,

10

Haskell, 0 lettere, 423 byte = punteggio 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]

Provalo online!


6

Gelatina ,  274 260  212 byte + 2 lettere =  314 300  252

-48 byte grazie a Nick Kennedy

“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

(Utilizza i !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”quali Ve sono lettere Unicode e vengono utilizzate una volta ciascuna)

Provalo online!




@NickKennedy Avevo giocato a golf con il numero, ma non ho fatto un passo indietro e ho cercato di compensare solo gli ordinali, roba buona - grazie!
Jonathan Allan,

3

PowerShell , segna 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)})

Provalo online!

Approccio ingenuo; Ho appena preso i punti del codice e li ho convertiti in decimali, sottratto 32, quindi questo codice li tratta come charprima di -joinricollegarli in un'unica stringa.




3

Gelatina , 321 byte + 2 lettere = punteggio 361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

Provalo online!

Questo è orribile e qualcuno può sicuramente fare di meglio.

Verifica il punteggio .


1
in realtà meno male di quanto sembri
solo ASCII il

2

Python 3 , 380 byte + 5 lettere = 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.""")

Provalo online!


1

Retina , 140 caratteri, 159 byte, 14 lettere = punteggio 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`ŋ\`-{

Provalo online! Modifica: 1 lettera salvata passando da K`una nuova riga. Ora funziona anche in Retina 0.8.2 (ma il titolo sarebbe troppo lungo).


1

Japt -S , 304 286 byte + 2 1 lettera s = 344 306

Bene, questo è semplicemente terribile!

"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} ¬

Provalo


1

PHP -a, 402 byte + 200 penalità = 602 punti

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);}

La risposta di Port of Artermis Fowl e la mia prima entrata in codice

Mi lascia desiderare che chr()possa supportare UTF-8; quei 3 byte extra + 40 caratteri fanno male!


Benvenuto in PPCG :)
Shaggy,

1

05AB1E , punteggio 209 (189 byte + 20 penalità per 1 lettera)

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

Provalo online!

L'unica lettera è ç. I simboli di valuta €£¢non sono considerati lettere in Unicode.


0

Python 3 , 397 byte + 19 lettere = 777 punti

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]))

Provalo online!

La risposta del porto di AdmBorkBork .




562 , -2 se si utilizza Python 2
solo ASCII il

TIO non funziona nella mia organizzazione, quindi dovrò aspettare per tornare a casa per aggiungere quelli.
Artemis non si fida ancora del

0

R , 384 byte + 12 lettere * 20 punti = 684 punti

Non terribilmente originale.

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))

Provalo online!


0

05AB1E , punteggio 383 365 (325 byte + 2 lettere * 20 penalità)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

La risposta di Jelly al Porto di @HyperNeutrino .

Proverò a migliorare qui su. Il numero è divisibile per un gruppo di numeri , ma nessuno di questi salverebbe sfortunatamente byte e i divisori più grandi compressi contengono almeno 1 lettera.

-18 (+2 byte e -20 di penalità) grazie a @Grimy , sostituendo la lettera J(join) con .««(riduci concatenando).

Provalo online.


1
Jpuò essere .««per -18. O per un approccio completamente diverso, vedi la mia risposta .
Grimmy,

@Grimy Grazie! :) E bella risposta!
Kevin Cruijssen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.