Das Kätzchen Kommando


65

Ein Kätzchen ist einer Katze sehr ähnlich. Einige der Hauptunterschiede sind Niedlichkeit, mangelnde Intelligenz und Größe. Ebenso unterscheidet sich der catBefehl vom kittenBefehl. Zum Glück gibt es in diesem Fall nur einen Unterschied. Im Kitten-Befehl werden alle Großbuchstaben durch Kleinbuchstaben ersetzt.


Zielsetzung

So implementieren Sie ein Programm, das sich ähnlich verhält wie cat. Alle Zeichen [A-Z]werden in Kleinbuchstaben ausgegeben.


Eingang

Eine Liste von Dateien als Befehlszeilenargumente. Wenn keine Dateien aufgelistet sind, lesen Sie von der Standardeingabe. Die Eingabe kann nicht druckbare Zeichen und Zeichen außerhalb des ASCII-Bereichs enthalten.


Ausgabe

Wenn es sich bei der Eingabe um eine Reihe von Dateien handelt, verketten Sie den Inhalt und geben Sie alle Zeichen in Kleinbuchstaben aus. Wenn Sie aus STDIN lesen, geben Sie den Inhalt von STDIN mit allen Großbuchstaben als Kleinbuchstaben aus.

Hinweis: Machen Sie die Zeichen nur in [A-Z]Kleinbuchstaben. Es ist nicht akzeptabel, wenn andere Zeichen in Kleinbuchstaben geschrieben werden.


Beispiele

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

Wie beim , gewinnen die wenigsten Bytes.

Bestenlisten


Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

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


2
[A-Z]Erwarten Sie eine Unicode-Eingabe, indem Sie explizit "Nur die Zeichen in Kleinbuchstaben schreiben" angeben ?
AdmBorkBork

2
@TimmyD Ja, aber hauptsächlich, um zu verhindern, dass Benutzer integrierte Funktionen für Kleinbuchstaben verwenden.
TheNumberOne

3
@FryAmTheEggman Permalink
Dennis

1
Wie wäre es Ü, Ñund die Gleichen?
Mast

2
Es ist so schön, wenn man in einem Codegolf überhaupt keinen Pyth sieht ...
jmm

Antworten:


52

Perl, 6 Bytes

5 Byte Code + 1 Byte Befehlszeile

$_=lc

Anwendungsbeispiel:

echo ABCdef | perl -p kitten.pl
abcdef

Bestätigung des korrekten Unicode-Verhaltens:

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

2
Sind Sie sicher, dass dies keine Auswirkungen auf Unicode-Zeichen hat?
Martin Ender

7
@ Martinbüttner geht es nicht . Wir befinden uns hier in der Kategorie „Sonst“: „Für die Groß- / Kleinschreibung werden ASCII-Regeln verwendet. Der Kleinbuchstabe eines Zeichens außerhalb des ASCII-Bereichs ist das Zeichen selbst. “Mein +1 für die Antwort.
Xebtl

178

Bash, 19 Bytes

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

Der beste Weg, um Kätzchen zu machen, ist die Verwendung von echten Katzen.

Beispiellauf

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

39
Das richtige Werkzeug für den Job.
Digital Trauma

120
+1 für nur eine Katze benötigt, um ein Kätzchen zu machen, nimmt mich immer zwei Katzen
SnoringFrog

4
Das erinnert mich an diese man womanWitze…
xebtl

2
+1 für die Katze Klonen anstatt Paarungsmethode der Erzeugung von Nachkommen
MD-Tech

25
@ SnoringFrog Er schlug den anderen nieder.
TheNumberOne

22

Perl, 11 Bytes

10 Byte Code + 1 Byte Befehlszeile

y/A-Z/a-z/

Anwendungsbeispiel:

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

15

Python 3, 77 Bytes

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

1
Das ist clever: Verwenden Sie Bytes, um zu verhindern, dass sich Nicht-ASCII-Zeichen ändern.
Matsjoyce

11

Ruby, 13 Bytes

Die Byteanzahl enthält 1 Byte für das pFlag. Führen Sie es wie folgt: ruby -p kitten.rb.

$_.downcase!

Übernimmt die Eingabe von Standard- oder Dateiargumenten, genau wie die erwachsene Katze.


Geht das nur in Kleinbuchstaben wie ASCII, oder auch andere Zeichen Ä?
Paŭlo Ebermann

1
@ PaŭloEbermann: Ich habe es gerade getestet: echo "HelloÉ" | ruby -p kitten.rb->helloÉ
Neil Slater

Ich schwöre, es gab gestern eine ganze Reihe von Kommentaren dazu. Ich weiß nicht, wohin die gingen, aber: Ja, es funktioniert nach der Spezifikation.
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}

Schrecklich unleserlich. Hier ist eine etwas erweiterte Version:

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

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

Definiert eine interne Funktion l, die über eine Schleife von 97 bis 112 (dh ASCII abis ASCII z) iteriert . Teilt die Eingabezeichenfolge auf dieses Zeichen auf (yay case-insensitive default), und setzt die "richtige" Kleinbuchstaben hinzu. Beachten Sie, dass ja, dies bedeutet, dass "Test" kurz "T st" wird, wenn es ezum Beispiel durch das durchläuft . Beeinflusst die Ausgabe nicht.

Die zweite Hälfte ist das schwierige Stück, um herauszufinden, ob es eine Pipeline-Eingabe (entspricht stdin für PowerShell) oder eine Befehlszeilen-Eingabe gibt. Die Sondervariable $argsist nur vorhanden, wenn eine Befehlszeileneingabe vorhanden ist. Wir durchlaufen also jede einzelne Variable gc(for Get-Content) und schleppen sie auf l. Ansonsten schleppen wir uns einfach $inputauf l. Beachten Sie, dass wir unsere if / else-Anweisungen austauschen könnten if($input), aber da "input" ein Zeichen länger als "args" ist, ist dieser Weg kürzer.


@Nazek Die eingebauten "String".ToLower()Unicode-Zeichen würden auch in Kleinbuchstaben geschrieben, was gegen die Regeln verstößt . Es gibt eine Menge Dinge, die PowerShell in Bezug auf Unicode nicht richtig macht, aber leider ist dies eine Instanz, die es richtig funktioniert.
AdmBorkBork


5

R 97 Bytes

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

Verwendungszweck:

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

Verwendungszweck:

$ 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

Meine erste Teilnahme am Codegolf, sei also bitte nicht unhöflich :).

Sicher kann dieser Code mehr gespielt werden und Kaffee / Javascript ist nicht die beste Wahl, um das zu tun, aber es tut, was erwartet wird.

Beim Lesen von Argumenten wird auch auf die Dateikonsistenz geachtet (wenn die Datei nicht vorhanden ist, wird die Zeichenfolge kittened).

Hilfe oder Ratschläge zur Verbesserung dieses Codes sind willkommen!


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

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 Bytes

ea_:gs{q}?'_,_eler

Die Liste der Dateien muss in Form von URLs bereitgestellt werden. Dies ist das einzige Format, das CJam versteht.

Beispiel läuft

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

Wie es funktioniert

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 Bytes

Die Funktionalität wurde von matsjoyce korrigiert (und 4 Bytes hinzugefügt). Glücklicherweise habe ich durch den Wechsel zu Python 2 zwei Bytes gespart.

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

Übernimmt Argumente von der Befehlszeile oder von STDIN, wenn keine Argumente gefunden wurden.

Dies missbraucht die Standardargumente einiger Funktionen. Standardmäßig,open der schreibgeschützte Textmodus verwendet, genau das, was wir möchten. readWenn der Befehl ohne Argumente aufgerufen wird, wird der gesamte Text im Stream zurückgegeben.

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
Dies funktioniert nicht für stdin, da Sie nur eine Zeile lesen und nicht in Kleinbuchstaben schreiben.
Matsjoyce

@matsjoyce Ich habe meinen Code repariert. Danke für die Erinnerung! Leider fügte es vier Bytes hinzu, aber da inputich nicht mehr davon abhängig war, es nicht auszuwerten, konnte ich zu Python 2 wechseln und die Klammern an entfernen 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 frisst Kätzchen!

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

3

C 106 108 Bytes

Bearbeiten: Es wurde ein Fehler behoben, der sich beim Auspressen von Bytes eingeschlichen hat. Stdin hat nicht funktioniert, jetzt ist es.

Ich bin mir ziemlich sicher, dass ich ein paar Bytes wegpressen könnte, aber hier ist eine leicht zu verstehende, überhaupt nicht beleidigende Behauptung:

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

Und eine etwas übersichtlichere Version zum Lesen:

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, weil mir das beigebracht hat, dass implizite int-Parameter nur mit K & R-Syntax möglich sind.
Felix Dombek

2

Mathematica, 66 Bytes

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

Genannt als

kit@"HelLo"

Mathematica hat bereits eine ToLowerCaseFunktion, konvertiert aber auch Sonderzeichen (Unicode und mathematische Zeichen). Also musste ich es kittenisieren. Diese Funktion nimmt jede Eingabe entgegen.


@TheNumberOne - so funktioniert das in Mathematica. Dazu wird kein Code mehr benötigt. Wenn Sie eine ausführbare Datei möchten, ist Mathematica nicht das Werkzeug.
Verbeia

Verkettet dies Dateien, deren Namen bei Bedarf als Befehlszeilenargumente eingegeben werden?
msh210

Befehlszeilenargumente gibt es in Mathematica nicht. Es stellt seine Funktionseingänge zusammen. Sie müssen auch keine Variable zuweisen.
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)));}}}

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

Die Verarbeitung der cat-style-Argumente leitet sich aus diesem Tutorial ab und anschließend neu angeordnet, um die Zeichen zu rasieren.

Erklärt ldie Funktion, ein Zeichen in Kleinbuchstaben zu schreiben:

  • sum[32|condition] ist eine kürzere Form von if condition then 32 else 0 .
  • [x..]!!countis iterate succ x !! countis toEnum $ fromEnum x + countund kürzer als importieren und verwendenData.Char.toLower mit einer Bedingung, um es auf ASCII zu beschränken.
  • '@'und '['sind die Zeichen unmittelbar vor Aund nach Z, so dass ich <stattdessen verwenden kann <=.

Vielen Dank an Anders Kaseorg für die Beiträge sum[...|...]und [x..]!!Tricks.


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

1

C #, 342 Bytes

  • Nimmt die Dateiliste aus den übergebenen Argumenten.
  • Lesen Sie jedes Zeichen in jeder Datei, und konvertieren Sie es nur dann in Kleinbuchstaben, wenn das Zeichen im Bereich A..Z an STDOUT gesendet wird.
  • Wenn es keine Dateiliste gibt, die STDIN liest, jedes Zeichen liest, wird genau dann in Kleinbuchstaben konvertiert, wenn das Zeichen im Bereich A..Z an STDOUT gesendet wird.
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

Einzeiler wie oben:

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 Zeichen

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

Fühlen Sie sich frei, diesen Code online auszuprobieren!


Im Wesentlichen wird dies im Pusedocode übersetzt.

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

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

Wenn die Lesbarkeit mehr als die Anzahl der Bytes ausmacht, wird die gleiche Logik wie folgt geschrieben:

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

Dies schlägt im ersten Testfall fehl.
TheNumberOne

Dies entspricht nicht der Spezifikation. Es sollte sich in dem Sinne wie cat verhalten, dass Sie Dateinamen als Argumente verwenden und, wenn keine Dateinamen angegeben sind, von stdin lesen. Sie lesen derzeit nur von stdin.
Algmyr

0

sed, 14 bytes

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

Laufen Sie mit env -i sed -f kitten.sed.


1
Da dies nur eine originelle Art zu sagen ist LANG=C sed -f kitten.sed, bin ich mir nicht sicher, ob ich dafür eine Strafe verhängen soll. Diese Frage gibt nicht an, wie Programmaufrufe gezählt werden sollen, und scheint in Meta nicht angesprochen zu sein.
Ángel

Verkettet dies Dateien, deren Namen bei Bedarf als Befehlszeilenargumente eingegeben werden?
msh210

@ msh210 Ja natürlich.
Angel

1
@ Ángel s/.*/\L&/für eine neun-Byte-Lösung
someonewithpc

Vielen Dank @someonewithpc. Beides s/.*/\L&/und s/./\L&/gsind in der Tat 9-Byte-Lösungen!
Á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;};

Sie müssen das obige Lambda für Dateien verwenden, sodass Sie keine Eingaben von STDIN vornehmen müssen! Es ist auch eine Function<File[], UnaryOperator<String>>. Es wird gerne benutztfoo.apply(anArrayOfFiles).apply(anything) .

Für Java-Neulinge sind 223 Byte sinnvoll:

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

Als etwas, das kompiliert wird, benötigt es 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;}}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.