Yavru kedi komutu


65

Bir yavru kedi bir kediye çok benzer. Temel farklılıklardan bazıları zekâ, zeka eksikliği ve boyuttur. Benzer şekilde, catkomut komuttan farklıdır kitten. Neyse ki, bu durumda sadece bir fark var. Kitten komutunda, tüm büyük harfler küçük harflerle değiştirilir.


Amaç

Benzer davranan bir program uygulamak cat. Tüm karakterler [A-Z]küçük harflerle yazılır.


Giriş

Komut satırı argümanları olarak dosyaların listesi. Listelenecek dosya yoksa, standart girdiden okuyun. Girdi, yazdırılamayan karakterler ve ASCII aralığının dışındaki karakterleri içerebilir.


Çıktı

Girdi bir demet dosya ise, içeriği birleştirin ve tüm karakterleri küçük harf olarak çıkarın. STDIN'den okuyorsanız, tüm büyük harflerle küçük harf olarak STDIN içeriğini çıktı alın.

Not: Sadece karakterleri [A-Z]küçük harf yapın. Başka karakterlerin küçük harflerle yazılması kabul edilemez.


Örnekler

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

ile her zamanki gibi en az bayt kazanır.

Liderler


Burada hem düzenli bir lider tablosu hem de kazananların dile göre bir genel bakışını oluşturmak için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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


2
Açıkça belirterek "Yalnızca karakterleri [A-Z]küçük harf yap" diyerek Unicode girişini mi bekliyorsunuz?
AdmBorkBork

2
@TimmyD Evet, ancak esasen insanların küçük harfli işlevler için yerleşik kullanmasını önlemek içindir.
TheNumberOne

3
@FryAmTheEggman permalink
Dennis

1
Peki Ü, Ñve seviyor?
Mast,

2
Bu var bu yüzden sen de ... codegolf içinde hiç bir Pyth görmüyorum zaman güzel
JMM

Yanıtlar:


52

Perl, 6 bayt

5 bayt kodu + 1 bayt komut satırı

$_=lc

Örnek kullanım:

echo ABCdef | perl -p kitten.pl
abcdef

Doğru Unicode davranışının doğrulanması:

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

2
Unicode karakterleri etkilemediğinden emin misin?
Martin Ender

7
@ MartinBüttner O değil . Burada “aksi halde” kategorisindeyiz: “Durum değişikliği için ASCII kuralları kullanılıyor. ASCII aralığının dışındaki herhangi bir karakterin küçük harfleri karakterin kendisidir. ”Cevabım için + 1'im.
xebtl

178

Bash, 19 bayt

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

Yavru kedi yapmanın en iyi yolu gerçek kedileri kullanmaktır.

Örnek çalışma

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

39
İş için doğru alet.
Dijital Travma

120
Bir kedi yavrusu yapmak için sadece bir kedinin ihtiyaç duyduğu için +1, her zaman beni iki kedi alır
SnoringFrog

4
Şimdi bu bana man womanşakaları hatırlatıyor …
xebtl

2
Yavru oluşturma yöntemi yerine yavru yetiştirme yöntemi için +1
MD-Tech

25
@SoringFrog Diğeriydi.
TheNumberOne

22

Perl, 11 bayt

10 bayt kodu + 1 bayt komut satırı

y/A-Z/a-z/

Örnek kullanım:

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

15

Python 3, 77 bayt

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

1
Bu akıllıca, ASCII olmayan kişilerin değişmesini önlemek için bayt kullanıyor.
matsjoyce 30:15

11

Ruby, 13 bayt

Bayt sayısı, pbayrak için 1 bayt içerir . Böylece gibi çalıştırın: ruby -p kitten.rb.

$_.downcase!

Stdin veya dosya argümanlarından girdi alır, tıpkı yetişkin kedi gibi.


Bu sadece küçük ASCII mi, yoksa diğer karakterleri Ämi kullanıyor ?
Paŭlo Ebermann

1
@ PaŭloEbermann: Daha yeni test ettim: echo "HelloÉ" | ruby -p kitten.rb->helloÉ
Neil Slater

Yemin ederim, dün bununla ilgili bir sürü yorum yapıldı. Bunların nereye gittiğini bilmiyorum ama: Evet, özelliklerine göre çalışıyor.
daniero 30:15

5

PowerShell, 112 Bayt

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

Korkunç derecede okunamıyor. İşte aşağıda biraz genişletilmiş bir versiyonu:

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

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

l97'den 112'ye kadar bir döngü üzerinde yinelenen bir iç fonksiyon tanımlar (yani, ASCII a- ASCII z). Giriş dizesini bu karakterin üzerine böler (yay büyük / küçük harfe duyarsız varsayılan), onu "doğru" küçük harf ile yeniden birleştirir. Evet, bunun "Test" in kısaca "T st" olacağı anlamına geldiğini not edin, eörneğin. Çıktıyı etkilemez.

İkinci yarı, boru hattı girişi (PowerShell için stdin'e eşdeğer) veya komut satırı girişi olup olmadığını anlamak için zor bir bit. Özel değişken $argssadece komut satırı girişi mevcutsa mevcuttur, bu yüzden her biri için, gc(for Get-Content) üzerinde döngü kurarız ve onu da o kadar sıkıştırırız l. Aksi takdirde, sadece bizim schlep $inputadede kadar l. İf / else ifadelerimizi (yani if($input)) değiştirebileceğimizi unutmayın, ancak "girdi", "args" den daha uzun bir karakter olduğundan, bu yol daha kısadır.


@Nazek Yerleşik "String".ToLower(), kurallara aykırı olan Unicode karakterlerini de küçük harflerle yazar. PowerShell'in Unicode ile ilgili olarak doğru yapmadığı birçok şey var, ancak ne yazık ki bu doğru çalıştığı bir örnektir.
AdmBorkBork


5

R, 97 bayt

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

Kullanımı:

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

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)

Kullanımı:

$ 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

Codegolf'a ilk katılmam, o yüzden lütfen kaba olma :).

Elbette bu kod daha fazla golf oynayabilir ve kahve / javascript bunu yapmak için en iyi seçenek değildir, ancak beklenenleri yapar.

Argümanları okuduğunda, dosya mevcudiyetini de önemser (eğer dosya yoksa, string yavru kedidir.)

Bu kodu geliştirmek için herhangi bir yardım ya da tavsiye açığız!


4

Julia, 123 bayt

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 bayt

ea_:gs{q}?'_,_eler

Dosya listesi, CJam’ın anlayabileceği tek biçim olan URL’ler şeklinde sunulmalıdır.

Örnek çalıştırmalar

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

Nasıl çalışır

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

Piton 2, 100 102 97 bayt

İşlevsellik matsjoyce tarafından düzeltildi (ve 4 bayt eklendi). Neyse ki, Python 2'ye geçerek iki bayt kurtardım.

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

Argümanlar bulunmazsa komut satırından veya STDIN'den argümanlar alır.

Bu, bazı işlevlerin varsayılan argümanlarını kötüye kullanır. Varsayılan olarak, opentam olarak istediğimiz şey olan salt okunur metin modunu kullanır. read, bağımsız değişken olmadan çağrılırsa akıştaki tüm metni döndürür.

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
Bu sadece tek bir satır okuduğunuz ve küçültmediğiniz için stdin için işe yaramaz.
matsjoyce

@ matsjoyce Kodumu düzelttim. Hatırlatma için teşekkürler! Ne yazık ki, dört bayt ekledi, ancak inputdeğerlendirme yapmama bağlı olarak artık Python 2'ye geçip parantezleri kaldırabilirim print.
bkul

3

Python 3, 124 123 bayt


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 yavru kedi yer!

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

3

C, 106 108 bayt

Düzenleme: Bayt sıkarken içeri giren bir hata düzeltildi. Stdin işe yaramadı, şimdi.

Bazı baytları sıkıştırabileceğime eminim ama işte bu, dil küfürlü, gönderen hiçbir şekilde değil, anlaşılması kolay bir yöntem:

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

Ve okumak için biraz daha düzgün biçimlendirilmiş bir versiyon:

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 çünkü bu gizli int parametrelerinin yalnızca K&R sözdizimi ile mümkün olduğunu öğretti.
Felix Dombek

2

Mathematica, 66 bayt

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

Olarak adlandırılan

kit@"HelLo"

Mathematica'nın zaten bir ToLowerCaseişlevi var, ancak özel (Unicode ve matematiksel) karakterleri de dönüştürüyor. Bu yüzden onu yavrulamak zorunda kaldı. Bu fonksiyon herhangi bir giriş yapacaktır.


@TheNumberOne - Mathematica'da böyle çalışır. Bunu yapmak için daha fazla kod gerekmez. Bir çalıştırılabilir istiyorsanız, o zaman Mathematica aracı değildir.
Verbeia

Bu, adları gerektiği gibi komut satırı argümanları olarak girilen dosyaları birleştiriyor mu?
msh210

Komut satırı argümanları Mathematica'da yok. Fonksiyon girişlerini kontrol eder. Ayrıca bir değişkene atamanıza gerek yoktur.
CalculatorFeline

2

C #, 230 226 bayt

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

Kedi tarzı args işleme bu öğreticiden elde edilir , daha sonra traş karakterlerine göre yeniden düzenlenir.

lBir karakterin küçük harfle işlevini açıklayan :

  • sum[32|condition]daha kısa bir şeklidir if condition then 32 else 0.
  • [x..]!!countolduğu iterate succ x !! countise toEnum $ fromEnum x + countiçe ve kullanmaktan daha kısa Data.Char.toLowerASCII bunu kısıtlamak için bir koşulu ile.
  • '@'ve '['karakterler hemen önceki edilir Ave aşağıdaki Zkullandığım böylece <yerine <=.

Anders Kaseorg'a katkıları sum[...|...]ve [x..]!!püf noktaları için teşekkür ederiz .


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

1

C #, 342 bayt

  • geçirilen argümanlardan dosya listesini alır.
  • her dosyadaki her karakteri, eğer sadece A..Z aralığındaki karakter STDOUT'a göndermek yerine, küçük harfe dönüştürülür.
  • STDIN okuyan bir dosya listesi yoksa, her karakteri okur, küçük harflere dönüştürür ve eğer A..Z aralığında karakter STDOUT'a göndermekten daha büyükse.
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 bayt

tek astar, yukarıdakiyle aynı:

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

Bu kodu çevrimiçi denemek için çekinmeyin !


Esasen pusedocode'da buna tercüme eder.

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

0

C, 91 bayt

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

C, 98 bayt

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

Okunabilme byte sayısından daha önemliyse, aynı mantık aşağıda yazılmıştır:

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

Bu, ilk test senaryosunda başarısız olur.
TheNumberOne

Bu şartnameyi yerine getirmiyor. Dosya isimlerini argüman olarak kabul etmeniz ve dosya isimleri verilmemiş olması durumunda stdin'den okunması anlamında kedi gibi davranması gerekir. Şu anda sadece stdin'den okuyorsun.
algmyr

0

sed, 14 bayt

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

İle koş env -i sed -f kitten.sed.


1
Bu sadece söylemenin süslü bir yolu olduğu için LANG=C sed -f kitten.sed, hesaba bir ceza uygulayıp uygulamam konusunda emin değilim. Bu soru program çağrılarının nasıl sayılacağını belirlemez ve metada ele alınmamıştır.
Ángel,

Bu, adları gerektiği gibi komut satırı argümanları olarak girilen dosyaları birleştiriyor mu?
msh210

@ msh210 Evet, elbette.
Ángel,

1
@ s/.*/\L&/Dokuz baytlık bir çözüm için Ángel
someonewithpc

@Someonewithpc teşekkürler. Her ikisi de s/.*/\L&/ve s/./\L&/ggerçekten 9 byte çözüm!
Ángel,

0

Java, 198 bayt

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

Yukarıdaki lambda'yı dosyalarla birlikte kullanmak zorundasınız, bu nedenle STDIN'den girdi almaya gerek yok! Ayrıca, bu bir Function<File[], UnaryOperator<String>>. Gibi kullanılır foo.apply(anArrayOfFiles).apply(anything).

Java’ya yeni başlayanlar için daha anlamlı olan bir şey olarak, 223 bayt alır:

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

Derleyen bir şey olarak 232 bayt alır:

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;}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.