Definimos el espacio en blanco como cualquiera de los tres caracteres, tabulación (0x09), nueva línea (0x0A) o espacio (0x20).
Para este desafío, debe escribir dos programas o funciones en el mismo lenguaje de programación, que realizan las siguientes tareas:
Cuente los caracteres de espacio en blanco en una cadena dada. Por ejemplo, la entrada
123 -_- abc def
devolvería 7 (siempre que no haya una nueva línea final).
Dividir una cadena dada en ejecuciones consecutivas de espacios en blanco. Si la cadena comienza o termina con espacios en blanco, no se deben devolver cadenas vacías en los extremos. Por ejemplo, la misma entrada
123 -_- abc def
Volvería
["123", "-_-", "abc", "def"]
.
En cualquier caso, puede ingresar datos a través de STDIN, argumento de línea de comando o argumento de función para devolver el resultado o imprimirlo STDOUT. Para el segundo programa, si elige imprimir en STDOUT, imprima cada cadena en su propia línea, sin comillas.
Para ambos programas, puede suponer que la entrada contiene solo ASCII imprimible (0x20 a 0x7E) y espacios en blanco.
Ahora aquí está la trampa:
- Si se elimina todo el espacio en blanco de ambos programas / funciones, las cadenas resultantes deben ser idénticas. Es decir, sus dos presentaciones solo pueden diferir en el número y la ubicación de los espacios en blanco.
- Ningún programa / función puede contener cadenas o expresiones literales regulares (los literales de caracteres están bien, siempre que su idioma tenga un tipo de carácter designado).
- Ningún programa / función puede contener comentarios.
- No debe leer el código fuente del programa, directa o indirectamente.
Este es el código de golf. Su puntaje es la suma de los tamaños de ambas soluciones (en bytes). La puntuación más baja gana.
Tablas de clasificación
El siguiente fragmento de pila genera una tabla de clasificación regular y una descripción general de los ganadores por idioma. Entonces, incluso si su idioma de elección no le permite ganar el desafío completo, ¿por qué no tratar de obtener un lugar en la segunda lista? ¡Me interesaría mucho ver cómo las personas abordan este desafío en una variedad de idiomas!
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño total de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
También puede incluir los recuentos individuales antes del recuento total, p. Ej.
# Python 2, 35 + 41 = 76 bytes
El último número que no se tacha será utilizado por el fragmento.
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 42253;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
fuente
Respuestas:
Pyth, 16 + 15 = 31 bytes
Probarlo aquí .
Mostrador:
Disidente:
Cada uno de ellos define una función,
y
que toma una entrada de cadena para resolver la tarea deseada.Gracias a @FryAmTheEggman por la idea de usar la función de indexación modular de Pyth en listas para afeitar un personaje.
Casos de prueba:
Explicación:
fuente
Python, 54 + 56 = 110 bytes
Mostrador:
Disidente:
Para el contador, usamos el hecho de que Python está de acuerdo con tener solo una expresión en una línea. Es necesario dividir
+1
y0<9or x.split()
evitar queNameError
se lance, ya0<9
queTrue
impide quex.split()
se evalúe debido a un cortocircuito.Para el divisor, dado que el número de espacios en blanco siempre es no negativo,
sum(y.isspace()for y in x)+10<9
siempre lo esFalse
y la función de división entra en juego.Alternativa 1, 59 + 60 = 119 bytes
Mostrador:
Disidente:
Los resultados de contar y dividir se almacenan en una lista de dos elementos. La lista se indexa por cualquiera
min([1])
, devolviendo el mínimo de la lista de un elemento que contiene1
, om in([1])
, que devuelveFalse
(equivalente a0
) comom
no está contenido[1]
.Alternativa 2, 67 + 69 = 136 bytes
Mostrador:
Disidente:
Al igual que arriba, los resultados de contar y dividir se almacenan en una lista de dos elementos.
sorted
es una función incorporada que es un valor verdadero, por lo quenot sorted
devuelveFalse
(equivalente a0
). Porquenot s or ted
, dado ques
es una función y también es verdad,not s
esFalse
yted = 1
se devuelve.Alternativa 3, 59 + 60 = 119 bytes
Mostrador:
Disidente:
Esta es una función donde el resultado del divisor se almacena en la variable
a
, y el resultado del contador se almacena en la variablea1
. Como antes, Python está bien con solo tener una expresión en una línea, en este caso1
. La divisióna1
determina qué volver de la función.fuente
not sorted
.+1
y0<9or x.split()
necesaria?m=lambda x:sum(y.isspace()for y in x)+00and x.split()
ym=lambda x:sum(y.isspace()for y in x)+0;0and x.split()
(haciendo de ese punto y coma una nueva línea, por supuesto)Java 8, 239 + 240 = 479
Cuenta el espacio en blanco (devuelve Integer)
Dividir en el espacio en blanco (devuelve Stream <String>)
Explicación:
fuente
Espacio en blanco, 75 + 153 = 228
Espacios, pestañas y nuevas líneas sustituidos por STL, respectivamente, y plegados para legibilidad. Convierte a un archivo de espacio en blanco adecuado con
tr -d \\n | sed 'y/STL/ \t\n/'
.Mostrador
Disidente
fuente
Marbelous, 103 + 92 = 195
Mostrador:
Disidente:
Prueba estos programas aquí. Los tableros cilíndricos, las bibliotecas de inclusión y los espacios para celdas en blanco se deben verificar.
La entrada y la salida son a través de STDIN / STDOUT.
Explicación
Mostrador:
El camino azul recibe entrada. Si el carácter es un espacio en blanco (valor ASCII menor que 0x21), se toma la ruta negra, que se sincroniza con la ruta púrpura.
La ruta púrpura simplemente incrementa una canica almacenada en el
&1
sincronizador cada vez que se toma la ruta negra.Una vez que no hay más entradas, se toma la ruta roja, imprime el número de caracteres de espacios en blanco y sale.
Disidente:
El programa comienza con la ruta azul, que se repite hasta encontrar un carácter que no sea un espacio en blanco.
Una vez que se recupera un carácter que no es un espacio en blanco, se toma el camino negro, que imprime este carácter y mueve la ejecución al camino verde, que se repite e imprime hasta que se recibe un carácter de espacio en blanco. Luego, la ejecución continúa hacia la ruta púrpura, que contiene
3W
, o un divisor de tres vías.La rama izquierda mueve la ejecución a la ruta azul (y el espacio en blanco se descarta hasta que se encuentre un carácter que no sea un espacio en blanco).
La rama central establece la copia de la entrada en 0 con
?0
(genera un número aleatorio entre0
y0
) y agrega 10 (0x0A
= nueva línea), que luego se genera.El camino correcto se descarta.
fuente
CJam, 26 + 27 = 53
59 61 73 77bytesMostrador
Disidente
Cómo funciona
La idea es simple: calcule el número de espacios en blanco y divida la cadena en ejecuciones consecutivas de espacios en blanco. Luego elija uno de ellos basándose en el siguiente hecho que
' !
significanot of space character
que es falso, mientras que'!
es el!
personaje, que es verdadero.Código ampliado:
La entrada es de STDIN y la salida es de STDOUT
Pruébalo en línea aquí
fuente
Mathematica, 44 + 43 = 87
97bytesPensé que agregaría otro idioma a la mezcla.
Mostrador:
Disidente:
Esto hace uso de la característica de Mathematica de que la separación espacial es lo mismo que la multiplicación. Y que multiplicar algo por 0 siempre es 0, y agregar 0 a algo siempre es idempotente.
Para el contador, primero contamos el espacio en blanco y luego lo agregamos
0*1*StringSpli*t@#
.StringSpli
yt
no están definidos, pero Mathematica usa el cálculo simbólico, por lo que solo los trata como una variable y función desconocidas. El1*
es idempotente (igual que0+
), el lo0*
convierte en cero. Es necesario separar elStringSplit
en dos variables, ya que0
una lista de veces se trata como una multiplicación de vector escalar que resulta en un vector (lista) de ceros.Para el divisor, estoy usando el hecho de que
Count
también existe pero no busca cadenas. Intenta contar todas las subexpresiones que coinciden con el patrón, peroWhitespace
es un patrón que solo se aplica al contenido de la cadena. AsíCount
siempre volverá0
, lo que hace queString
desaparezca. La multiplicación de la matriz dividida por01 = 1
es nuevamente idempotente.fuente
Ruby,
10791 bytesSplitter (46 bytes)
Contador (45 bytes)
p
es un método predefinido que, sin argumentos, solo devuelvenil
. Usamos esto de varias maneras. En el divisor, la inicialp
no hace nada.gets(p)
lee todo desde la entrada estándar, ya que el delimitador es nulo. Llamamos al método de división incorporado en eso y le asignamos el resultadop
, por lo que ahora, cuando no se le dan argumentos, se analizará como una variable.puts p||...
cortocircuita e imprime cada elemento de lap
variable en su propia línea.En el contador, eliminamos la primera línea nueva para que se asigne la matriz dividida
pp
. Como no lo hemos asignadop
, sigue siendo el método de retorno nulo, por lo que la segunda parte del||
se evalúa y se pasa aputs
.$_
es una variable mágica que contiene el resultado degets
, por lo que la cantidad total de espacios en blanco es el tamaño de eso menos los caracteres que no son espacios en blanco, que son los quepp
contiene. Siento que debería haber una forma más corta de hacer el conteo, pero no puedo encontrar una, y en cualquier caso, usar la matriz dividida en el contador es divertido.fuente
Python, 169
¡Es casi demasiado fácil hacer esto en Python!
Mostrador:
Disidente:
Difieren en un solo espacio, y no estoy haciendo ningún truco como dividir un número o un nombre de variable por la mitad :)
fuente
C, 138 + 136 = 274
En cada caso, el código es un programa que acepta exactamente un argumento de línea de comandos e imprime el resultado en stdout.
\t
debe reemplazarse con un carácter de tabulación. Si desea pasar un argumento que contenga pestañas y nuevas líneas, es su trabajo averiguar cómo;).Contando
Terrible
fuente
JavaScript, 95 + 96 = 191 bytes
Mostrador:
Disidente:
Sin golf:
La
RegExp(String.fromCharCode(92,115)
línea crea la expresión regular de coincidencia de espacios en blanco/\s/
sin expresiones regulares o literales de cadena.En cada programa, usamos la variable
v
ovv
. Almacenamos la matriz dividida en esa variable (v
ovv
), y luego ramificamos nuestro comportamiento en el valor dev
(mientras tanto,vv
se ignora). En el mostrador,v
tiene un valor de verdad; en el divisor tiene un valor falso (porquevv
obtuvo el valor en su lugar).Alternativa: JavaScript, 250 bytes
Tengo otra solución que no está ganando ningún premio por brevedad, pero pensé que era un desafío interesante abusar del comportamiento de inserción automática de punto y coma de JavaScript.
Mostrador:
Disidente:
Contador sin golf:
El divisor es exactamente el mismo, excepto por la línea:
es ahora
La inserción automática de punto y coma de JavaScript normalmente no termina las declaraciones de varias líneas antes si pueden entenderse sin un salto de línea, pero no tolera los saltos de línea después
return
,continue
obreak
. Por lo tanto, la línea se lee simplemente comobreak
, que se escapa solo del bucle interno, en lugar de salir del bucle externo. El comportamiento de "segundo paso"o = a.filter(j=>j)
se ejecuta (en lugar de omitirse en el contador), porque el bucle externo recibe un segundo paso.fuente
!!x
diferente a laBool
conversión automática ?filter
auto-bool devuelve su devolución de llamada por las mismas reglas que!!
. ¡Gracias!Python,
228198182166146145 bytesContador ( 72 bytes ):
Divisor ( 73 bytes ):
ior1
es una variable falsey, peroi or 1
es veraz. Ese es el truco principal.fuente
i
es la cadena vacía para el divisor? Podría solucionarse cambiandoiorb
aior1
, que también le permite guardar el carácter entre1
yelse
.Befunge 98, 61 + 59 = 120
Mostrador:
Disidente:
fuente
Bash, 75 + 79 = 154 bytes
Esto se basa en que bash pueda continuar la ejecución incluso si algunas líneas o partes de una línea del script están mal formadas (en algunas circunstancias). El espacio en blanco se usa para desactivar los escapes para algunos corchetes cercanos y para romper una tubería colocándola en una nueva línea.
Disidente:
Mostrador:
La entrada es a través del argumento de línea de comandos, la salida es a través de stdout.
Debido a que esto se basa en el comportamiento de error bash, se espera que el usuario ignore stderr.
Ejemplo de ejecución (que muestra la entrada con una nueva línea y múltiples espacios contiguos):
fuente
Rubí,
114 + 116107+ 109 = 216 bytesEsto no puede competir con la solución rubí del histocrat, pero pensé que valdría la pena aguantar de todos modos.
Solía
$z
pornil
ynil.to_s
paraString.new
El carácter de espacio en blanco adicional que agrego al final de la entrada es forzar que la última palabra se agregue a la matriz (
r
): una palabra solo se agrega al final de la matriz cuando un carácter de espacio en blanco sigue a un carácter que no es un espacio en blanco. La alternativa era agregar otror<<w if w
después deleach_byte
bloqueo.Contando
Terrible
fuente
Haskell ,
53 + 55 = 10836 + 38 = 74 bytesMostrador
Disidente
Esta solución hace uso del hecho de que en Haskell las funciones son una instancia de la clase de tipo Monad y, por lo tanto, se pueden usar como acciones monádicas en notación.
En el primer caso, la función resultante del bloque do es el primer argumento de
pure
(que es esencialmenteconst
para el tipo de función), lo que hace que el contador sea el resultado final y se descarte el divisor.En el segundo caso,
pure
solo se aplica a un único argumento, por lo que es una función que devuelve otra función (el contador). Sin embargo, el resultado nunca se usa y, por lo tanto, se descarta. El resultado final es la segunda línea del do-block, el divisor.fuente
[' ','\t','\n']
se puede acortar a" \t\n"
.(<'!')
para probar los espacios en blanco.Java 8, 187 + 188 = 375
En primer lugar, me gustaría decir que esta respuesta se basa en gran medida en @ Ypnypn. Básicamente reemplacé algunas partes por otras más cortas (incluida la parte dependiente del espacio en blanco, que IMO es la más importante en este desafío), pero el código funcional es casi el mismo.
Cuente el espacio en blanco , 187 (retornos
int
):Dividir en el espacio en blanco , 188 (retornos
Stream<String>
):fuente
J, 48 + 49 = 97 char
Dos funciones que toman y devuelven un solo argumento. Utilicé la forma más desagradable que se me ocurrió para vencer la regla del mismo pero espacio en blanco, por lo que probablemente haya personajes para salvar al encontrar una ruta más inteligente alrededor de eso.
Definimos el verbo
a
para que tenga dos acciones diferentes, dependiendo de si se usa con un argumento o con dos. Con un argumento, es(e.u:)&9 10 32
, que comprueba si cada carácter es espacio en blanco o no. Con dos argumentos, es decira:-.~(<;._1~1,}.)
, que toma un vector booleano a la derecha y corta el argumento izquierdo en esas posiciones, arrojando cualquier corte vacío cona:-.~
.Luego, definimos el
aa
número de valores Verdaderos en el resultado dea
, que solo tiene sentido con un argumento. Finalmente, usamosaa
oa a
dependiendo de si queremos contar o dividir el espacio en blanco de la cadena.aa
Funciona como se esperaba.La razón
a a
funciona porque cuando J ve(f g)y
, considera(f g)
un gancho y lo evalúa comoy f (g y)
. En este caso,f
es la diádicaa
superior la que hace el corte, yg
esa[aa
, que calcula la suma deaa
, la arroja y calcula (monádica)a
nuevamente.En la REPL:
fuente
Bash, 54 + 50 = 104 bytes
Mostrador
Disidente
fuente
Perl, 37 + 38 = 75
Contador :
Divisor :
fuente
Perl 6, 31 + 32 = 63 bytes
Mostrador
Pruébalo en línea!
?^1
se analiza como el?^ 1
que aplica el operador de negación booleano a 1, lo que da como resultadoFalse
.Disidente
Pruébalo en línea!
? ^1
convierte el rango 0..0 a Bool, lo que resulta enTrue
.fuente
Pitón 2, 98
División (49)
Devuelve los tokens en una lista.
Contar (49)
Devuelve una lista de longitud uno que contiene el número de caracteres de espacio. Lo más probable es que cause un error de tiempo de ejecución, pero la función
f
se puede usar después de ejecutar el código.fuente
C (gcc) , 88 + 89 = 177 bytes
Disidente
Disidente
Mostrador
Mostrador
Atropellar
Toma la entrada como un argumento de función. La función de conteo devuelve el número de espacios en blanco. La función de división usa STDOUT para su salida (pero incidentalmente devuelve el número de espacios en blanco menos uno también).
fuente
Zsh , 35 + 35 = 70 bytes
No estoy seguro de si
[^$IFS]
califica, ya que se utiliza en la coincidencia de patrones. Aquí hay una solución 45 + 45 en caso de que esté prohibida.División:
Contar:
El valor
:
incorporado es equivalente atrue
, lo usamos como algo entre un comentario y / dev / null (ya que los comentarios no están permitidos) al canalizar la expansión no deseada.Zsh tiene una función integrada para dividirse en espacios en blanco, ese ser
${=var}
. Esto hace que sea difícil hacer cualquier tipo de combinación lógica que no sea simplemente ejecutar ambas y descartar la que no queremos.Pruébalo en línea!
fuente