El comando gatito

65

Un gatito es muy parecido a un gato. Algunas de las principales diferencias son ternura, falta de inteligencia y tamaño. Del mismo modo, el catcomando es diferente del kittencomando. Afortunadamente, solo hay una diferencia en este caso. En el comando gatito, todas las letras mayúsculas se reemplazan con letras minúsculas.


Objetivo

Para implementar un programa que se comporta de manera similar a cat. Todos los caracteres se [A-Z]muestran en minúsculas.


Entrada

Una lista de archivos como argumentos de línea de comando. Si no hay archivos en la lista, entonces lea desde la entrada estándar. La entrada puede contener caracteres no imprimibles y caracteres fuera del rango ASCII.


Salida

Si la entrada es un conjunto de archivos, concatene el contenido y muestre todos los caracteres en minúsculas. Si lee desde STDIN, muestre el contenido de STDIN con todas las letras mayúsculas en minúsculas.

Nota: Solo ponga los caracteres en [A-Z]minúscula. Es inaceptable si cualquier otro carácter está en minúscula.


Ejemplos

$ echo "HelLo" > file.txt
$ kitten file.txt
hello
$ echo "Good Bye" | kitten
good bye
$ echo "Ä" | kitten
Ä

Como es habitual con , gana menos bytes.

Tablas de clasificación


Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño 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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

# Perl, 43 + 2 (-p flag) = 45 bytes

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

El numero uno
fuente
2
Al declarar explícitamente "Solo poner los caracteres en [A-Z]minúsculas", ¿anticipa la entrada Unicode?
AdmBorkBork
2
@TimmyD Sí, pero es principalmente para evitar que las personas utilicen funciones integradas en minúsculas.
TheNumberOne
3
@FryAmTheEggman enlace permanente
Dennis
1
¿Qué tal Ü, Ñy los gustos?
Mástil
2
Es tan agradable cuando no ves ningún Pyth en absoluto en un codegolf ...
jmm

Respuestas:

52

Perl, 6 bytes

Código de 5 bytes + línea de comando de 1 byte

$_=lc

Ejemplo de uso:

echo ABCdef | perl -p kitten.pl
abcdef

Confirmación del comportamiento correcto de Unicode:

echo "HelloÉ" | perl -p kitten.pl
helloÉ
Steve
fuente
2
¿Estás seguro de que esto no afecta a los caracteres Unicode?
Martin Ender
77
@ MartinBüttner no lo hace . Aquí estamos en la categoría “de lo contrario”: “Las reglas ASCII se usan para el cambio de caso. La letra minúscula de cualquier carácter fuera del rango ASCII es el carácter en sí mismo ”. Mi +1 para la respuesta.
xebtl
178

Bash, 19 bytes

cat "$@"|tr A-Z a-z

La mejor manera de hacer gatitos es usar gatos reales.

Ejecución de ejemplo

$ ./kitten kitten
cat "$@"|tr a-z a-z
Dennis
fuente
39
La herramienta adecuada para el trabajo.
Trauma digital
120
+1 por solo necesitar un gato para hacer un gatito, siempre me lleva dos gatos
SnoringFrog
44
Ahora eso me recuerda a esos man womanchistes ...
xebtl
2
+1 por la clonación de gatos en lugar del método de apareamiento para crear descendencia
MD-Tech
25
@SnoringFrog Golpeó al otro.
TheNumberOne
22

Perl, 11 bytes

Código de 10 bytes + línea de comando de 1 byte

y/A-Z/a-z/

Ejemplo de uso:

perl -p entry.pl input1.txt input2.txt
echo "ABCdef" | perl -p entry.pl
Jarmex
fuente
15

Python 3, 77 bytes

from fileinput import*
print(end=b''.join(input(mode='rb')).lower().decode())
Anders Kaseorg
fuente
1
Eso es inteligente, usar bytes para evitar cambios que no sean ASCII.
matsjoyce
11

Rubí, 13 bytes

El recuento de bytes incluye 1 byte para la pbandera. Ejecutarlo así: ruby -p kitten.rb.

$_.downcase!

Toma información de los argumentos stdin o file, al igual que el gato adulto.

daniero
fuente
¿Esto solo minimiza ASCII, o también otros caracteres como Ä?
Paŭlo Ebermann
1
@ PaŭloEbermann: Lo acabo de probar: echo "HelloÉ" | ruby -p kitten.rb->helloÉ
Neil Slater
Juro que hubo un montón de comentarios aquí con respecto a eso ayer. No sé a dónde fueron, pero: Sí, funciona de acuerdo con las especificaciones.
daniero
5

PowerShell, 112 bytes

function l([string]$a){97..122|%{[char]$b=$_;$a=$a-split$b-join$b};$a}if($args){$args|%{l(gc $_)}}else{l $input}

Horrendamente ilegible. Aquí hay una versión ligeramente expandida a continuación:

function l([string]$a){
  97..122|%{
    [char]$b=$_
    $a=$a-split$b-join$b
  }
  $a
}

if($args){
  $args|%{
    l(gc $_)
  }
}
else{
  l $input
}

Define una función interna lque itera sobre un bucle de 97 a 112 (es decir, ASCII aa ASCII z). Divide la cadena de entrada sobre ese carácter (yay no distingue entre mayúsculas y minúsculas), y vuelve a unirlo con la minúscula "correcta". Tenga en cuenta que sí, esto significa que "Prueba" se convertiría brevemente en "T st" a medida que se repite e, por ejemplo. No afecta la salida.

La segunda mitad es la parte difícil de averiguar si tenemos entrada de canalización (equivalente a stdin para PowerShell) o entrada de línea de comandos. La variable especial $argssolo está presente si la entrada de la línea de comandos está presente, por lo que hacemos un bucle sobre cada uno gc(for Get-Content) y lo hacemos hasta l. De lo contrario, simplemente arrastrar nuestra $inputhasta l. Tenga en cuenta que podríamos intercambiar nuestras declaraciones if / else (es decir, if($input)), pero dado que "input" es un carácter más largo que "args", esta forma es más corta.

AdmBorkBork
fuente
@Nazek El incorporado "String".ToLower()también en minúscula caracteres Unicode, lo que va en contra de las reglas. Hay muchas cosas que PowerShell no hace bien con respecto a Unicode, pero desafortunadamente esta es una instancia que funciona correctamente.
AdmBorkBork
5

Python 2, 53 bytes

from fileinput import*
print''.join(input()).lower(),
Anders Kaseorg
fuente
5

R, 97 bytes

cat(chartr("A-Z","a-z",sapply(if(length(a<-commandArgs(T))){a}else{"stdin"},readLines)),sep="\n")

Uso:

$ echo "HeLlo" > file.txt
$ Rscript kitten.R file.txt
hello
$ echo "Good Bye" | Rscript kitten.R
good bye
$ echo "bLABLa" > file2.txt
$ Rscript kitten.R file.txt file2.txt
hello
blabla
$ echo Ä | Rscript kitten.R
Ä
plannapus
fuente
5

CoffeeScript , 292 bytes

f=require 'fs';d='';p=process;v=p.argv;s=p.stdin;l=((d)=>console.log d.replace /([A-Z])/g,(a,l)=>l.toLowerCase());if v.length>2 then(v.forEach (v,i)=>if i>1 then(f.exists v, (e) =>if e then(f.readFile v,'utf-8',(r,d)=>l d) else l v))else(s.resume();(s.on 'data',(c)=>d+=c);s.on 'end',()=>l d)

Uso:

$ echo "HelLo" > file.txt
$ coffee kitten.coffee file.txt
hello
$ echo "Good Bye" | coffee kitten.coffee
good bye
$ echo "Ä" | kitten
Ä
$ coffee kitten.coffee file.txt SoMeTeXt
sometext
hello

Mi primera participación en codegolf, así que no seas grosero :).

Seguro que este código se puede jugar más y coffee / javascript no es la mejor opción para hacerlo, pero hace lo que se espera.

Cuando lee los argumentos, también se ocupa de la existencia del archivo (si el archivo no existe, la cadena está en kit).

¡Cualquier ayuda o consejo para mejorar este código es bienvenida!

dunpeal69
fuente
4

Julia, 123 bytes

f(s)=for l=readlines(s) print(replace(l,r"[A-Z]",lowercase))end
A=ARGS
length(A)>0?for i=A open(f,i)end:open(f,readline())

Sin golf:

function file_to_lower(s::Stream)
    # Loop over the lines of the input stream
    for l in readlines(r)
        # Print the lowercased line
        print(replace(l, r"[A-Z]", lowercase))
    end
end

if length(ARGS) > 0
    # Loop over the files specified from the command line
    for i in ARGS
        # Open the file, apply the function, then close it
        open(file_to_lower, i)
    end
else
    # Get the input file from STDIN
    open(file_to_lower, readline())
end
Alex A.
fuente
4

CJam, 18 bytes

ea_:gs{q}?'_,_eler

La lista de archivos debe proporcionarse en forma de URL, que es el único formato que CJam entiende.

Ejecuciones de ejemplo

$ cjam kitten <<< "AaÁáÄä"
aaÁáÄä
$ cjam kitten file:///home/dennis/kitten file:///home/dennis/kitten
ea_:gs{q}?'_,_elerea_:gs{q}?'_,_eler

Cómo funciona

ea                  Push the array of command-line arguments.
  _                 Push a copy.
   :g               Retrieve the contents of all files with those URLS.
     s              Flatten the resulting array of strings.
      {q}           Push a block that reads all input from STDIN.
         ?          Select the string of the array of args is non-empty.
                    Otherwise, execute the code block.
          '_,       Push the string of all ASCII characters before _.
             _el    Push a copy and convert it to lowercase.
                er  Perform transliteration.
Dennis
fuente
4

Python 2, 100 102 97 bytes

Funcionalidad corregida (y 4 bytes agregados) por matsjoyce. Afortunadamente, guardé dos bytes al cambiar a Python 2.

from sys import*;print''.join(f.read().lower()for f in(map(open,argv[1:])if argv[1:]else[stdin]))

Toma argumentos de la línea de comando o de STDIN si no se encuentran argumentos.

Esto abusa de los argumentos predeterminados de algunas funciones. Por defecto, openutiliza el modo de texto de solo lectura, que es exactamente lo que queremos. read, si se llama sin argumentos, devolverá todo el texto en la secuencia.

Sin golf:

import sys

if len(sys.argv) > 1:              # If we have command-line arguments:
    source = []                    # Initialize an empty list
    for path in sys.argv[1:]:      # Iterate through every filename we have
        kitfile = open(path, 'rt') # Open the file in read-only text mode
        source.append(kitfile)     # Add it to the list
else:                              # Otherwise, if the args are empty:
    source = [sys.stdin]           # Set our source to STDIN wrapped in a list

kittened = []                      # Initialize an empty list
for kitfile in source:             # Iterate through every file (or just STDIN)
    text = kitfile.read()          # Read everything from the stream
    kitten_text = text.lower()     # Make it lowercase
    kittened.append(kitten_text)   # Add it to the list
final = ''.join(kittened)          # Join everything together
print final                        # Print the result
bkul
fuente
1
Esto no funcionará para stdin, ya que solo lee una línea y no la pone en minúscula.
matsjoyce
@matsjoyce He arreglado mi código. ¡Gracias por el recordatorio! Desafortunadamente, agregó cuatro bytes, pero al no depender más de inputno evaluar, pude cambiar a Python 2 y eliminar los paréntesis print.
bkul
3

Python 3, 124 123 bytes


from sys import*
for f in list(map(open,argv[1:]))or[stdin]:print(f.read().translate({i:i+32for i in range(65,91)}),end="")

¡Python come gatitos!

$ python kitten.py file.txt
hello
$ echo "Good Bye" | python kitten.py 
good bye
$ echo "Ä" | python kitten.py 
Ä
matsjoyce
fuente
3

C, 106 108 bytes

Editar: se corrigió un error que se arrastraba al apretar bytes. Stdin no estaba funcionando, ahora lo está.

Estoy bastante seguro de que podría exprimir algunos bytes, pero aquí hay una presentación fácil de entender, nada abusiva del lenguaje:

main(n,s,f,c)void**s;{for(f=n-1?open(*++s,0,0):0;read(f,&c,1);putchar(64<c&c<91?c+32:c));n-->2&&main(n,s);}

Y una versión un poco más ordenada para leer:

main(n,s,f,c)
void**s;
{
    for(f=n-1?open(*++s,0,0):0; read(f,&c,1); putchar(64<c&c<91?c+32:c));
    n-->2&&main(n,s);
}
algmyr
fuente
+1 porque esto me enseñó que los parámetros int implícitos solo son posibles con la sintaxis de K&R.
Felix Dombek
2

Mathematica, 66 bytes

kit=StringReplace[#,x:RegularExpression["[A-Z]"]:>ToLowerCase[x]]&

Llamado

kit@"HelLo"

Mathematica ya tiene una ToLowerCasefunción, pero también convierte caracteres especiales (Unicode y matemáticos). Así que tuve que gatitarlo. Esta función tomará cualquier entrada.

Verbeia
fuente
@TheNumberOne: así es como funciona en Mathematica. No se necesita más código para hacer esto. Si desea un ejecutable, entonces Mathematica no es la herramienta.
Verbeia
¿Esto concatena archivos cuyos nombres se ingresan como argumentos de línea de comandos, según sea necesario?
msh210
Los argumentos de la línea de comandos no existen en Mathematica. Conkittea sus entradas de función. Además, no necesita asignar a una variable.
CalculatorFeline
2

C #, 230 226 bytes

namespace System{using Linq;class P{static void Main(string[]a){Console.Write(string.Concat((a.Length>0?string.Concat(a.Select(f=>IO.File.ReadAllText(f))):Console.In.ReadToEnd()).Select(c=>c>'@'&&c<'['?char.ToLower(c):c)));}}}

Sin golf:

namespace System
{
    using Linq;
    class P
    {
        static void Main(string[] a)
        {
            Console.Write(                                                  // Print...
                string.Concat(                                                  // ...all chars combined to a string...
                    (a.Length > 0 ?                                             // ...commandline arguments?...
                        string.Concat(a.Select(f => IO.File.ReadAllText(f))) :  // ...then all files as single string...
                        Console.In.ReadToEnd()                                  // ...else STDIN input
                    ).Select(c => c > '@' && c < '[' ? char.ToLower(c) : c)     // ...Lowercase only A..Z
                )
            );  
        }
    }
}
RobIII
fuente
2

Haskell, 133

import System.Environment
main=getArgs>>=mapM_(>>=putStr.map l).f
f[]=[getContents]
f n=map readFile n
l x=[x..]!!sum[32|x>'@',x<'[']

El procesamiento de args estilo gato se deriva de este tutorial , luego se reorganiza para afeitar los caracteres.

Explicando l, la función para minúsculas de un carácter:

  • sum[32|condition]es una forma más corta de if condition then 32 else 0.
  • [x..]!!countes y iterate succ x !! countes toEnum $ fromEnum x + countmás corto que importar y usar Data.Char.toLowercon una condición para restringirlo a ASCII.
  • '@'y '['son los caracteres inmediatamente anteriores Ay siguientes Z, de modo que puedo usarlos en <lugar de <=.

Gracias a Anders Kaseorg para contribuir al sum[...|...]y [x..]!!trucos.

Kevin Reid
fuente
1
l x=[x..]!!sum[32|x>'@',x<'[']
Anders Kaseorg
1

C #, 342 bytes

  • toma la lista de archivos de los argumentos pasados.
  • lee cada carácter en cada archivo que solo se convierte a minúsculas si y solo si el carácter en el rango A..Z lo envía a STDOUT.
  • Si no hay una lista de archivos que lea STDIN, lea cada carácter, convierta a minúsculas si y solo si el carácter en el rango A..Z lo envía a STDOUT.
namespace System{
using IO;
using Linq;
class P{
static void Main(string[]a){
Action<char>e=C=>{var c=char.ToLower(C);Console.Out.Write(c>='a'&&c<='z'?c:C);};
if(a.Length>0)a.ToList().ForEach(f=>File.ReadAllText(f).ToCharArray().ToList().ForEach(e));
else 
while(true) Console.In.ReadLine().ToCharArray().ToList().ForEach(e);
}
}
}

C #, 319 bytes

revestimiento simple, igual que el anterior:

namespace System{using IO;using Linq;class P{static void Main(string[]a){Action<char>e=C=>{var c=char.ToLower(C);Console.Out.Write(c>='a'&&c<='z'?c:C);};if(a.Length>0)a.ToList().ForEach(f=>File.ReadAllText(f).ToCharArray().ToList().ForEach(e));else while(true)Console.In.ReadLine().ToCharArray().ToList().ForEach(e);}}}
guion bajo
fuente
1

SILOS 179 caracteres

loadLine :
a = 256
x = get a
lbla
X = x
B = x
C = 91
B - 64
if B c
printChar x
GOTO x
lblc
C - x
if C D
printChar x
GOTO x
lblD
x + 32
printChar x
lblx
a + 1
x = get a
if x a
lblb

¡Siéntase libre de probar este código en línea!


Esencialmente se traduce a esto en pusedocode.

String input = input();
for(char c in input)
if(c is uppercase) print c + 32/*lowercase c*/else print c
Rohan Jhunjhunwala
fuente
0

C, 91 bytes

#include <stdio.h>
main(){int c;while(EOF!=(c=getc(stdin))){c=tolower(c);putc(c,stdout);}}

C, 98 bytes

#include <stdio.h>
main(){int c;while(EOF!=(c=getc(stdin))){if(c>64&&c<91)c+=32;putc(c,stdout);}}

Sin embargo, si la legibilidad importaba más que el conteo de bytes, la misma lógica se escribe a continuación:

#include <stdio.h>
main()
{
int c;
        while (EOF != (c = getc(stdin))) {
                if ((c >= 'A') && ((c <= 'Z')))
                        c = (c - 'A') + 'a';
                putc(c,stdout);
        }
}
Dave Thompson
fuente
Esto falla el primer caso de prueba.
TheNumberOne
Esto no cumple con la especificación. Debería comportarse como un gato en el sentido de que toma los nombres de archivo como argumentos y, si no se dan nombres de archivo, lea de stdin. Actualmente solo lee de stdin.
algmyr
0

sed, 14 bytes

s/[A-Z]/\L\0/g

Corre con env -i sed -f kitten.sed.

Ángel
fuente
1
Dado que esta es solo una forma elegante de decirlo LANG=C sed -f kitten.sed, no estoy seguro de si debería aplicar una multa para dar cuenta de eso. Esta pregunta no especifica cómo contar las llamadas al programa, y ​​no parece abordarse en meta.
Ángel
¿Esto concatena archivos cuyos nombres se ingresan como argumentos de línea de comandos, según sea necesario?
msh210
@ msh210 Sí, por supuesto.
Ángel
1
@ Ángel s/.*/\L&/para una solución de nueve bytes
someonewithpc
Gracias @someonewithpc. Tanto s/.*/\L&/y s/./\L&/gson de hecho las soluciones de 9 bytes!
Ángel
0

Java, 198 bytes

b->B->{B="";for(java.io.File c:b)B+=new java.util.Scanner(c).useDelimiter("\\Z").next();for(int c=0;c++<B.length;)if(B.charAt(c)>64&B.charAt(c)<91)B=B.replace(B.charAt(c),B.charAt(c)|32);return B;};

¡Estás obligado a usar la lambda anterior con los archivos, por lo que no es necesario recibir información de STDIN! Además, es un Function<File[], UnaryOperator<String>>. Se usa como foo.apply(anArrayOfFiles).apply(anything).

Como algo que tiene más sentido para aquellos que son nuevos en Java, se necesitan 223 bytes:

String A(java.io.File[]b){String B="";for(java.io.File c:b)B+=new java.util.Scanner(c).useDelimiter("\\Z").next();for(int c=0;c++<B.length;)if(B.charAt(c)>64&B.charAt(c)<91)B=B.replace(B.charAt(c),B.charAt(c)|32);return B;}

Como algo que se compila, ocupa 232 bytes:

class a{String A(java.io.File[]b){String B="";for(java.io.File c:b)B+=new java.util.Scanner(c).useDelimiter("\\Z").next();for(int c=0;c++<B.length;)if(B.charAt(c)>64&B.charAt(c)<91)B=B.replace(B.charAt(c),B.charAt(c)|32);return B;}}
dorukayhan
fuente