Perintah kucing

65

Anak kucing sangat mirip kucing. Beberapa perbedaan utama adalah kelucuan, kurangnya kecerdasan, dan ukuran. Demikian pula, catperintahnya berbeda dari kittenperintah. Untungnya, hanya ada satu perbedaan dalam hal ini. Dalam perintah kitten, semua huruf besar diganti dengan huruf kecil.


Objektif

Untuk mengimplementasikan program yang berperilaku serupa dengan cat. Semua karakter [A-Z]dihasilkan huruf kecil.


Memasukkan

Daftar file sebagai argumen baris perintah. Jika tidak ada file yang terdaftar, maka baca dari input standar. Input mungkin mengandung karakter dan karakter yang tidak dapat dicetak di luar rentang ASCII.


Keluaran

Jika input adalah banyak file, gabungkan konten dan output semua karakter sebagai huruf kecil. Jika membaca dari STDIN, keluarkan isi STDIN dengan semua huruf besar sebagai huruf kecil.

Catatan: Hanya membuat karakter [A-Z]huruf kecil. Tidak dapat diterima jika karakter lain dibuat huruf kecil.


Contohnya

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

Seperti biasa dengan , paling tidak byte menang.

Papan peringkat


Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Misalnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

TheNumberOne
sumber
2
Dengan secara eksplisit menyatakan "Hanya buat karakter [A-Z]huruf kecil" apakah Anda mengantisipasi input Unicode?
AdmBorkBork
2
@TimmyD Ya, tetapi ini terutama untuk mencegah orang menggunakan fungsi bawaan untuk huruf kecil.
TheNumberOne
3
@FryAmTheEggman permalink
Dennis
1
Bagaimana dengan Ü, Ñdan sejenisnya?
Mast
2
Ini sangat bagus ketika Anda tidak melihat Pyth sama sekali dalam codegolf sebuah ...
JMM

Jawaban:

52

Perl, 6 byte

5 byte kode + 1 byte baris perintah

$_=lc

Contoh penggunaan:

echo ABCdef | perl -p kitten.pl
abcdef

Konfirmasi perilaku Unicode yang benar:

echo "HelloÉ" | perl -p kitten.pl
helloÉ
steve
sumber
2
Apakah Anda yakin ini tidak memengaruhi karakter Unicode?
Martin Ender
7
@ MartinBüttner Ini tidak . Kita berada dalam kategori “sebaliknya” di sini: “Aturan ASCII digunakan untuk perubahan kasus. Huruf kecil dari karakter apa pun di luar rentang ASCII adalah karakter itu sendiri. ”+1 saya untuk jawabannya.
xebtl
178

Bash, 19 byte

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

Cara terbaik untuk membuat anak kucing adalah dengan menggunakan kucing yang sebenarnya.

Contoh dijalankan

$ ./kitten kitten
cat "$@"|tr a-z a-z
Dennis
sumber
39
Alat yang tepat untuk pekerjaan itu.
Digital Trauma
120
+1 untuk hanya membutuhkan satu kucing untuk membuat anak kucing, selalu membawakan saya dua kucing
SnoringFrog
4
Nah, itu mengingatkan saya pada man womanlelucon itu ...
xebtl
2
+1 untuk menggunakan kloning kucing daripada metode kawin untuk menciptakan keturunan
MD-Tech
25
@SnoringFrog Dia memukul yang lain.
TheNumberOne
22

Perl, 11 byte

10 byte kode + 1 byte baris perintah

y/A-Z/a-z/

Contoh penggunaan:

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

Python 3, 77 byte

from fileinput import*
print(end=b''.join(input(mode='rb')).lower().decode())
Anders Kaseorg
sumber
1
Itu pintar, menggunakan byte untuk menghindari perubahan non-ASCII.
matsjoyce
11

Ruby, 13 byte

Hitungan byte termasuk 1 byte untuk pflag. Menjalankannya seperti: ruby -p kitten.rb.

$_.downcase!

Mengambil input dari argumen stdin atau file, seperti halnya kucing dewasa.

daniero
sumber
Apakah ini hanya huruf kecil ASCII, atau juga karakter lain yang suka Ä?
Paŭlo Ebermann
1
@ PaŭloEbermann: Saya baru saja mengujinya: echo "HelloÉ" | ruby -p kitten.rb->helloÉ
Neil Slater
Saya bersumpah ada sejumlah komentar di sini mengenai hal itu kemarin. Saya tidak tahu ke mana mereka pergi, tetapi: Ya, itu bekerja sesuai dengan spesifikasi.
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}

Sangat tidak terbaca. Berikut versi yang sedikit diperluas di bawah ini:

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

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

Menentukan fungsi internal lyang berulang di atas loop dari 97 hingga 112 (yaitu, ASCII ake ASCII z). Pisahkan string input di atas karakter itu (yay case-insensitive default), gabungkan kembali dengan huruf kecil "benar". Perhatikan bahwa ya, ini berarti "Tes" sebentar akan menjadi "Tst" karena iterasi melalui e, misalnya. Tidak memengaruhi output.

Bagian kedua adalah bit yang sulit untuk diketahui jika kita memiliki input pipa (setara dengan stdin untuk PowerShell) atau input baris perintah. Variabel khusus $argshanya ada jika input baris perintah ada, jadi kami mengulanginya masing-masing, gc(untuk Get-Content) dan schlep yang hingga l. Jika tidak, kami hanya $inputmengatur hingga l. Perhatikan bahwa kita dapat menukar pernyataan if / else kita (yaitu, if($input)), tetapi karena "input" adalah satu karakter lebih panjang dari "args" cara ini lebih pendek.

AdmBorkBork
sumber
@Nazek Built-in "String".ToLower()juga akan mengurangi karakter Unicode, yang melanggar aturan. Ada banyak hal yang tidak dilakukan PowerShell dengan benar terkait Unicode, tapi sayangnya ini adalah salah satu contoh yang berfungsi dengan benar.
AdmBorkBork
5

Python 2, 53 byte

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

R, 97 byte

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

Pemakaian:

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

Pemakaian:

$ 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

Partisipasi pertama saya pada codegolf jadi tolong jangan kasar :).

Tentu saja kode ini dapat lebih banyak golf dan kopi / javascript bukan pilihan terbaik untuk melakukannya, tetapi ia melakukan apa yang diharapkan.

Ketika membaca argumen, ia juga menangani masalah keberadaan file (jika file tidak ada, stringnya tidak jelas.)

Setiap bantuan atau saran untuk meningkatkan kode ini dipersilahkan!

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

Tidak Disatukan:

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.
sumber
4

CJam, 18 byte

ea_:gs{q}?'_,_eler

Daftar file harus disediakan dalam bentuk URL, yang merupakan satu-satunya format yang dipahami CJam.

Contoh berjalan

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

Bagaimana itu bekerja

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
sumber
4

Python 2, 100 102 97 byte

Fungsionalitas dikoreksi (dan 4 byte ditambahkan) oleh matsjoyce. Untungnya, saya menyimpan dua byte dengan beralih ke Python 2.

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

Membawa argumen dari baris perintah, atau dari STDIN jika tidak ada argumen yang ditemukan.

Ini menyalahgunakan argumen default dari beberapa fungsi. Secara default, openmenggunakan mode teks hanya-baca, yang persis seperti yang kita inginkan. read, jika dipanggil tanpa argumen, akan mengembalikan semua teks dalam aliran.

Tidak Disatukan:

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
sumber
1
Ini tidak akan berfungsi untuk stdin, karena Anda hanya membaca satu baris, dan jangan menggunakan huruf kecil.
matsjoyce
@matsjoyce Saya telah memperbaiki kode saya. Terima kasih atas pengingatnya! Sayangnya, itu menambahkan empat byte, tetapi tidak lagi tergantung pada inputtidak mengevaluasi, saya bisa beralih ke Python 2 dan menghapus tanda kurung 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 makan anak kucing!

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

C, 106 108 byte

Sunting: Memperbaiki kesalahan yang muncul saat memeras byte. Stdin tidak bekerja, sekarang sudah.

Saya cukup yakin saya bisa memeras beberapa byte, tapi inilah yang mudah dipahami, tidak sama sekali bahasa kasar, penyerahan:

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

Dan versi yang agak lebih terformat untuk dibaca:

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
sumber
+1 karena ini mengajari saya bahwa parameter int implisit hanya mungkin dengan sintaks K&R.
Felix Dombek
2

Mathematica, 66 byte

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

Disebut sebagai

kit@"HelLo"

Mathematica sudah memiliki ToLowerCasefungsi, tetapi ia mengonversi karakter khusus (Unicode dan matematika) juga. Jadi saya harus mencatatnya. Fungsi ini akan mengambil input apa pun.

Verbeia
sumber
@TheNumberOne - begitulah cara kerjanya di Mathematica. Tidak diperlukan lagi kode untuk melakukan ini. Jika Anda ingin executable, maka Mathematica bukanlah alat.
Verbeia
Apakah ini menggabungkan file yang namanya dimasukkan sebagai argumen baris perintah, seperti yang diperlukan?
msh210
Argumen baris perintah tidak ada di Mathematica. Ini menggabungkan input fungsinya. Anda juga tidak perlu menetapkan variabel.
CalculatorFeline
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)));}}}

Tidak Disatukan:

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

Pemrosesan arg gaya kucing diturunkan dari tutorial ini , kemudian disusun ulang untuk mencukur karakter.

Menjelaskan l, fungsi untuk huruf kecil satu karakter:

  • sum[32|condition]adalah bentuk yang lebih pendek dari if condition then 32 else 0.
  • [x..]!!countadalah iterate succ x !! countadalah toEnum $ fromEnum x + countdan lebih pendek dari mengimpor dan menggunakan Data.Char.toLowerdengan kondisi untuk membatasi ke ASCII.
  • '@'dan '['apakah karakter segera mendahului Adan mengikuti Z, sehingga saya dapat menggunakannya <sebagai gantinya <=.

Terima kasih kepada Anders Kaseorg untuk kontribusi sum[...|...]dan [x..]!!triknya.

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

C #, 342 byte

  • mengambil daftar file dari argumen yang diteruskan.
  • baca setiap char di setiap file daripada hanya mengkonversi ke huruf kecil jika dan hanya jika karakter dalam rentang A..Z daripada mengirimkannya ke STDOUT.
  • Jika tidak ada daftar file selain membaca STDIN, baca setiap karakter, konversi ke huruf kecil jika dan hanya jika karakter dalam rentang A..Z daripada mengirimkannya ke 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

single-liner, sama seperti di atas:

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);}}}
menggarisbawahi
sumber
1

SILOS 179 karakter

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

Jangan ragu untuk mencoba kode ini secara online!


Pada dasarnya ini diterjemahkan ke dalam pusedocode ini.

String input = input();
for(char c in input)
if(c is uppercase) print c + 32/*lowercase c*/else print c
Rohan Jhunjhunwala
sumber
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);}}

Meskipun jika keterbacaan lebih penting dari jumlah byte logika yang sama ditulis di bawah ini:

#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
sumber
Ini gagal pada test case pertama.
TheNumberOne
Ini tidak memenuhi spesifikasi. Itu harus berperilaku seperti kucing dalam arti bahwa Anda mengambil nama file sebagai argumen dan jika tidak ada nama file yang diberikan, baca dari stdin. Anda saat ini hanya membaca dari stdin.
algmyr
0

sed, 14 byte

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

Jalankan dengan env -i sed -f kitten.sed.

Malaikat
sumber
1
Karena ini hanya cara mewah untuk mengatakan LANG=C sed -f kitten.sed, saya tidak yakin apakah saya harus menerapkan penalti untuk menjelaskan itu. Pertanyaan ini tidak menentukan cara menghitung panggilan program, dan sepertinya tidak dibahas dalam meta.
Ángel
Apakah ini menggabungkan file yang namanya dimasukkan sebagai argumen baris perintah, seperti yang diperlukan?
msh210
@ msh210 Ya, tentu saja.
Ángel
1
@ Ángel s/.*/\L&/untuk solusi sembilan byte
someonewithpc
Terima kasih @someonewithpc. Keduanya s/.*/\L&/dan s/./\L&/gmemang solusi 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;};

Anda dipaksa untuk menggunakan lambda di atas dengan file, jadi tidak perlu mengambil input dari STDIN! Juga, ini adalah Function<File[], UnaryOperator<String>>. Ini digunakan seperti foo.apply(anArrayOfFiles).apply(anything).

Sebagai sesuatu yang lebih masuk akal bagi mereka yang baru mengenal Jawa, dibutuhkan 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;}

Sebagai sesuatu yang dikompilasi, dibutuhkan 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;}}
dorukayhan
sumber