Polecenie kociaka


65

Kotek jest bardzo podobny do kota. Niektóre z głównych różnic to bystrość, brak inteligencji i rozmiar. Podobnie catpolecenie różni się od kittenpolecenia. Na szczęście w tym przypadku jest tylko jedna różnica. W poleceniu kociak wszystkie wielkie litery są zastępowane małymi literami.


Cel

Aby wdrożyć program, który działa podobnie do cat. Wszystkie znaki [A-Z]są wypisywane małymi literami.


Wejście

Lista plików jako argumenty wiersza poleceń. Jeśli na liście nie ma żadnych plików, czytaj ze standardowego wejścia. Dane wejściowe mogą zawierać znaki niedrukowalne i znaki spoza zakresu ASCII.


Wynik

Jeśli dane wejściowe to kilka plików, połącz zawartość i wypisz wszystkie znaki małymi literami. Jeśli czytasz ze STDIN, wypisz zawartość STDIN ze wszystkimi wielkimi literami jako małymi literami.

Uwaga: Znaki należy [A-Z]wpisywać tylko małymi literami. Niedopuszczalne jest, aby jakiekolwiek inne znaki były pisane małymi literami.


Przykłady

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

Jak zwykle przy , wygrywa najmniej bajtów.

Liderów


Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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


2
Mówiąc wprost: „Czyń tylko [A-Z]małe litery”, czy spodziewasz się wprowadzenia Unicode?
AdmBorkBork

2
@TimmyD Tak, ale ma to głównie na celu uniemożliwienie ludziom korzystania z wbudowanych funkcji małych liter.
TheNumberOne

3
@FryAmTheEggman permalink
Dennis

1
Jak o Ü, Ñi lubi?
Maszt

2
To takie miłe, gdy nie widzisz żadnego Pytha w codegolfie ...
jmm

Odpowiedzi:


52

Perl, 6 bajtów

5 bajtów kodu + 1 bajtowy wiersz poleceń

$_=lc

Przykładowe użycie:

echo ABCdef | perl -p kitten.pl
abcdef

Potwierdzenie poprawnego zachowania Unicode:

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

2
Czy na pewno nie wpływa to na znaki Unicode?
Martin Ender

7
@ MartinBüttner To nie robi . Znajdujemy się tutaj w kategorii „inaczej”: „Do zmiany wielkości liter stosowane są reguły ASCII. Małe litery każdego znaku spoza zakresu ASCII to sam znak. ”Moje +1 za odpowiedź.
xebtl

178

Bash, 19 bajtów

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

Najlepszym sposobem na zrobienie kociąt jest użycie prawdziwych kotów.

Przykładowy przebieg

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

39
Właściwe narzędzie do pracy.
Cyfrowa trauma

120
+1 za to, że potrzebuję tylko jednego kota do zrobienia kociaka, zawsze zabiera mnie dwa koty
SnoringFrog

4
To przypomina mi te man womandowcipy…
xebtl

2
+1 za wybranie klonowania kota zamiast metody kojarzenia potomstwa
MD-Tech

25
@SnoringFrog Uderzył drugiego.
TheNumberOne

22

Perl, 11 bajtów

Kod 10 bajtów + wiersz poleceń 1 bajt

y/A-Z/a-z/

Przykładowe użycie:

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

15

Python 3, 77 bajtów

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

1
To sprytne, używając bajtów, aby uniknąć zmiany spoza ASCII.
matsjoyce

11

Rubinowy, 13 bajtów

Liczba bajtów obejmuje 1 bajt dla pflagi. Uruchomić go tak: ruby -p kitten.rb.

$_.downcase!

Pobiera dane wejściowe z argumentów stdin lub pliku, podobnie jak dorosły kot.


Czy to tylko w dół ASCII, czy też inne znaki, takie jak Ä?
Paŭlo Ebermann

1
@ PaŭloEbermann: Właśnie to przetestowałem: echo "HelloÉ" | ruby -p kitten.rb->helloÉ
Neil Slater

Przysięgam, że wczoraj było tu mnóstwo komentarzy na ten temat. Nie wiem, dokąd poszły, ale: Tak, działa zgodnie ze specyfikacją.
daniero

5

PowerShell, 112 bajtów

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

Okropnie nieczytelne. Oto nieco rozszerzona wersja poniżej:

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

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

Definiuje funkcję wewnętrzną, lktóra iteruje w pętli od 97 do 112 (tj. ASCII ado ASCII z). Dzieli ciąg wejściowy na ten znak (domyślnie nie uwzględnia wielkości liter), ponownie dołącza go z „poprawną” małą literą. Zauważ, że tak, oznacza to, że „Test” na krótko zamieni się w „T st”, ponieważ iteruje się ena przykład przez. Nie wpływa na wydajność.

Druga połowa to trudny kawałek, aby dowiedzieć się, czy mamy dane wejściowe z potoku (równoważne stdin dla PowerShell) lub dane z wiersza poleceń. Specjalna zmienna $argsjest obecna tylko wtedy, gdy obecne jest wejście wiersza poleceń, więc zapętlamy każdą z nich gc(for Get-Content) i schlep to do l. W przeciwnym razie po prostu dokonamy $inputtego l. Zauważ, że moglibyśmy zamienić nasze instrukcje if / else (tj. if($input)), Ale ponieważ „input” jest o jeden znak dłuższy niż „args”, w ten sposób jest krótszy.


@Nazek Wbudowane "String".ToLower()ma również małe znaki Unicode, co jest niezgodne z regułami. Istnieje wiele rzeczy, których PowerShell nie robi dobrze w odniesieniu do Unicode, ale niestety jest to jeden przypadek, który działa poprawnie.
AdmBorkBork


5

R, 97 bajtów

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

Stosowanie:

$ 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 bajtów

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)

Stosowanie:

$ 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

Mój pierwszy udział w codegolf, więc proszę, nie bądź niegrzeczny :).

Na pewno ten kod może być bardziej golfowy, a kawa / javascript nie jest najlepszym wyborem, ale robi to, czego się spodziewano.

Kiedy czyta argumenty, dba również o istnienie pliku (jeśli plik nie istnieje, łańcuch jest kociakiem).

Mile widziana jest jakakolwiek pomoc lub porady w celu ulepszenia tego kodu!


4

Julia, 123 bajty

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

Nie golfowany:

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 bajtów

ea_:gs{q}?'_,_eler

Lista plików musi być dostarczona w formie adresów URL, który jest jedynym formatem, który CJam rozumie.

Przykład działa

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

Jak to działa

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 bajtów

Poprawiona funkcjonalność (i dodane 4 bajty) przez matsjoyce. Na szczęście zaoszczędziłem dwa bajty, przełączając się na Python 2.

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

Pobiera argumenty z wiersza poleceń lub ze STDIN, jeśli nie znaleziono żadnych argumentów.

To nadużywa domyślnych argumentów niektórych funkcji. Domyślnie openużywa trybu tekstowego tylko do odczytu, który jest dokładnie tym, czego chcemy. read, jeśli zostanie wywołany bez argumentów, zwróci cały tekst w strumieniu.

Nie golfowany:

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
To nie zadziała dla standardowego wejścia, ponieważ czytasz tylko jedną linię i nie piszesz jej małymi literami.
matsjoyce

@matsjoyce Naprawiłem swój kod. Dzięki za przypomnienie! Niestety dodano cztery bajty, ale nie zależąc już od inputbraku oceny, mogłem przełączyć się na Python 2 i usunąć nawiasy print.
bkul

3

Python 3, 124 123 bajty


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 zjada kocięta!

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

3

C, 106 108 bajtów

Edycja: Naprawiono błąd, który pojawiał się podczas wyciskania bajtów. Stdin nie działał, teraz jest.

Jestem prawie pewien, że mógłbym wycisnąć kilka bajtów, ale oto łatwe do uchwycenia, wcale nie obraźliwe językowo przesłanie:

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

I nieco bardziej starannie sformatowana wersja do czytania:

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, ponieważ nauczyło mnie to, że niejawne parametry int są możliwe tylko ze składnią K&R.
Felix Dombek

2

Mathematica, 66 bajtów

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

Nazywany jako

kit@"HelLo"

Mathematica ma już ToLowerCasefunkcję, ale konwertuje również znaki specjalne (Unicode i matematyczne). Więc musiałem to skreślić. Ta funkcja przyjmuje dowolne dane wejściowe.


@TheNumberOne - tak to działa w Mathematica. Aby to zrobić, nie jest już potrzebny kod. Jeśli chcesz plik wykonywalny, Mathematica nie jest narzędziem.
Verbeia,

Czy to łączy pliki, których nazwy są wprowadzane jako argumenty wiersza poleceń, zgodnie z wymaganiami?
msh210

Argumenty wiersza poleceń nie istnieją w Mathematica. Konktyfikuje dane wejściowe funkcji. Nie musisz też przypisywać zmiennej.
CalculatorFeline

2

C #, 230 226 bajtów

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

Nie golfowany:

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

Przetwarzanie argumentów w stylu kota pochodzi z tego samouczka , a następnie przestawiono w celu golenia znaków.

Wyjaśniając l, funkcja zapisywania małymi literami jednego znaku:

  • sum[32|condition]jest krótszą formą if condition then 32 else 0.
  • [x..]!!countJest iterate succ x !! countto toEnum $ fromEnum x + counti krócej niż importu i korzystania Data.Char.toLowerz warunku, aby ograniczyć je do ASCII.
  • '@'i '['są to postacie bezpośrednio poprzedzające Ai następujące Z, więc mogę użyć <zamiast <=.

Dzięki Andersowi Kaseorgowi za wkład sum[...|...]i [x..]!!sztuczki.


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

1

C #, 342 bajtów

  • pobiera listę plików z przekazanych argumentów.
  • czyta każdy znak w każdym pliku, niż konwertuje tylko małe litery wtedy i tylko wtedy, gdy znak z zakresu A..Z, niż wysyła go do STDOUT.
  • Jeśli nie ma listy plików, która odczytuje STDIN, odczytuje każdy znak, konwertuje na małe litery wtedy i tylko wtedy, gdy znak z zakresu A..Z wysyła go do 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 bajtów

jednowarstwowy, taki sam jak powyżej:

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 znaków

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

Czuć się swobodnie wypróbować ten kod online!


Zasadniczo przekłada się na to w pusedocode.

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

0

C, 91 bajtów

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

C, 98 bajtów

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

Chociaż jeśli liczność liczy się więcej niż liczba bajtów, ta sama logika jest zapisana poniżej:

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

Nie udaje się to w pierwszym przypadku testowym.
TheNumberOne

To nie spełnia specyfikacji. Powinien zachowywać się jak kot w tym sensie, że bierzesz nazwy plików jako argumenty, a jeśli nie podano żadnych nazw plików, czytaj ze standardowego wejścia. Obecnie czytasz tylko ze standardowego wejścia.
algmyr

0

sed, 14 bajtów

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

Uruchom z env -i sed -f kitten.sed.


1
Ponieważ jest to tylko fantazyjny sposób powiedzenia LANG=C sed -f kitten.sed, nie jestem pewien, czy powinienem zastosować karę za to. To pytanie nie określa sposobu liczenia wywołań programu i wydaje się, że nie jest adresowane w meta.
Ángel

Czy to łączy pliki, których nazwy są wprowadzane jako argumenty wiersza poleceń, zgodnie z wymaganiami?
msh210

@ msh210 Tak, oczywiście.
Ángel

1
@ s/.*/\L&/
Angel w sprawie

Dzięki @someonewithpc. Zarówno s/.*/\L&/i s/./\L&/grzeczywiście są rozwiązania 9-bajtowych!
Ángel

0

Java, 198 bajtów

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

Jesteś zmuszony używać powyższej lambda z plikami, więc nie musisz pobierać danych z STDIN! Ponadto jest to Function<File[], UnaryOperator<String>>. Jest używany jak foo.apply(anArrayOfFiles).apply(anything).

Jest to coś, co ma sens dla tych, którzy są nowicjuszami w Javie, zajmuje 223 bajty:

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

Jako coś, co się kompiluje, zajmuje 232 bajty:

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;}}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.