Salida de la canción del alfabeto ŋarâþ crîþ sin usar (m) ninguna letra


12

Su objetivo es escribir un programa que no tenga entrada y envíe el siguiente texto:

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.

Pero hay una trampa: por cada letra (cualquier personaje cuya categoría general en Unicode comience L) en su fuente, ¡obtiene una penalización de 20 caracteres! (Como referencia, el texto a imprimir tiene 81 letras).

El siguiente código de Perl 6 tiene 145 bytes y 84 letras, por lo que obtiene un puntaje de 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."

El siguiente código tiene 152 bytes y 70 letras, por lo que obtiene un puntaje de 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

Las lagunas estándar están prohibidas.

Originalmente, pensé en prohibir las letras por completo, pero no creo que haya muchos idiomas que lo hagan posible. Eres más que bienvenido a intentarlo.

(ŋarâþ crîþ [ˈŋaɹa̰θ kɹḭθ] es uno de mis conlangs. Quería poner en mayúscula su nombre aquí, pero obtengo el gran feo aquí. Oh, bueno, el idioma no usa letras mayúsculas en su romanización de todos modos.)

Editar: me di cuenta de que una de las líneas está mal, pero la guardaré ya que ya hay respuestas. La versión correcta de la tercera línea es ma a fa ga pa ta ča; a su elección, puede optar por producir el texto corregido en su lugar.


11
La complejidad de kolmogorov , la fuente restringida y la puntuación especial son todo tipo de cosas que se benefician enormemente de una cuidadosa consideración en el sandbox. Actualmente, parece que el mejor enfoque para este desafío sería simplemente escribir todos los puntos de código en decimal y luego convertirlos en texto con un código incorporado, con algún atajo para codificar todos los as, o no, dependiendo de cuántos tomaría letras, porque 20 caracteres es una penalización realmente grande (aunque cuando todo lo demás se puntúa por bytes, ¡no está muy bien definido ...)!
Cadena no relacionada

44
Y teniendo en cuenta la invocación de Unicode, es probable que se requieran algunas reglas explícitas que rigen las páginas de códigos especiales que usa la mayoría de los campos de golf (junto con un enlace a un script para validar la puntuación).
Cadena no relacionada

Respuestas:


21

7 , 410 caracteres, 154 bytes en la codificación de 7, 0 letras = puntaje 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

Pruébalo en línea!

En un desafío que no le gusta usar letras, ¿qué mejor idioma para usar que uno que consta solo de dígitos?

Este es un programa completo que sale por fallas, por lo que hay salidas extrañas a stderr, pero stdout es correcto.

Explicación

Un programa 7, en su primera iteración, simplemente empuja una serie de elementos a la pila (porque de los 12 comandos que existen en 7, solo 8 de ellos pueden representarse en un programa fuente, y esos 8 están especializados para escribir código para empujar estructuras de datos particulares a la pila). Este programa no utiliza el 6comando (que es la forma más sencilla de crear estructuras anidadas, pero por lo demás no tiende a aparecer literalmente en un programa fuente), por lo que solo los 7comandos determinan la estructura; 7empuja un nuevo elemento vacío a la parte superior de la pila (mientras que los comandos 0... 5simplemente se agregan a la parte superior de la pila). Por lo tanto, podemos agregar espacios en blanco al programa para mostrar su estructura:

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424030455 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

Los elementos cerca del final del programa se empujan al final, por lo que se encuentran en la parte superior de la pila al comienzo de la segunda iteración. En esta iteración, y en todas las futuras, el intérprete 7 realiza automáticamente una copia de la parte superior de la pila y la interpreta como un programa. El literal 41403empuja el (código en vivo no literal) 47463(7 tiene 12 comandos pero solo 8 de ellos tienen nombres; como tal, uso negrita para mostrar el código y no negrita para mostrar el literal que genera ese código, lo que significa eso, por ejemplo, 4es el comando que se agrega 4al elemento de la pila superior). Entonces, el programa que se ejecuta en la segunda iteración es 47463. Esto es lo que hace:

47463 
4        Intercambie los dos elementos superiores de la pila, agregue un elemento vacío entre
  7       Agregue un elemento vacío de la pila a la parte superior de la pila
   4      Intercambie los dos elementos superiores de la pila, agregue un elemento vacío entre
    6     Encuentre qué comandos generarían el elemento superior de la pila;
        agregue eso al elemento a continuación (y haga estallar la parte superior anterior de la pila)
    3    Salida del elemento de la pila superior, pop el elemento a continuación

Esto es más fácil de entender si miramos lo que le sucede a la pila:

  • ... d c ab un 47463 (código se ejecute: 47463)
  • ... d c b vaciar un (código se ejecute: )47463 7463
  • ... d c b vaciar un vacío (código se ejecute: )47463 463
  • ... d c b vacío vacío vacío un (código se ejecute: )47463 63
  • ... d c b vacío vacío " un " (código se ejecute: )47463 3
  • D c b vacío (código para ejecutar: vacío )47463

En otras palabras, tomamos la parte superior de la pila una , el trabajo a cabo lo que el código es más probable que lo han producido, y la salida de ese código. El 7 intérprete saca automáticamente los elementos vacíos desde la parte superior de la pila al final de una iteración, por lo que terminamos con la parte 47463posterior en la parte superior de la pila, al igual que en el programa original. Debería ser fácil ver lo que sucede después: terminamos revolviendo cada elemento de la pila uno tras otro, mostrándolos todos, hasta que la pila se desborda y el programa se bloquea. Básicamente, hemos creado un bucle de salida simple que analiza el código fuente del programa para determinar qué generar (no estamos generando las estructuras de datos que fueron empujadas a la pila por nuestro 0...5comandos, en su lugar, estamos recreando qué comandos se usaron al observar qué estructuras se crearon y generarlas). Por lo tanto, el primer elemento de salida de datos es 551220304010420030455(el código fuente que genera el segundo elemento de la pila superior), el segundo es 3341351…114525(el código fuente que genera el tercer elemento de la pila superior), y así sucesivamente.

Obviamente, sin embargo, estas piezas de código fuente no se generan sin codificar. 7 contiene varios idiomas diferentes de dominio específico para codificar la salida; una vez que se elige un idioma específico del dominio, permanece en uso hasta que se borra explícitamente, pero si ninguno de los idiomas se ha elegido todavía, el primer dígito del código que se emite determina cuál de los idiomas usar. En este programa, solo se usan dos idiomas: 551y 3.

551es bastante simple: es básicamente el antiguo código Baudot / teletipo utilizado para transmitir letras sobre teletipos, como un conjunto de caracteres de 5 bits, pero modificado para que todas las letras sean minúsculas. Entonces, el primer fragmento de código que se generará se descodifica de esta manera:

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

Como se puede ver, estamos ajustando cada carácter en dos dígitos octales, que es una relación de compresión bastante decente. Los pares de dígitos en el rango 0-5 nos dan 36 posibilidades, en oposición a las 32 posibilidades que Baudot necesita, por lo que los cuatro restantes se usan para comandos especiales; en este caso, 55al final borra el formato de salida recordado, lo que nos permite usar un formato diferente para la siguiente pieza de salida que produzcamos.

3es conceptualmente aún más simple, pero con un toque diferente. La idea básica es tomar grupos de tres dígitos (nuevamente, en el rango de 0-5, ya que esos son los dígitos para los que podemos garantizar que podemos recrear el código fuente original a partir de su salida), interpretarlos como tres dígitos número en la base 6, y simplemente generarlo como un byte en binario (lo que nos permite generar los caracteres multibyte en la salida deseada simplemente generando múltiples bytes). Sin embargo, el giro proviene del hecho de que solo hay 216 números de tres dígitos (con posibles ceros iniciales) en la base 6, pero 256 bytes posibles. 7 lo resuelve uniendo números desde 332₆ = 128₁₀ hacia arriba a dos bytes diferentes; 332puede emitir el byte 128 o 192, 333el byte 129 o el 193, y así sucesivamente, hasta el 515cual sale el byte 191 o 255.

¿Cómo sabe el programa cuál de las dos posibilidades puede generar? Es posible usar tripletas de dígitos 520hacia arriba para controlar esto explícitamente, pero en este programa no tenemos que: ¡el valor predeterminado de 7 es elegir todos los bytes ambiguos de tal manera que la salida sea válida UTF-8! Resulta que siempre hay a lo sumo una forma de hacer esto, por lo que siempre que queramos UTF-8 (y lo hagamos en este caso), podemos dejarlo ambiguo y el programa funciona de todos modos.

El final de cada una de las 3…secciones es 525, que restablece el formato de salida, lo que nos permite volver a 551la siguiente sección.


Esto es 410 bytes + 0 letras en la representación sin empaquetar, o 154 bytes + muchas letras en la representación empaquetada. Contar los bytes en uno y las letras en el otro parece engañoso.
Grimmy

1
@Grimy: Estás confundiendo bytes con caracteres. La representación empaquetada consta de 154 bytes en codificación de 7 que codifican 410 dígitos octales, cada uno de los cuales es un dígito, no una letra. Su razonamiento implica que, por ejemplo, ɓen Jelly no es una letra (porque su codificación en la codificación de Jelly corresponde al código de control "CSI" si se interpreta en un conjunto de caracteres típico de 8 bits, en lugar de una letra). Al igual que Jelly, 7 también usa una codificación personalizada; pero como 7 no usa letras, la codificación no necesita codificar letras y, por lo tanto, no puede.
ais523

10

Haskell, 0 letras, 423 bytes = puntaje 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]

Pruébalo en línea!


6

Gelatina ,  274  260212 bytes + 2 letras =  314 300  252

-48 bytes gracias 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

(Usos !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”de los cuales Vy son letras Unicode y se usan una vez cada uno)

Pruébalo en línea!




@NickKennedy Jugué jugando al golf, pero no di un paso atrás y busqué solo compensar los ordinales, cosas buenas, ¡gracias!
Jonathan Allan

3

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

Pruébalo en línea!

Enfoque ingenuo; Simplemente tomé los puntos del código y los convertí a decimal, resté 32, luego este código los trata como a charantes -joinde volver a juntarlos en una sola cadena.




3

Gelatina , 321 bytes + 2 letras = puntaje 361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

Pruébalo en línea!

Esto es horrible y alguien definitivamente puede hacerlo mejor.

Verificar puntaje .


1
en realidad menos malo de lo que parece
solo ASCII

2

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

Pruébalo en línea!


1

Retina , 140 caracteres, 159 bytes, 14 letras = puntaje 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`ŋ\`-{

Pruébalo en línea! Editar: se guardó 1 letra al cambiar de K`una nueva línea. Ahora también funciona en Retina 0.8.2 (pero el título sería demasiado largo).


1

Japt -S , 304 286 bytes + 2 1 letra s = 344 306

Bueno, esto es simplemente horrible!

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

Intentalo


1

PHP -a, 402 bytes + 200 penalización = 602 puntaje

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 respuesta del Puerto de Artermis Fowl , y mi primera entrada de codegolf!

Me deja deseando que chr()solo pueda soportar UTF-8; ¡esos 3 bytes adicionales + 40 caracteres duelen!


Bienvenido a PPCG :)
Shaggy

1

05AB1E , puntaje 209 (189 bytes + 20 penalizaciones por 1 letra)

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

Pruébalo en línea!

La única letra es ç. Los símbolos de moneda €£¢no se consideran letras en Unicode.


0

Python 3 , 397 bytes + 19 letras = 777 puntaje

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

Pruébalo en línea!

La respuesta del puerto de AdmBorkBork .




562 , -2 si usa Python 2
solo ASCII

TIO no funciona en mi organización, así que tendré que esperar para llegar a casa para agregarlos.
Artemis todavía no confía en SE

0

R , 384 bytes + 12 letras * 20 puntos = 684 puntaje

No es terriblemente original.

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

Pruébalo en línea!


0

05AB1E , puntaje 383 365 (325 bytes + 2 letras * 20 penalización)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

Puerto de la respuesta Jelly de @HyperNeutrino .

Intentaremos mejorar aquí. El número es divisible por un montón de números , pero ninguno de ellos salvaría ningún byte desafortunadamente, y los divisores más grandes comprimidos contienen al menos 1 letra.

-18 (+2 bytes y -20 de penalización) gracias a @Grimy , reemplazando la letraJ (join) con .««(reduce por concatenación).

Pruébalo en línea.


1
Jpuede ser .««para -18. O para un enfoque completamente diferente, vea mi respuesta .
Grimmy

@ Grimy Gracias! :) Y buena respuesta!
Kevin Cruijssen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.