Il comando gattino


65

Un gattino è molto simile a un gatto. Alcune delle differenze principali sono carineria, mancanza di intelligenza e dimensioni. Allo stesso modo, il catcomando è diverso dal kittencomando. Fortunatamente, c'è solo una differenza in questo caso. Nel comando gattino, tutte le lettere maiuscole vengono sostituite con lettere minuscole.


Obbiettivo

Per implementare un programma che si comporta in modo simile a cat. Tutti i caratteri [A-Z]vengono emessi in minuscolo.


Ingresso

Un elenco di file come argomenti della riga di comando. Se non è elencato alcun file, leggere dall'input standard. L'input può contenere caratteri non stampabili e caratteri al di fuori dell'intervallo ASCII.


Produzione

Se l'input è un gruppo di file, concatena i contenuti e genera tutti i caratteri in minuscolo. Se si legge da STDIN, produrre il contenuto di STDIN con tutte le lettere maiuscole in minuscolo.

Nota: rendere i caratteri solo [A-Z]minuscoli. È inaccettabile se tutti gli altri personaggi sono scritti in minuscolo.


Esempi

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

Come al solito con il , vince meno byte.

Classifiche


Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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


2
Dichiarando esplicitamente "Rendi solo i caratteri [A-Z]minuscoli" stai anticipando l'input Unicode?
AdmBorkBork,

2
@TimmyD Sì, ma è principalmente per impedire alle persone di utilizzare le funzioni integrate in minuscole.
TheNumberOne

3
@FryAmTheEggman permalink
Dennis

1
Che ne dite Ü, Ñe simili?
Albero

2
È così bello quando non vedi alcun Pyth in un codegolf ...
jmm

Risposte:


52

Perl, 6 byte

Codice 5 byte + riga comandi 1 byte

$_=lc

Esempio di utilizzo:

echo ABCdef | perl -p kitten.pl
abcdef

Conferma del comportamento Unicode corretto:

echo "HelloÉ" | perl -p kitten.pl
helloÉ

2
Sei sicuro che ciò non influisca sui caratteri Unicode?
Martin Ender,

7
@ MartinBüttner E non lo fa . Siamo nella categoria "altrimenti" qui: "Le regole ASCII vengono utilizzate per la modifica del caso. Il carattere minuscolo di qualsiasi carattere al di fuori dell'intervallo ASCII è il carattere stesso. ”Il mio +1 per la risposta.
xebtl,

178

Bash, 19 byte

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

Il modo migliore per fare i cuccioli è usare i gatti reali.

Esempio di esecuzione

$ ./kitten kitten
cat "$@"|tr a-z a-z

39
Lo strumento giusto per il lavoro.
Trauma digitale,

120
+1 per aver solo bisogno di un gatto per fare un gattino, mi porta sempre due gatti
Russare Rana

4
Ora, questo mi ricorda quelle man womanbattute ...
xebtl,

2
+1 per la clonazione del gatto piuttosto che il metodo di accoppiamento della creazione della prole
MD-Tech

25
@SnoringFrog Ha picchiato l'altro.
TheNumberOne

22

Perl, 11 byte

Codice 10 byte + riga comandi 1 byte

y/A-Z/a-z/

Esempio di utilizzo:

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

15

Python 3, 77 byte

from fileinput import*
print(end=b''.join(input(mode='rb')).lower().decode())

1
È intelligente, usare i byte per evitare il cambiamento di non-ASCII.
matsjoyce,

11

Rubino, 13 byte

Il conteggio dei byte include 1 byte per il pflag. Eseguire in questo modo: ruby -p kitten.rb.

$_.downcase!

Prende input dagli argomenti stdin o file, proprio come il gatto adulto.


Questo minimizza solo ASCII, o anche altri personaggi come Ä?
Paŭlo Ebermann,

1
@ PaŭloEbermann: l'ho appena provato: echo "HelloÉ" | ruby -p kitten.rb->helloÉ
Neil Slater

Giuro che ci sono stati un sacco di commenti qui al riguardo ieri. Non so dove siano andati, ma: Sì, funziona secondo le specifiche.
daniero,

5

PowerShell, 112 byte

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

Orrendamente illeggibile. Ecco una versione leggermente espansa di seguito:

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

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

Definisce una funzione interna lche scorre su un loop da 97 a 112 (ovvero da ASCII aa ASCII z). Suddivide la stringa di input su quel carattere (yay senza distinzione tra maiuscole e minuscole), la ricongiunge con il minuscolo "corretto". Si noti che sì, questo significa che "Test" diventerà brevemente "T st" mentre scorre iterando e, ad esempio. Non influisce sull'output.

La seconda parte è un po 'complicata per capire se abbiamo input da pipeline (equivalente a stdin per PowerShell) o input da riga di comando. La variabile speciale $argsè presente solo se è presente l'input da riga di comando, quindi passiamo su ciascuno di essi, gc(per Get-Content) e schlep fino a l. Altrimenti, ci limitiamo $inputa farlo l. Si noti che potremmo scambiare le nostre istruzioni if ​​/ else (cioè, if($input)), ma poiché "input" è un carattere più lungo di "args" in questo modo è più breve.


@Nazek Il built-in "String".ToLower()avrebbe anche minuscoli caratteri Unicode, il che è contrario alle regole. Ci sono molte cose che PowerShell non fa bene con Unicode, ma sfortunatamente questa è un'istanza che funziona correttamente.
AdmBorkBork,


5

R, 97 byte

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
Ä

5

CoffeeScript , 292 byte

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

La mia prima partecipazione a codegolf, quindi per favore non essere scortese :).

Sicuramente questo codice può essere golfato di più e coffee / javascript non è la scelta migliore per farlo, ma fa quello che ci si aspetta.

Quando legge argomenti, si occupa anche dell'esistenza dei file (se il file non esiste, la stringa è bloccata).

Qualsiasi aiuto o consiglio per migliorare questo codice è il benvenuto!


4

Julia, 123 byte

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

Ungolfed:

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

4

CJam, 18 byte

ea_:gs{q}?'_,_eler

L'elenco dei file deve essere fornito sotto forma di URL, che è l'unico formato che CJam comprende.

L'esempio funziona

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

Come funziona

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.

4

Python 2, 100 102 97 byte

Funzionalità corretta (e aggiunti 4 byte) da matsjoyce. Fortunatamente, ho salvato due byte passando a Python 2.

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

Accetta argomenti dalla riga di comando o da STDIN se non viene trovato alcun argomento.

Ciò abusa degli argomenti predefiniti di alcune funzioni. Per impostazione predefinita, openutilizza la modalità di testo di sola lettura, che è esattamente ciò che vogliamo. read, se chiamato senza argomenti, restituirà tutto il testo nello stream.

Ungolfed:

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

1
Questo non funzionerà per lo stdin, poiché leggi solo una riga e non la minuscola.
matsjoyce,

@matsjoyce Ho corretto il mio codice. Grazie per il promemoria! Sfortunatamente, ha aggiunto quattro byte, ma non dipendendo più dalla inputvalutazione, potrei passare a Python 2 e rimuovere le parentesi print.
bkul,

3

Python 3, 124 123 byte


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 mangia gattini!

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

3

C, 106 108 byte

Modifica: risolto un errore che si verificava quando si stringevano i byte. Stdin non funzionava, ora lo è.

Sono abbastanza sicuro di poter spremere alcuni byte di distanza, ma ecco una presentazione di facile comprensione, per nulla linguistica:

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

E una versione un po 'più ordinata per la lettura:

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

+1 perché questo mi ha insegnato che i parametri int impliciti sono possibili solo con la sintassi di K&R.
Felix Dombek,

2

Mathematica, 66 byte

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

Chiamato come

kit@"HelLo"

Mathematica ha già una ToLowerCasefunzione, ma converte anche caratteri speciali (Unicode e matematici). Quindi ho dovuto gattonarlo. Questa funzione prenderà qualsiasi input.


@TheNumberOne: è così che funziona in Mathematica. Non è necessario altro codice per farlo. Se vuoi un eseguibile, Mathematica non è lo strumento.
Verbeia,

Questo concatena i file i cui nomi sono inseriti come argomenti della riga di comando, come richiesto?
msh210

Gli argomenti della riga di comando non esistono in Mathematica. Conkitten i suoi input di funzione. Inoltre non è necessario assegnare a una variabile.
CalcolatriceFeline

2

C #, 230 226 byte

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

Ungolfed:

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

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<'[']

L'elaborazione args in stile gatto deriva da questo tutorial , quindi riorganizzata per radere i personaggi.

Spiegando l, la funzione per minuscola di un carattere:

  • sum[32|condition]è una forma più breve di if condition then 32 else 0.
  • [x..]!!countis iterate succ x !! countis toEnum $ fromEnum x + counte più breve dell'importazione e dell'uso Data.Char.toLowercon una condizione per limitarlo a ASCII.
  • '@'e '['sono i personaggi che precedono Ae seguono immediatamente Z, in modo che io possa usare al <posto di <=.

Grazie a Anders Kaseorg per contribuire alla sum[...|...]e [x..]!!trucchi.


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

1

C #, 342 byte

  • prende l'elenco dei file dagli argomenti passati.
  • leggi ogni carattere in ogni file che converte solo in minuscolo se e solo se il carattere nell'intervallo A..Z che lo invia a STDOUT.
  • Se non esiste un elenco di file che legge STDIN, legge ogni carattere, viene convertito in lettere minuscole se e solo se il carattere nell'intervallo A..Z non lo invia 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 byte

fodera singola, come sopra:

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

1

SILOS 179 caratteri

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

Sentiti libero di provare questo codice online!


Essenzialmente si traduce in questo in codice pused.

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

0

C, 91 byte

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

C, 98 byte

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

Tuttavia, se la leggibilità contava più del conteggio dei byte, la stessa logica è scritta di seguito:

#include <stdio.h>
main()
{
int c;
        while (EOF != (c = getc(stdin))) {
                if ((c >= 'A') && ((c <= 'Z')))
                        c = (c - 'A') + 'a';
                putc(c,stdout);
        }
}

Questo fallisce il primo caso di test.
TheNumberOne

Questo non soddisfa le specifiche. Dovrebbe comportarsi come un gatto, nel senso che prendi i nomi dei file come argomenti e se non vengono dati i nomi dei file, leggi dallo stdin. Al momento leggi solo da stdin.
algmyr,

0

sed, 14 byte

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

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


1
Dal momento che questo è solo un modo elegante per dire LANG=C sed -f kitten.sed, non sono sicuro se dovrei applicare una penalità per giustificare ciò. Questa domanda non specifica come contare le chiamate al programma e non sembra essere affrontata in meta.
Ángel,

Questo concatena i file i cui nomi sono inseriti come argomenti della riga di comando, come richiesto?
msh210

@ msh210 Sì, certo.
Ángel

1
@ Ángel s/.*/\L&/per un nove byte soluzione
someonewithpc

Grazie @someonewithpc. Entrambi s/.*/\L&/e s/./\L&/gsono davvero soluzioni a 9 byte!
Ángel,

0

Java, 198 byte

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

Sei costretto a usare la lambda sopra con i file, quindi non è necessario prendere input da STDIN! Inoltre, è un Function<File[], UnaryOperator<String>>. È usato come foo.apply(anArrayOfFiles).apply(anything).

Come qualcosa che ha più senso per coloro che sono nuovi a Java, ci vogliono 223 byte:

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

Come qualcosa che si compila, occupa 232 byte:

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