Đếm và đánh vần


26

Viết chương trình lấy chuỗi của nó tạo ra một chuỗi có các thuộc tính sau.

  • Nếu một ký tự trong chuỗi là một chữ cái viết hoa (ASCII 41-5A), thì ký tự đó được thay thế bằng một chuỗi chứa mọi chữ cái lên đến và bao gồm cả chữ cái in hoa. Ví dụ, nếu chuỗi đầu vào là I, thì đầu ra sẽ là ABCDEFGHI.
  • Tương tự, nếu một ký tự là một chữ cái viết thường (ASCII 61-7A), thì ký tự đó được thay thế theo cùng một cách. isẽ được thay thế bởi abcdefghi.
  • Nếu một ký tự là một số (ASCII 30-39), thì ký tự đó được thay thế bằng mọi số bắt đầu từ 0và đếm đến số đó.
  • Nếu đầu vào chứa các ký tự riêng lẻ được nối, thì các chuỗi thay thế được nối với nhau.
  • Tất cả các nhân vật khác được in mà không sửa đổi.

Đầu vào mẫu (cách nhau bởi các dòng trống)

AbC123

pi=3.14159

Hello, World!

Đầu ra mẫu

AabABC010120123

abcdefghijklmnopabcdefghi=0123.0101234010123450123456789

ABCDEFGHabcdeabcdefghijklabcdefghijklabcdefghijklmno, ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnoabcdefghijklmnopqrabcdefghijklabcd!

Đây là mã golf, fellas. Quy tắc tiêu chuẩn áp dụng. Mã ngắn nhất trong byte thắng.


Để xem bảng xếp hạng, nhấp vào "Hiển thị đoạn mã", cuộn xuống dưới cùng và nhấp vào "► Chạy đoạn mã". Đoạn trích được thực hiện bởi Trình tối ưu hóa.


10
Ý tưởng cho phần tiếp theo: hoàn tác việc chuyển đổi này.
Sản phẩm ETH

2
@ETHproductions Có lẽ, mặc dù cách ở đây có vẻ tốt hơn đối với tôi bởi vì nó có thể mất bất kỳ đầu vào nào; Điều gì xảy ra nếu ngược lại đầu vào Hello, World!?
Arcturus

Chúng ta có phải hỗ trợ các ký tự NUL (ascii 0x00) trong chuỗi đầu vào không?
nimi

@Eridan trong trường hợp như vậy, mã phải in một lỗi hoặc, để có một sự thay đổi thú vị, hãy thực hiện chuyển đổi ở trên. Tức là, f (f (đầu vào)) == đầu vào. Tôi không tin rằng bất kỳ đầu vào chữ số nào cũng không tuân theo mối quan hệ này.
Jake

1
Điều đó hoàn toàn đúng - tôi đưa ra giả định rằng "nếu một chuỗi CÓ THỂ là kết quả của phép biến đổi, thì đảo ngược nó. Nếu không, hãy áp dụng phép biến đổi." - đó là thách thức của bạn, bạn có thể chỉ định bất kỳ quy tắc nào bạn chọn miễn là (a) chúng nhất quán và (b) chúng có thể kiểm chứng được và không yêu cầu toàn bộ nhánh toán học mới phải giải. Lưu ý bên: Chiếu xạ (b) sẽ rất thú vị; bạn không bao giờ biết khi nào ai đó sẽ vô tình cách mạng hóa khoa học máy tính bằng cách đưa ra thuật toán thời gian đa thức cho một vấn đề NP - điều này thực sự hợp lý ở đây, miễn là nó tiết kiệm được 4 byte.
Jake

Câu trả lời:


11

Bình thường, 19 byte

sXzsJ+rBG1jkUTs._MJ

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình

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 byte

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 byte 26 28

TeaScript là JavaScript để chơi gôn

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

Khá ngắn

Dùng thử trực tuyến

Giải trình

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 byte

Ungolfed, nhưng bạn có thể nhìn thấy mô hình.

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

Chỉnh sửa: chơi golf xuống chỉ còn một regex.

Chỉnh sửa 2: có rất nhiều không gian thêm.

Chỉnh sửa 3: Nhờ thao tác để chơi golf 12 byte!


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

@manatwork Chết tiệt thật thông minh!
Peter Lenkefi

4

Python 2, 145 140 133 103 102 byte

Một chức năng ẩn danh không bóng bẩy bằng cách sử dụng danh sách hiểu. Tôi cảm thấy logic nên ngắn hơn nhiều, tôi sẽ thử và tìm ra thứ gì đó.

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

Nên được đặt tên để sử dụng, tức là f=...


@Mego ơi, haha! Đừng lo lắng :)
Kade

4

Haskell, 95 91 86 60 byte

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

Ví dụ sử dụng: f "pi=3.14159"->"abcdefghijklmnopabcdefghi=0123.0101234010123450123456789"

Cách thức hoạt động: sao chép mọi char c trong chuỗi đầu vào trừ khi c nằm giữa bất kỳ A/ Z, a/ zhoặc 0/ 9và nếu vậy hãy lấy danh sách [<first char in pair> ... <c>].

Chỉnh sửa: @Zgarb đã lưu nhiều byte. Cảm ơn!


Tôi nghĩ bạn có thể định nghĩa c#_=[c]và bỏ qua thoàn toàn.
Zgarb

@Zgarb: Vâng thực sự và sau đó scũng là thừa. Cảm ơn rất nhiều!
nimi

4

JavaScript (ES6), 143 138 byte

Sử dụng so sánh chuỗi để kiểm tra các ký tự sẽ sử dụng.

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

Bản demo trực tuyến. Đã thử nghiệm trên Firefox và Chrome.

Chỉnh sửa: Đã lưu 5 byte bằng cách thay thế a='0123456789abcdefghijklmnopqrstuvwxyz'bằng

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

3

PHP, 146 byte

Chơi gôn

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

Sửa đổi 1: đặt phạm vi ord trực tiếp vào foreach. tăng phạm vi thứ tự tối đa và thay đổi $d<=$mthành $d<$m. sử dụng forđể lặp lại ký tự thay vì foreachstr_split. Xóa tất cả {}bằng cách di chuyển mã vàofor

Bị đánh cắp

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;

Giải thích: chia chuỗi thành mảng. Nếu giá trị ascii rơi vào một phạm vi (đối với az, AZ, 0-9), sau đó tăng một bộ đếm từ mức tối thiểu của phạm vi lên giá trị ascii của char, nối thêm từng giá trị cho đến khi bạn đạt được giá trị ascii của char.

Tôi đã thông qua &$varđể đầu ra được thực hiện bằng cách tham chiếu chứ không phải là mộtreturn


Không cần biến $ z để giữ mảng phạm vi, bạn có thể đặt mảng trực tiếp bằng chữ foreach.
manatwork

Đã thử sử dụng range()? pastebin.com/k2tqFEgD
manatwork

@manatwork, tôi đã thay đổi từ khai báo $zvà thực hiện một số thay đổi khác. range()có lẽ sẽ tốt hơn Tôi có thể thử một cái gì đó với phạm vi sau.
Sậy

Sử dụng range, tôi đã nhận được 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;}}, đó là 166.
Sậy

1
Có, sau khi bạn viết lại thành 146 ký tự, việc sử dụng range()sẽ ít có lợi hơn. Nhưng 166 đó là quá dài thậm chí là như vậy: $ o cho mảng chữ đã trở lại, có thêm khoảng trắng xung quanh ascác từ khóa, join()là bí danh cho implode(). (Đã kiểm tra mã pastebin mà tôi đã liên kết trước đó? Hiển thị một khả năng khác để lưu trữ các điểm cuối phạm vi.) Về giải pháp 146 ký tự của bạn, bạn có thể di chuyển gán sang $ c trong ord()cuộc gọi : $d=ord($c=$n[$r]).
manatwork

2

Python, 143 byte

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)),[])))

Dùng thử trực tuyến


2
Bạn có thể sử dụng z = phạm vi để lưu 4 byte.
Arcturus

1
Khá chắc chắn rằng bạn có thể thay thế các thụt lề không gian kép bằng một tab duy nhất, điều này sẽ giúp bạn tiết kiệm một vài byte
Vụ kiện của Fund Monica

2

Perl 6, 101 byte

Đây là một vượt qua đầu tiên tại nó:

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


Sử dụng .transtrên $_để loại bỏ 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


Hành động @*ARGStrực tiếp thay vì xác định một MAINphụ.
(nếu không giống với ví dụ trước)

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

101


2

Scala, 111 91 byte

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

Điều này thất bại cho pi=3.14159. Giải pháp có thể là 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)một con số khổng lồ 128 ký tự?
Leonardo

2

Julia, 102 98 90 84 byte

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

Điều này tạo ra một hàm không tên chấp nhận một chuỗi và trả về một chuỗi.

Ung dung:

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 byte

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

Về mặt kỹ thuật, một lớp lót và PowerShell là tất cả về những thứ đó ;-)

Tách đầu vào, các ống dẫn thành một ForEach-Objectvòng lặp, chuyển sang giá trị nguyên của ký tự truyền, sau đó tạo mới char[]các phạm vi thích hợp. Lưu ý rằng chúng ta phải sử dụng byte để đặt biến tạm thời $bvì hành động truyền đầu vào $_trong câu lệnh chuyển đổi có nghĩa là chúng ta không thể tiếp tục sử dụng $_hoặc chúng ta sẽ nhận được đầu ra thú vị.

EDIT - Tôi nên chỉ ra rằng điều này sẽ loại bỏ lỗi vì đối tượng đầu tiên được đưa vào %{...}là một đối tượng null. Vì STDERR được bỏ qua theo mặc định , điều này không phải là một vấn đề. Nếu đó là một vấn đề, thay đổi bit đầu tiên là ($args-split''-ne''|...loại bỏ đối tượng null.


2

JavaScript (ES6), 340 258 273 271 byte

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}

Bạn có thể sử dụng một chuỗi mẫu `` để phân chia thay vì ("")f=i=""trong vòng lặp for. Bạn có thể có thể lưu thêm một vài byte.
intrepidcoder

@intrepidcoder Đầu tiên sẽ hoạt động. Tôi đang kiểm tra lần thứ hai.
Conor O'Brien

2

C (269 byte)

(ngắt dòng được thêm vào cho rõ ràng)

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

Bị đánh cắp

#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 byte + 1) 52

Kết hợp regexes với các toán tử có điều kiện làm việc tốt trong trường hợp này.
Với một phép nối Sử dụng bản đồ để kết hợp các phạm vi thành một mảng.

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

Kiểm tra

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

Giải trình

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 byte

Đã có hai câu trả lời JS tập trung vào mã hóa các chuỗi, vì vậy tôi quyết định thực hiện một cách tiếp cận thuật toán hơn bằng cách sử dụng 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))

Một phần thưởng của việc sử dụng phương pháp này là nó cần bất kỳ số lượng mã char nào, vì vậy joinviệc nhập danh sách là không cần thiết. Điều này hóa ra ngắn hơn bất kỳ kỹ thuật nào khác, vì vậy tôi hài lòng với kết quả này.


1

MUMPS, 131 byte

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

Tôi đã cố gắng tiết kiệm một vài byte tốt ở đây nhờ phạm vi động của MUMPS . Đây là một phiên bản không tương đương gần như tương đương, mà tôi chắc chắn sẽ thích làm nổi bật cú pháp, nếu chỉ hỗ trợ cho mô-đun MUMPS Prettify .

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 byte

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

Tôi biết nó có thể được rút ngắn bằng cách kết hợp các trường hợp 'a'..'z''A'..'Z'trường hợp, tôi nên đã cố gắng hơn.
Brad Gilbert b2gills

Tôi khuyên bạn nên thêm <!-- language-all: lang-perl6 -->ngay sau ## Perl 6đó để nó nổi bật chính xác. (Thay đổi đã chờ xử lý cho câu trả lời này)
Brad Gilbert b2gills

Bạn có thể chuyển {[~](0..$/)}sang {[~] 0..$/}đó sẽ tiết kiệm một byte.
Brad Gilbert b2gills

0

Toán học, 102 byte

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

Ồ tốt ...


0

CJam, 32 31 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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 byte

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 byte

Truyền chuỗi cho 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 byte

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

chỉnh sửa: Tấn công! Ngắn hơn PowerShell;)


1
bạn có thể làm string[]i
Erik the Outgolfer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.