Sayma ve heceleme


26

Girdi olarak aşağıdaki özelliklere sahip bir dize çıkaran bir dize alan bir program yazın.

  • Karakter dizisindeki bir karakter bir büyük harf ise (ASCII 41-5A), karakter orijinal harfleri her harf içeren ve orijinal harfleri büyük harflerle içeren bir karakter dizisi ile değiştirilir. Örneğin, girdi dizesi ise Içıktı olur ABCDEFGHI.
  • Benzer şekilde, bir karakter küçük harf ise (ASCII 61-7A), karakter aynı şekilde değiştirilir. itarafından değiştirilirdi abcdefghi.
  • Bir karakter bir sayı ise (ASCII 30-39), o zaman karakter her sayıdan başlayarak sayıya 0kadar sayılır.
  • Girdi birleştirilmiş ayrı karakterler içeriyorsa, değiştirme dizileri birlikte bitiştirilir.
  • Diğer tüm karakterler değişiklik yapılmadan yazdırılır.

Örnek girişler (boş satırlarla ayrılmış)

AbC123

pi=3.14159

Hello, World!

Örnek çıktılar

AabABC010120123

abcdefghijklmnopabcdefghi=0123.0101234010123450123456789

ABCDEFGHabcdeabcdefghijklabcdefghijklabcdefghijklmno, ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnoabcdefghijklmnopqrabcdefghijklabcd!

Bu kod golf, arkadaşlar. Standart kurallar geçerlidir. Bayt cinsinden en kısa kod kazanır.


Büyük afişi görmek için, "Kod pasajını göster" i tıklayın, aşağıya doğru kaydırın ve "► Kod pasajını çalıştır" ı tıklayın. Doktor tarafından yapılan snippet.


10
Bir devamı için fikir: bu dönüşümü geri alın.
ETHProductions,

2
@ETHproductions Belki de, buradaki yol bana daha iyi gözükse de, herhangi bir girdi alabilir; Ya tam tersi giriş ise Hello, World!?
Arcturus,

Giriş dizisindeki NUL (ascii 0x00) karakterlerini desteklemek zorunda mıyız?
nimi

@Eridan böyle bir durumda, kodun bir hata yazdırması veya eğlenceli bir büküm için yukarıdaki dönüşümü gerçekleştirmesi gerekir. Yani, f (f (giriş)) == giriş. Alfanümerik bir girişin bu ilişkiye itaatsizlik etmesinin mümkün olduğuna inanmıyorum.
Jake,

1
Bu tamamen doğru - Varsayalım ki "eğer bir dize dönüşümün sonucu olabilirse, tersine çevirin. Aksi takdirde, dönüşümü uygulayın." - bu sizin görevinizdir, (a) tutarlı oldukları ve (b) doğrulanabilir oldukları ve çözmeleri için yepyeni bir matematik dalı gerektirmediği sürece seçtiğiniz kuralları belirleyebilirsiniz. Yan not: Işınlamak (b) ilginç olurdu; ne zaman birisinin bir NP problemi için bir polinom zaman algoritması bularak bilgisayar bilimini kazara devrimden geçireceğini asla bilemezsiniz.
Jake

Yanıtlar:


11

Pyth, 19 bayt

sXzsJ+rBG1jkUTs._MJ

Çevrimiçi deneyin: Gösteri veya Test Paketi

açıklama

sXzsJ+rBG1jkUTs._MJ
      rBG1            the list ["abc...xyz", "ABC...XYZ"]
     +    jkUT        appends the string "0123456789"
    J                 save this list of 3 strings in J
   sJ                 join the strings in J
               ._MJ   create all prefixes of the strings in J
              s       and combine them to one list
 XzsJ         s._MJ   translate the input string, chars from sJ
                      get translated to the correct prefix,
                      chars that don't appear in sJ don't get translated
s                     join all resulting translation strings

8

Python 2.7, 100 98 96 bayt

a=[]
for c in raw_input():d=ord(c);a+=range(max(d&96|1,48),d)*c.isalnum()+[d]
print bytearray(a)

7

TeaScript , 24 bayt 26 28

TeaScript golf oynamak için JavaScript

xl(#(i=lN()1)h(ii(l)+1))

Oldukça kısa

Çevrimiçi deneyin

açıklama

x.l(#            // Loops through each character of the string

     (i=l.N()1)  // Determines whether a character is alphanumeric
                 // Will return A-Z, a-z or 0-9 depending on result
                 // Assigns to variable i

     .h(         // Get characters up to...
        i.i      // where the character is in "i"
     ) + 1       // Increased by one
)

6

Ruby, 137 87 82 76 67 55 bayt

Ungolfed, ancak deseni görebilirsiniz.

$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}

Düzenleme: sadece bir regex aşağı golfed.

Düzenleme 2: çok fazladan fazladan boşluk vardı.

Düzenleme 3: 12 baytlık golf için el işi sayesinde!


1
$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}
Manatwork

@ manatwork Lanet olsun bu akıllıca!
Peter Lenkefi

4

Python 2, 145 140 133 103 102 Bayt

Liste kavrama kullanan, çok şık olmayan bir isimsiz fonksiyon. Mantığın çok daha kısa olması gerektiğini düşünüyorum, bir şeyler bulmaya çalışacağım.

lambda k:''.join([c,`map(chr,range(48+17*(c>'@')+32*(c>'`'),ord(c)+1))`[2::5]][c.isalnum()]for c in k)

Kullanılacak bir isim verilmelidir, yani f=...


@Mego Oh, haha! Endişeye gerek yok :)
Kade

4

Haskell, 95 91 86 60 bayt

c#(a:o:r)|c<a||c>o=c#r|1<2=[a..c]
c#_=[c]
f=((#"AZaz09")=<<)

Kullanım örneği: f "pi=3.14159"->"abcdefghijklmnopabcdefghi=0123.0101234010123450123456789"

Nasıl çalışır: c, A/ Z, a/ zveya 0/ karakterlerinden herhangi biri arasında olmadıkça, giriş dizesindeki her c sayısını kopyalayın 9ve varsa listesini yapın [<first char in pair> ... <c>].

Düzenleme: @Zgarb birçok bayt kaydetti. Teşekkürler!


Bence tamamen tanımlayabilir c#_=[c]ve atlayabilirsiniz t.
Zgarb

@ Zgarb: Evet gerçekten ve sonra sda gereksiz. Çok teşekkürler!
nimi

4

JavaScript (ES6), 143 138 bayt

Hangi karakterlerin kullanılacağını test etmek için dize karşılaştırmalarını kullanır.

s=>s.replace(/[A-Z0-9]/gi,c=>(a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`,(c>'Z'?a:a.toUpperCase()).split``.filter(x=>x<=c&(x>'9'|c<'A')).join``))

Çevrimiçi demo. Firefox ve Chrome'da test edilmiştir.

Düzenleme: Değiştirilen 5 bayt a='0123456789abcdefghijklmnopqrstuvwxyz'ile kaydedildi

a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`

3

PHP, 146 bayt

golfed

function f($n,&$l){for(;$c=$n[$r],$b=0,$d=ord($c);$r++,$b?:$l.=$c)foreach([58=>48,91=>65,123=>97] as $m=>$i)while($d<$m&&$d>=$i)$b=$l.=chr($i++);}

Revizyon 1: ord aralıklarını doğrudan foreach içine koyun. Ord aralığı maxes artırılır ve değiştirilmesi $d<=$miçin $d<$m. ve foryerine karakterleri yinelemek için kullanılır . Tüm kodları taşıyarak kaldırıldıforeachstr_split{}for

Ungolfed

function f($input,&$output){
foreach (str_split($input) as $char){
  $ord = ord($char);
  $ords = [57=>48,90=>65,122=>97];
  $b = 0;
  foreach ($ords as $max=>$min){
     while ($ord<=$max&&$ord>=$min){
         $b = $max;
         $output .= chr($min);
         $min++;
     }
  }
  $b ?: $output.=$char;
}
};

$output = NULL;
$input = "pi=3.141592";
f($input,$output);
echo $output;

Açıklama: diziyi dizeye böl. Ascii değeri bir aralığa düşerse (az, AZ, 0-9 için), o zaman aralıktaki minimum değerden karakterin ascii değerine bir sayaç yükseltin, siz char değerinin değerine ulaşana kadar her değeri ekleyin.

Ben geçtim &$varçıktı bir referans yerine referansla yapılırreturn


Aralık dizisini tutmak için $ z değişkenine gerek yoktur, dizi değişmezini doğrudan içine koyabilirsiniz foreach.
Manatwork

Kullanmaya çalıştın range()mı? pastebin.com/k2tqFEgD
yapay yapı

@ manatwork, ilan ettim $zve başka değişiklikler yaptım. range()muhtemelen daha iyi olurdu. Daha sonra menzile sahip bir şeyler deneyebilirim.
Reed

Kullanarak range, function f($n,&$l){$o=['a'=>'z','A'=>'Z','0'=>'9'];foreach(str_split($n) as $c){$b=0;foreach($o as $m=>$x)!($c>$m&&$c<=$x)?:$b=$l.=implode(range($m,$c));$b?:$l.=$c;}}166 oldum.
Reed,

1
Evet, yeniden yazdıktan sonra 146 karakter kullanmanız range()daha az faydalı olur. Ancak bu 166 çok uzun olsa bile: dizi değişkeni için $ o geri döndü, asanahtar kelimeler etrafında fazladan boşluk var join(), takma ad implode(). (.? Daha önce bağlantılı pastebin kodunu gösterir aralık son noktalarını saklamak için başka bir olasılık kontrol edilir) sizin 146 karakter çözümü ile ilgili olarak, içeride $ c atama taşıyabilirsiniz ord()çağrı: $d=ord($c=$n[$r]).
Manatwork

2

Python, 143 bayt

lambda s:''.join(map(chr,sum(map(lambda a,r=range:r(65,a+1)if 64<a<97else r(97,a+1)if 96<a<123else r(48,a+1)if 47<a<58else[a],map(ord,s)),[])))

Çevrimiçi deneyin


2
4 bayttan tasarruf etmek için z = range kullanabilirsiniz.
Arcturus,

1
Çift boşluk girintilerini tek bir sekmeyle değiştirebileceğinizden emin olun, ki bu size birkaç bayt kazandırır
Fund Monica'nın Davası

2

Perl 6, 101 bayt

İşte ona ilk geçiş:

sub MAIN($_ is copy){
  s:g/<[0..9]>/{(0..$/).join}/;
  s:g/<[a..z]>/{('a'..~$/).join}/;
  s:g/<[A..Z]>/{('A'..~$/).join}/;
  .say
}
sub MAIN($_ is copy){s:g/<[0..9]>/{(0..$/).join}/;s:g/<[a..z]>/{('a'..~$/).join}/;s:g/<[A..Z]>/{('A'..~$/).join}/;.say}

119


Kullanılması .transüzerine $_çıkarmak için is copy.

sub MAIN($_){
  .trans(
    /\d/       => {(0..$/).join},
    /<[a..z]>/ => {('a'..~$/).join},
    /<[A..Z]>/ => {('A'..~$/).join}
  ).say
}
sub MAIN($_){.trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say}

106


Hareket @*ARGSbir tanımlama yerine doğrudan MAINalt.
(aksi takdirde önceki örneğe benzer)

@*ARGS[0].trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say

101


2

Scala, 111 91 bayt

val f=(_:String).flatMap(x=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else('a'to x))

Bu başarısız olur pi=3.14159. Çözüm val f=(_:String).flatMap(x:String=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else if(x.isLower)('a'to x)else x.toString)bir kuyruklu 128 karakter için olabilir mi?
Leonardo,

2

Julia, 102 98 90 84 bayt

s->join([(i=Int(c);join(map(Char,(64<c<91?65:96<c<123?97:47<c<58?48:i):i)))for c=s])

Bu, bir dizeyi kabul eden ve bir dize döndüren adsız bir işlev oluşturur.

Ungolfed:

function f(s::AbstractString)
    # For each character in the input, get the codepoint and construct
    # a range of codepoints from the appropriate starting character to
    # the current character, convert these to characters, and join them
    # into a string
    x = [(i = Int(c);
          join(map(Char, (isupper(c) ? 65 :
                          islower(c) ? 97 :
                          isdigit(c) ? 48 : i):i))
         ) for c in s]

    # Join the array of strings into a single string
    return join(x)
end

2

PowerShell, 155 Bayt

($args-split''|%{$b=$_;switch([int][char]$_){{$_-in(65..90)}{[char[]](65..$_)}{$_-in(97..122)}{[char[]](97..$_)}{$_-in(48..57)}{0..$b}default{$b}}})-join''

Teknik olarak bir liner ve PowerShell hepsi bu konuda ;-)

Girdiyi böler, bir ForEach-Objectdöngüye giren borular, karakterin tamsayı değerini açar, sonra char[]uygun aralıkların yenisini oluşturur. Bir temp değişkeni ayarlamak için bayt harcamamız gerektiğine dikkat edin $bçünkü $_switch deyiminde girdiyi yayınlamak sadece kullanmaya devam edemeyeceğimiz $_veya funky çıktı alacağımız anlamına gelir .

EDIT - Beslenen ilk nesne %{...}boş bir nesne olduğundan bunun hataları azaltacağını belirtmeliyim . STDERR varsayılan olarak göz ardı edildiğinden , bu bir sorun olmamalıdır. Sorun buysa ($args-split''-ne''|..., boş nesneyi ortadan kaldırmak için ilk biti değiştirin .


2

JavaScript (ES6), 340 258 273 271 bayt

a=s=>{s=s.split``;Q=x=>x.toUpperCase();A="ABCDEFGHIJKLMNOPQRSTUVWXYZ";D="0123456789";f="";for(i=0;i<s.length;i++){j=s[i];c="to"+(Q(j)==j?"Upper":"Lower")+"Case";j=Q(j);if(q=A.search(j)+1)f+=g=A.slice(0,q)[c]();else if(q=D.search(j)+1)f+=g=D.slice(0,q);else f+=j}return f}

Bir şablon dizesini `` split yerine ("")ve f=i=""for döngüsü içinde kullanabilirsiniz. Birkaç bayttan daha fazlasını kaydedebilirsiniz.
intrepidcoder

@intrepidcoder İlk işe yarayacaktı. Ben ikinci kontrol ediyorum.
Conor O'Brien,

2

C (269 bayt)

(netlik için satır sonu eklendi)

#include<stdio.h>
#define F(x,y,z)if(c>=T[0][x]&&c<=T[1][y]){z}
#define L(x,y)for(i=0;i<x;++i){y}
main(){int c,i,n;char o,*T[]={"0Aa","9Zz"};while((c=getchar())!=EOF)
{F(0,2,L(3,F(i,i,o=T[0][i],n=++c-o;L(n,putchar(o++));break;))else putchar(c);)}}

Ungolfed

#include<stdio.h>
int main(void)
{
  int c, i, n;
  char output;
  char *char_table[] = {"0Aa", "9Zz"};

  while ((c = getchar()) != EOF) {
    if (c < '0' || c > 'z') {
      putchar(c);
    } else {
      for (i = 0; i < 3; ++i) {
        if (c >= char_table[0][i] && c <= char_table[1][i]) {
          output = char_table[0][1];
          n = c - output;
          break;
        }
      }
      for (i = 0; i <= n; ++i) {
        putchar(output);
        ++output;
      }
    }
  }
  return(0);
}

2

Perl 5 , 66 61 (51 Bayt + 1) 52

Regex'leri koşullu operatörlerle birleştirmek bu durumda iyi sonuç verdi.
Bir birleşim ile Aralıkları bir dizide birleştirmek için haritayı kullanma.

say map{(/\d/?0:/[A-Z]/?A:/[a-z]/?a:$_)..$_}split//

Ölçek

$ echo "A0C1.a3c_2!" |perl -M5.010 -n count_and_spell_up.pl
A0ABC01.a0123abc_012!

açıklama

say                # print output
  map{             # loop through the array that's at the end of the other mustache. 
                   # outputs an array. 
     (
        /\d/?0            # if $_ is a digit then 0
          :/[A-Z]/?A      # else, if it's an uppercase character then A
             :/[a-z]/?a   # else, if it's a lowercase character then a
               :$_        # else the current character
     )..$_         # generate a sequenced string of characters 
                   # that ends with the magic variable $_ 
                   # ($_ is currently a character from the array)
  }split//     # split the magic variable $_ (currently the input string)
               # to an array of characters

1

JavaScript (ES7), 125 bayt

Dizeleri kodlamaya odaklanan iki JS yanıtı zaten vardı, bu yüzden aşağıdakileri kullanarak daha algoritmik bir yaklaşım kullanmaya karar verdim String.fromCharCode():

x=>x.replace(/[^\W_]/g,z=>(c=z.charCodeAt(),f=c<65?48:c<97?65:97,String.fromCharCode(...[for(i of Array(c-f).keys())i+f])+z))

Bu yöntemi kullanmanın bir bonusu, herhangi bir miktarda karakter kodunu almasıdır, bu nedenle joinlisteye gerek kalmaz. Bu, diğer tüm tekniklerden daha kısa olduğu için sonuçtan memnunum.


1

MUMPS, 131 bayt

u(l,h) i l'>a,a'>h f j=l:1:a s o=o_$C(j),f=0
    q
t(s) f i=1:1:$L(s) s a=$A(s,i),f=1 d u(48,57),u(65,90),u(97,122) s:f o=o_$C(a)
    q o

MUMPS'un dinamik kapsamı sayesinde burada birkaç iyi bayt kurtarmayı başardım . İşte, sadece MUMPS Prettify modülünü destekliyor olsaydı, sözdizimini vurgulamayı çok isterdim, kabaca eşdeğer ungolfed versiyonu .

convert(str) ;
    new asciiCode,flag,i,output
    for i=1:1:$LENGTH(str) do
    . set asciiCode=$ASCII(str,i)
    . set flag=1
    . do helper(48,57)
    . do helper(65,90)
    . do helper(97,122)
    . if 'flag do
    . . set output=output_$CHAR(asciiCode)
    quit
helper(low,high) ;
    if low'>asciiCode,asciiCode'>high do
    . for code=low:1:asciiCode do
    . . set output=output_$CHAR(code)
    . . set flag=0
    quit

1

Perl 6, 78 77 bayt

@*ARGS[0].trans(/\d/=>{[~] 0..$/},/<:L>/=>{[~] samecase("a",~$/)..~$/}).say

Ben biliyordum o birleştirerek kısaltılmış olabilir 'a'..'z've 'A'..'Z'davaları, ben daha gayretli olması gerekirdi.
Brad Gilbert 18 Kasım’da

<!-- language-all: lang-perl6 -->Hemen sonra eklemenizi tavsiye ederim, ## Perl 6böylece doğru şekilde vurgulanacak. (Değiştir zaten bu cevap üzerine beklemede)
Brad Gilbert b2gills

Sen geçiş yapabilirsiniz {[~](0..$/)}için {[~] 0..$/}bir bayt kurtaracak olan.
Brad Gilbert,

0

Mathematica, 102 bayt

FromCharacterCode@Flatten[Which[64<#<91,65,96<#<123,97,47<#<58,48,1>0,#]~Range~#&/@ToCharacterCode@#]&

Oh iyi...


0

CJam, 32 31 bayt

q_'[,_el^A,s+26/ff{_@#)<}:s\.e|

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

q_    e# Push two copies of the user input.
'[,   e# Push the string of all ASCII characters up to Z.
_el   e# Push a copy and convert it to lowercase.
^     e# Perform symmetric difference this keeps only letters.
A,s+  e# Append the string "0123456789".
26/   e# Split the result into chunks of length 26.
ff{   e# For each character from input: For each chunk:
  _@  e#   Copy the chunk and rotate the character on top of it.
  #   e#   Push the index of the character in the string (-1 for not found).
  )<  e#   Increment and keep that many characters from the left of the chunk.
      e#   This pushes "" for index -1.
}
:s    e# Flatten the resulting arrays of strings.
      e# The results will be empty strings iff the character wan't alphanumeric.
\     e# Swap the result with the input string.
.e|   e# Perform vectorized logical OR.

0

Python 2, 135 117 bayt

s=''
for c in raw_input():
 b=ord(c);e=b+1
 if c.isalnum():
  b=max(b&96,47)+1
 for i in range(b,e):s+=chr(i)
print s

0

PHP - 291 bayt

Dize iletin GET["s"].

<?php $s=$_GET["s"];$m="array_map";echo implode($m(function($v){$i="in_array";$l="implode";$r="range";global$m;$a=ord($v);if($i($a,$r(48,57)))$v=$l($m("chr",$r(48,$a)));if($i($a,$r(65,90)))$v=$l($m("chr",$r(65,$a)));if($i($a,$r(97,122)))$v=$l($m("chr",$r(97,$a)));return$v;},str_split($s)));

0

C #, 251 201 184 157 154 Bayt

using System;class c{static void Main(string[] i){foreach(var c in i[0])for(var x=c>64&c<91?'A':c>96&c<123?'a':c>47&c<58?'0':c;x<=c;)Console.Write(x++);}}

düzenleme: Strike! PowerShell'den daha kısa;)


1
Yapabileceğiniz string[]i?
Outgolfer Erik,
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.