ค้นหาจดหมายที่หายไป


27

แนวทาง

งาน

เขียนวิธีการที่ใช้อาร์เรย์ของตัวอักษรต่อเนื่อง (เพิ่มขึ้น) เป็นอินพุตและส่งคืนตัวอักษรที่หายไปในอาร์เรย์ (รายการในบางภาษา)


กฎระเบียบ

  • นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!
  • คุณจะได้รับอาร์เรย์ที่ถูกต้องเสมอ
  • จะมีตัวอักษรหนึ่งตัวที่หายไปเสมอ
  • ความยาวของอาร์เรย์จะมีอย่างน้อย 2 เสมอ
  • อาร์เรย์จะมีตัวอักษรเสมอในกรณีเดียว (ตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก)
  • คุณต้องเอาต์พุตในกรณีเดียวกัน (ตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก) ที่อินพุตนั้น
  • อาร์เรย์จะใช้เวลาเพียงหนึ่งตัวอักษรเสมอ (ข้ามตัวอักษรที่หายไป)
  • ความยาวของอาเรย์จะอยู่ระหว่าง 2 ถึง 25
  • องค์ประกอบแรกหรือสุดท้ายของอาร์เรย์จะไม่หายไป

ตัวอย่าง

['a','b','c','d','f'] -> 'e'

['O','Q','R','S'] -> 'P'

['x','z'] -> 'y'

['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','w','x','y','z'] -> 'v'


ฉันสามารถใช้สตริงแทนได้หรือไม่
Leun Nun

@LeakyNun Strings เป็นอาร์เรย์ของอักขระดังนั้นใช่
Amorris

1
เอาต์พุตสามารถเป็นอาร์เรย์ที่มีอักขระที่หายไป (เช่น: สำหรับอินพุต['a','b','c','d','f','g'], เอาต์พุต['e']หากทำให้โค้ดสั้นลงได้หรือไม่
Mr. Xcoder

1
@ Mr.Xcoder สตริงเป็นเพียงอาร์เรย์ของตัวละครดังนั้นใช่
Amorris

2
กฎข้อที่สี่เป็นเพียงส่วนย่อยของกฎที่แปดและสามารถลบออกได้ (อย่างน้อยถ้าคุณใส่คำว่า "รวม" ในตอนท้ายของกฎที่แปด)
นิวแฮมป์เชียร์

คำตอบ:



11

C # (. NET Core) , 48 47 46 ไบต์ป้อนข้อมูลเป็นอาร์เรย์ถ่าน

s=>{for(int i=0;s[++i]==++s[0];);return s[0];}

ลองออนไลน์!

คำอธิบาย: องค์ประกอบแรกในอาร์เรย์จะเพิ่มขึ้นเช่นเดียวกับตัวชี้ซ้ำองค์ประกอบต่อไปนี้ เมื่อทั้งองค์ประกอบแรกและองค์ประกอบปัจจุบันแตกต่างกันก็จะส่งกลับองค์ประกอบแรก

C # (. NET Core) , 58 56 50 ไบต์ป้อนข้อมูลเป็นสตริง

s=>{var c=s[0];while(s.IndexOf(++c)>=0);return c;}

ลองออนไลน์!

โซลูชัน 58- ไบต์ก่อนหน้า (อ้างอิงในความคิดเห็นแรก):

s=>{for(int i=1;;i++)if(s[i]-s[0]>i)return(char)(s[i]-1);}

อัลกอริทึมที่ใช้ System.Linq

อัลกอริทึมต่อไปนี้ต้องเพิ่มusing System.Linq;(18 ไบต์) เข้ากับจำนวนไบต์ดังนั้นจึงยาวกว่า

ฉันชอบอันนี้มาก (52 + 18 ไบต์):

s=>{int i=0;return(char)(s.First(c=>c-s[0]>i++)-1);}

และคุณยังมีหนึ่งซับ (45 + 18) - บายโซลูชั่น:

s=>(char)(s.Where((c,i)=>c-s[0]>i).First()-1)

และวิธีแก้ปัญหาที่ฉลาดมาก (37 + 18) โดยความอนุเคราะห์ของ Ed'ka:

s=>s.Select(e=>++e).Except(s).First()

1
สิ่งนี้จะไม่ล้มเหลวในการคอมไพล์โดยไม่ให้โค้ดพา ธ คืนค่าทั้งหมดหรือไม่ แต่ +1 สำหรับการเปรียบเทียบตรวจสอบด้วยs[i]-s[0], ฉลาดมาก!
TheLethalCoder

@TheLethalCoder มันจะไม่ล้มเหลวเป็นforห่วงไม่ได้มีสภาพหยุดจึงจะให้ iterating จนเงื่อนไขในการประเมินif true
ชาร์ลี

1
คุณสามารถบันทึก 8 ไบต์เช่นนี้: a=>{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}(เมื่อคุณรับอินพุตเป็นchar[]) ไม่ต้องขอบคุณผมครับขอบคุณ@Nevayความคิดเห็น 'บนJava 8 คำตอบของฉัน
Kevin Cruijssen

1
@KevinCruijssen พบวิธีบันทึกสองไบต์เพิ่มเติมที่รับอินพุตเป็นอาร์เรย์ถ่าน
Charlie

1
รุ่นที่สั้นกว่า Linq:s=>s.Select(e=>++e).Except(s).First()
Ed'ka

8

อลิซ 10 ไบต์

/X.
\ior@/

ลองออนไลน์!

คำอธิบาย

นี่เป็นเพียงกรอบสำหรับโปรแกรมเชิงเส้นที่ทำงานทั้งหมดในโหมด Ordinal (การประมวลผลสตริง):

/...
\.../

รหัสเชิงเส้นที่แท้จริงคือ:

i.rXo@

ซึ่งทำ:

i   Read all input.
.   Duplicate.
r   Range expansion. If adjacent letters don't have adjacent code points, the
    intermediate code points are filled in between them. E.g. "ae" would turn
    into "abcde". For the inputs in this challenge, this will simply insert
    the missing letter.
X   Symmetric set difference. Drops all the letters that appear in both strings,
    i.e. everything except the one that was inserted by the range expansion.
o   Output the result.
@   Terminate the program.



7

Java 8, 70 57 56 48 46 ไบต์

a->{for(int i=0;++a[0]==a[++i];);return a[0];}

-14 (70 → 56) และ -2 (48 → 46) ไบต์ขอบคุณที่@CarlosAlejo
-8 (56 → 48) ไบต์ขอบคุณที่@Nevay

คำอธิบาย:

ลองที่นี่

a->{            // Method with char-array parameter and char return-type
  for(int i=0;  //  Start index-integer at 0 and loop as long as
    ++a[0]      //   the previous character + 1 (by modifying the character at index 0)
    ==a[++i];   //   equals the next character (by raising the index by 1 before checking)
  );            //  End of loop
  return a[0];  //  Return the now modified character at index 0 in the array
}               // End of method

1
คุณสามารถใช้การส่งทางa->{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}อ้อมแทนการส่งแบบชัดแจ้งเพื่อบันทึก 8 ไบต์
Nevay

6

C (gcc) 3335 36 48 60 ไบต์

การปรับให้เหมาะสมทั้งหมดควรถูกปิดและใช้กับ GCC 32 บิตเท่านั้น

f(char*v){v=*v+++1-*v?*v-1:f(v);}

รับอินพุตเป็นสตริง

ลองออนไลน์!


2
"การปรับให้เหมาะสมทั้งหมดควรถูกปิดและใช้กับ GCC 32 บิตเท่านั้น" เป็นวิธีที่วงเวียนมากของคำพูดนี้ไม่ทำงาน (จะปรากฏเฉพาะในการทำงานเนื่องจาก UB)
sehe

ฉันจะบอกว่าfoo(char*a){return*a+1==a[1]?foo(a+1):++*a;}ค่อนข้างดี มีเพียงถ่าน 1 ตัวที่สั้นกว่าธรรมชาติมากกว่าfoo(char*a){while(*a+1==a[1])a++;return++*a;}
sehe

@ sehe พฤติกรรมที่ไม่ได้กำหนดอย่างต่อเนื่องถือว่าเป็นที่ยอมรับใน PPCG
Keyu Gan

5

Python 3 , 74 62 58 44 40 ไบต์

-12 ไบต์ขอบคุณ Erik the Outgolfer -18 ไบต์ขอบคุณ Leaky Nun -4 ไบต์ขอบคุณ musicman523

รับอินพุตเป็น bytestring

lambda s:chr(*{*range(s[0],s[-1])}-{*s})

ลองออนไลน์!

โซลูชันที่ยอดเยี่ยมอื่น:

lambda s:chr(*{*range(*s[::~-len(s)])}-{*s})

1
.difference({*s})->-{*s}
Erik the Outgolfer




1
วิธีการแก้ปัญหาของคุณคือสิ่งที่ฉันเป็นหลังจากนั้น แต่ในวิธีที่สง่างามกว่ามาก
Pureferret

4

Mathematica ขนาด 46 ไบต์

Min@Complement[CharacterRange@@#[[{1,-1}]],#]&

ฉันเชื่อว่าMin@Complement[CharacterRange@@#[[{1,-1}]],#]&จะช่วยประหยัดไบต์
LegionMammal978

@ LegionMammal978 จริง ๆ แล้ว 2!
J42161217

3

JavaScript (ES6), 70 ไบต์

อินพุตเป็นอาร์เรย์อักขระ

(a,p)=>a.some(c=>(q=p+1,p=c.charCodeAt(),p>q))&&String.fromCharCode(q)

น้อย golfed

a=>{
  p = undefined;
  for(i = 0; c = a[i]; i++)
  {
    q = p+1
    p = c.charCodeAt()
    if (p>q)
      return String.fromCharCode(q)
  }
}

ทดสอบ

F=(a,p)=>a.some(c=>(q=p+1,p=c.charCodeAt(),p>q))&&String.fromCharCode(q)

function update() {
  var a0=A0.value.charCodeAt()
  var a1=A1.value.charCodeAt()
  if (a1>a0) {
    var r = [...Array(a1-a0+1)]
      .map((x,i)=>String.fromCharCode(a0+i))
      .filter(x => x != AX.value)
    I.textContent = r.join('') + " => " + F(r)
  }
  else {
    I.textContent=''
  }
}

update()
input { width: 1em }
Range from <input id=A0 value='O' pattern='[a-zA-Z]' length=1 oninput='update()'>
to <input id=A1 value='T' pattern='[a-zA-Z]' length=1 oninput='update()'>
excluding <input id=AX value='Q' pattern='[a-zA-Z]' length=1 oninput='update()'>
<pre id=I></pre>



3

เรติน่า , 33 25 ไบต์

$
¶$_
T`p`_p`.*$
D`.
!`.$

ลองออนไลน์! ใช้ได้กับอักขระ ASCII ทุกช่วง แก้ไข: บันทึก 8 ไบต์ด้วย @MartinEnder คำอธิบาย: ขั้นตอนแรกทำซ้ำอินพุต ตัวที่สองจะลดอักขระทั้งหมดในการคัดลอกด้วย 1 รหัสพอยต์ ขั้นตอนที่สามจะลบอักขระทั้งหมดในสำเนาที่ยังคงปรากฏในต้นฉบับ ตัวอักษรนี้นำหน้าอักขระตัวแรกของอินพุตดั้งเดิมและอักขระที่หายไป ขั้นตอนสุดท้ายจากนั้นก็ตรงกับตัวละครที่หายไป


นี่คือ 25 โดยใช้แนวคิดพื้นฐานเดียวกัน: tio.run/##K0otycxL/P9fhevQNpV4rpCEgoT4ggQ9LRUulwQ9LsUEPZX///... (. ฉัน decrementing บรรทัดที่สองเพราะเห็นว่าจะช่วยประหยัดไบต์แล้วฉันหาถ่านที่ไม่ซ้ำกันโดยใช้การคัดลอก)
Martin Ender

@MartinEnder การขจัดความซ้ำซ้อนเป็นสิ่งที่ฉันต้องการมาตลอดและฉันลืม Retina ไปแล้วถอนหายใจ ... (ฉันรู้ว่าการเพิ่มบรรทัดแรกต้องใช้ไบต์มากกว่าการลดลงของบรรทัดที่สอง แต่มันทำให้ regex สั้นกว่า)
Neil

3

SWI Prolog ขนาด 124 ไบต์

m([H|T]):-n(H,N),c(T,N),!,m(T).
n(I,N):-o(I,C),D is C+1,o(N,D).
c([N|_],N).
c(_,N):-print(N),!,fail.
o(C,O):-char_code(C,O).

ตัวอย่าง:

?- m(['a','b','c','d','f']).
e
false.

?- m(['O','Q','R','S']).
'P'
false.

?- m(['x','z']).
y
false.

?- m(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','w','x','y','z']).
v
false.

คำอธิบายเล็กน้อย:

mเป็นขั้นตอน "หลัก" ที่nก่อตัวละครที่คาดว่าต่อไปในรายการ การcเปรียบเทียบ - หากความคาดหวังตรงกับรายการถัดไปให้ดำเนินการต่อมิฉะนั้นพิมพ์อักขระที่ต้องการและกระโดดออกจากหน้าต่าง


1
สั้นกว่าfail: 0=1.
mat

3

C ++ 14, ไลบรารีมาตรฐาน, ชนิดคอนเทนเนอร์ทั่วไป ( 87 86 ไบต์)

[](auto a){return++*adjacent_find(begin(a),end(a),[](auto a,auto b){return a+1!=b;});}

ประเภทตู้คอนเทนเนอร์จาก namespace ::stdจะสันนิษฐาน (เช่นstd::string, std::listหรือstd::vector. มิฉะนั้นusing namespace std;หรือคล้ายกันจะได้รับการสันนิษฐานว่า

ขอบคุณ @Ven ด้วยการแฮ็ก preprocessor เล็กน้อยคุณจะได้รับถึง 82 ไบต์ (1 บรรทัดใหม่)

#define x [](auto a,int b=0){return++
x *adjacent_find(begin(a),end(a),x a!=b;});}

ดูมัน Live On Coliru

C ++ 14 ไม่มีไลบรารีมาตรฐาน (ยังคงทั่วไป, 64 63 ไบต์)

[](auto& a){auto p=*begin(a);for(auto c:a)if(c!=p++)return--p;}

อีกครั้งต้องช่วยค้นหาชื่อเฉพาะในกรณีที่ประเภทภาชนะไม่ได้มาจาก namespace ::std(หรือที่เกี่ยวข้องกับมัน)

Live On Coliruสำหรับstd::stringเช่น

Live On Coliruสำหรับchar const[]เช่น


คุณต้องเว้นช่องว่างระหว่างข้อความขีดฆ่าและข้อความถัดไป
CJ Dennis

@CJDennis Done โดยวิธีการตัวแทนปัจจุบันของคุณ (2469) เป็นตัวเลขที่สวยงาม (เป็น 3 * 823 และยังจับคู่สายตาเป็น (24) (69) ซึ่งคือ (2 2 2 3) (3 23))
sehe

2

ถ่าน 18 ไบต์

Fγ¿¬∨∨‹ι⌊θ›ι⌈θ№θιι

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด รับอินพุตเป็นสตริง ทำงานร่วมกับลำดับ ASCII ที่ต่อเนื่องกันเกือบทุกตัว


2

C #, 104 ไบต์

using System.Linq;a=>(char)Enumerable.Range(a.Min(),a.Max()-a.Min()).Except(a.Select(c=>(int)c)).First()

เวอร์ชันเต็ม / ฟอร์แมต:

using System.Linq;

namespace System
{
    class P
    {
        static void Main()
        {
            Func<char[], char> f = a =>
                (char)Enumerable.Range(a.Min(), a.Max() - a.Min())
                                .Except(a.Select(c=>(int)c))
                                .First();

            Console.WriteLine(f(new[] { 'a', 'b', 'c', 'd', 'f' }));

            Console.ReadLine();
        }
    }
}

รุ่น Linq ที่ฉลาดมากโดย Ed'ka :s=>s.Select(e=>++e).Except(s).First()
Charlie

@CarlosAlejo ฉันเห็นคุณเพิ่มเข้าไปในคำตอบของคุณดังนั้นฉันจะไม่อัปเดตของฉัน แต่ใช่มันฉลาดมาก สั้นกว่ารุ่นของฉันมาก
TheLethalCoder

2

MATL, 8 7 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Luis

tdqf)Qc

ลองใช้ที่MATL Online

คำอธิบาย

      % Implicitly grab the input as a string
t     % Duplicate the string
d     % Compute the differences between successive characters
q     % Subtract 1 from each element
f     % Get the locations of all non-zero characters (1-based index)
)     % Extract that character from the string
Q     % Add one to get the next character (the missing one)
c     % Convert to character and display

@ LuisMendo ยอดเยี่ยมขอบคุณ!
Suever

2

Excel, 110 + 2 = 112 ไบต์

=CHAR(CODE(LEFT(A1))-1+MATCH(0,IFERROR(FIND(CHAR(ROW(INDIRECT(CODE(LEFT(A1))&":"&CODE(RIGHT(A1))))),A1),0),0))

ต้องป้อนเป็นสูตรอาร์เรย์ ( Ctrl+ Shift+ Enter) ซึ่งจะเพิ่มวงเล็บปีกกา{ }ในแต่ละด้านเพิ่มสองไบต์ การป้อนข้อมูลเป็นสตริงในA1ซึ่งเป็นที่ตกลงต่อ OP

นี่ไม่ใช่คำตอบที่สั้นที่สุด (Excel ไม่ค่อยมี) แต่ฉันชอบดูว่ามันสามารถทำได้



2

CJam , 6 ไบต์ (โปรแกรมเต็มรูปแบบ) / 7 ไบต์ (บล็อกรหัส)

q),^W=

ลองออนไลน์!

นี่เป็นโปรแกรม CJam เต็มรูปแบบที่อ่านสตริงอินพุตจากอินพุตมาตรฐานและพิมพ์ตัวอักษรที่หายไปไปยังเอาต์พุตมาตรฐาน CJam ไม่มี "วิธีการ" ซึ่งเป็นสิ่งที่ท้าทายสำหรับสิ่งที่ต้องการ แต่สิ่งที่ใกล้เคียงที่สุดอาจเป็นบล็อกโค้ดที่เรียกใช้งานได้เช่นนี้

{),^W=}

ลองออนไลน์!

โค้ดบล็อกนี้เมื่อถูกประเมินจะรับอินพุตเป็นสตริง (เช่นอาร์เรย์ของอักขระ) บนสแต็กและส่งคืนอักขระที่หายไปเช่นกันบนสแต็ก


คำอธิบาย:ในโปรแกรมเต็มqอ่านสตริงอินพุตและวางลงบนสแต็ก )จากนั้นจะปรากฏตัวอักษรตัวสุดท้ายของสตริงป้อนข้อมูลและตัวดำเนินการช่วง,จะเปลี่ยนเป็นอาร์เรย์ที่มีอักขระทั้งหมดที่มีรหัสจุดด้านล่าง (รวมถึงตัวอักษรทั้งหมดก่อนหน้าในตัวอักษร) ดังนั้นตัวอย่างเช่นถ้าอินพุตcdfghนั้นหลังจาก),สแต็กจะมีสตริงcdfg(เช่นอินพุตที่มีตัวอักษรตัวสุดท้ายถูกลบ) และ...abcdefgโดยที่...หมายถึงกลุ่มของอักขระที่มีรหัส ASCII ด้านล่างa(เช่นอักขระทั้งหมดด้านล่างอินพุตสุดท้ายที่ถูกลบออก ตัวอักษร)

ตัวดำเนินการความแตกต่างของชุดสมมาตร^จะรวมสตริงเหล่านี้เป็นสตริงเดียวที่มีอักขระเหล่านั้นทั้งหมดที่ปรากฏในหนึ่งในสตริง แต่ไม่ใช่ทั้งสองอย่าง จะรักษาลำดับที่ตัวอักษรที่ปรากฏในสตริงดังนั้นสำหรับการป้อนข้อมูลตัวอย่างcdfgผลที่ได้หลังจากที่),^จะมี...abeที่...อีกครั้งยืนสำหรับพวงของตัวอักษรที่มีรหัส ASCII aด้านล่าง ในที่สุดW=เพียงแยกอักขระตัวสุดท้ายของสตริงนี้ซึ่งเป็นอักขระที่หายไปeซึ่งเราต้องการค้นหา (และละทิ้งส่วนที่เหลือ) เมื่อโปรแกรมสิ้นสุดตัวแปล CJam จะพิมพ์เนื้อหาของสแต็คโดยปริยาย


โบนัส: GolfScript 6 ไบต์ (โปรแกรมเต็มรูปแบบ)

),^-1>

ลองออนไลน์!

ปรากฎว่าเกือบรหัสเดียวกันยังทำงานใน GolfScript เราบันทึกหนึ่งไบต์ในเวอร์ชันเต็มของโปรแกรมเนื่องจากการป้อนข้อมูลโดยนัยของ GolfScript แต่สูญเสียหนึ่งไบต์เพราะWGolfScript ไม่ได้มีตัวแปรตัวอักษรตัวเดียวที่มีประโยชน์เริ่มต้นที่ -1

นอกจากนี้ CJam ยังมีประเภทจำนวนเต็มและอักขระแยกต่างหาก (และสตริงเป็นเพียงอาร์เรย์ที่มีอักขระ) ในขณะที่ GolfScript มีเพียงประเภทจำนวนเต็มเดียว (และมีประเภทสตริงพิเศษที่ทำงานค่อนข้างแตกต่างจากอาร์เรย์ปกติ) ผลลัพธ์ที่ได้ก็คือถ้าเราต้องการล่าม GolfScript เพื่อพิมพ์ตัวอักษรที่ขาดหายไปจริงแทนหมายเลขรหัส ASCII เราต้องส่งคืนสตริงอักขระเดี่ยวแทนที่จะเป็นแค่ตัวอักขระ โชคดีที่การเปลี่ยนแปลงที่นี่ก็ต้องเปลี่ยนผู้ประกอบการจัดทำดัชนี=ด้วย / >สตริงซ้ายประกอบการตัดอาร์เรย์

แน่นอนด้วย I / O โดยนัยของ GolfScript โค้ดข้างต้นสามารถใช้เป็นตัวอย่างข้อมูลที่อ่านสตริงจากสแต็กและส่งคืนสตริงอักขระเดี่ยวที่มีตัวอักษรที่หายไป หรือตัวอย่างข้อมูลใด ๆ ที่ใช้สตริงเดี่ยวบนสแต็กเป็นอาร์กิวเมนต์และส่งคืนเอาต์พุตเป็นสตริงที่พิมพ์ได้บนสแต็กก็เป็นโปรแกรม GolfScript แบบเต็ม


6
โค้ดจะไม่ได้รับอนุญาตโดยค่าเริ่มต้น ; มีเพียงฟังก์ชั่นและโปรแกรมเต็มรูปแบบเท่านั้น ดังนั้นคุณอาจต้องการq(โปรแกรม) หรือ{...}(บล็อก) +1 สำหรับวิธีการ
Luis Mendo

มันฉลาดมาก!
แยกผลไม้

2

Husk , 6 ไบต์

→S-(ḣ→

ลองออนไลน์!

ฟังก์ชันนี้ใช้สตริง (รายการอักขระ) เป็นอินพุตและส่งคืนอักขระเป็นเอาต์พุต

คำอธิบาย

→S-(ḣ→
    ḣ→    Get the list of all characters from the null byte to the last character of the input
 S-       Subtract the input from this list
→         Get the last element of the result

2

Python 2 - 76 ไบต์

แพ้โซลูชัน python 2 ที่มีอยู่แล้ว แต่มันเป็นแนวทางที่แตกต่างกันเล็กน้อยดังนั้นฉันคิดว่าฉันจะโพสต์ไว้แล้ว:

lambda c:[chr(x)for x in range(ord(c[0]),ord(c[0]+26)if chr(x)not in c][0]

2

8th , 99 ไบต์

หลักการและเหตุผล

หากระยะห่างระหว่างตัวอักษรมากกว่าสองแสดงว่ามีตัวอักษรหายไป ระยะทางตัวอักษรได้มาจากการคำนวณความแตกต่างระหว่างรหัส ASCII ของแต่ละตัวอักษร

รหัส

: f ' nip s:each repeat over n:- 2 n:= if n:1+ "" swap s:+ . reset 1 then depth n:1- while! reset ;

เวอร์ชันที่ไม่ดี

: f \ s -- c 
  ' nip s:each    \ convert each letter into its ASCII code and put them on stack
  repeat
    over
    n:- 2 n:=     \ check if there is a missing letter 
    if            
      n:1+        \ compute the ASCII code of missing letter
      "" swap s:+ \ convert ASCII code into printable character
      .           \ print out the missing letter
      reset 1     \ set condition to exit from while!
    then
    depth n:1-    \ verify if there are letters to check
  while!          
  reset           \ clean stack
;

การใช้งานและตัวอย่าง

ok> "abcdf" f
e
ok> "OQRS" f
P
ok> "xz" f
y
ok> "abcdefghijklmnopqrstuwxyz" f
v
ok> "ab" f

ok> "def" f

ok>

2

JavaScript (ES6), 64 ไบต์

รับอินพุตเป็นสตริง

s=>(g=p=>(c=String.fromCharCode(n++))<s[p]?p?c:g(p):g(p+1))(n=0)

อย่างไร?

  • เริ่มต้น: เราเริ่มต้นด้วยn = 0และp = 0และเรียกใช้ฟังก์ชัน recursive กรัม ()

    g = p =>                                   // given p
      (c = String.fromCharCode(n++)) < s[p] ?  // if the next char. c is not equal to s[p]:
        p ?                                    //   if p is not equal to zero:
          c                                    //     step #3
        :                                      //   else:
          g(p)                                 //     step #1
      :                                        // else:
        g(p + 1)                               //   step #2
  • ขั้นตอนที่ # 1: เราเพิ่มnจนกว่าc = String.fromCharCode(n)จะมีค่าเท่ากับตัวอักษรตัวแรกของสายป้อนs [0]

  • ขั้นตอนที่ # 2: ตอนนี้เรากำลังทำข้อมูลให้ตรงกันเราเพิ่มทั้งnและpในเวลาเดียวกันจนกว่าc = String.fromCharCode(n)จะไม่เท่ากับs [p]อีกต่อไป

  • ขั้นตอนที่ # 3: เราคืนค่าc : อักขระที่คาดหวังซึ่งไม่พบ

กรณีทดสอบ


1

J, 20 ไบต์

{&a.>:I.1 0 1&E.a.e.
  • a.e. บูลีนมาสก์สำหรับใส่ตัวอักษรผ่าน ascii charset
  • 1 0 1&E.ใหม่บูลีนมาสก์ระบุว่าลำดับ101เริ่มต้นที่ดัชนีนั้นหรือไม่ค้นหาตำแหน่งใด ๆ ที่ลำดับ "ข้าม" เริ่ม
  • I. ดัชนีของการจับคู่นั้นคือตัวละครก่อนที่จะข้ามหนึ่ง
  • >: เพิ่มขึ้น 1 เช่นดัชนีของอักขระที่ข้ามภายใน ascars charset
  • {&a. เลือกดัชนีนั้นจาก ascii charset เช่นคืน char ที่ข้ามไป

ลองออนไลน์!


ดูเหมือนว่าตัวอย่างของฉัน
Adám

@ Adámมันเขียนในรูปแบบโดยปริยาย (ไม่มีจุด) ซึ่งฉันเชื่อว่านับว่าเป็น "ฟังก์ชั่นเหมือน" ตรงข้ามกับตัวอย่าง ดีที่สุดที่ฉันสามารถบอกได้ว่ามันไม่ได้เป็นตัวอย่างมากกว่าโซลูชั่น APL ของคุณคือ (แต่ฉันไม่รู้จัก dyalog ดังนั้นให้ใช้สิ่งที่ฉันพูดด้วยเม็ดเกลือ)
zgrep

@ Adam ใช่มันเป็นในแง่ที่ว่ามันไม่สามารถกำหนดให้กับตัวแปร แต่จะถือว่าอินพุตที่ด้านขวาของมัน สิ่งนี้ไม่ถูกกฎหมายหรือไม่ ฉันถามเรื่องนี้ที่ไหนสักแห่งและได้รับการบอกว่าไม่เป็นไร
โยนาห์

ความเข้าใจของฉันสำหรับ APL / J / K คือรหัสจะต้องสามารถอยู่ในชื่อไม่ว่าจะโดยการมอบหมายหรือเป็นร่างกายกริยา / ฟังก์ชั่นที่ชัดเจน (แต่รูปแบบที่ชัดเจนจะต้องมีการป้อนข้อมูลที่ชัดเจน) ตัวอย่างคือโค้ดที่ใช้สมมติค่าในตัวแปรและ / หรือต้องการวางลงในบรรทัด แต่ไม่สามารถยืนได้ด้วยตนเอง
Adám

@zgrep ไม่รหัสนี้มีความชัดเจน (ไม่มีความเงียบ) แต่ไม่มีการอ้างอิงถึงอาร์กิวเมนต์ที่อยู่ทางขวาสุด ฟังก์ชั่น APL ของฉันเป็นฟังก์ชั่นโดยปริยายที่สมบูรณ์ซึ่งสามารถกำหนดหรือใส่ในวงเล็บ
Adám

1

ES6, 125 ไบต์:

(a=>((s,f)=>(r=(i,b)=>a[i]?r(i+1,b||(s[f](i)-s[f](i-1)-1&&String.fromCharCode(s[f](i-1)+1))):b)(1,0))(a.join(""),"charCodeAt"))

http://jsbin.com/vasoqidawe/edit?console

ฟังก์ชันที่ส่งคืนจะต้องถูกเรียกด้วยอาเรย์

(["a","c"])

สามารถบันทึกอีก 9 ไบต์ผ่านการลบ. join ("")และส่งผ่านสตริง:

("ac")

ES6, 108 ไบต์:

(a=>((s,f,o)=>(a.find((_,i)=>(o?++o:o=s[f](i))!==s[f](i)),String.fromCharCode(o)))(a.join(""),'charCodeAt'),0))

http://jsbin.com/tudiribiye/edit?console


1
ผูก ??? ในรหัสกอล์ฟ?
edc65

@ edc65 มีอะไรผิดปกติกับมัน? (ขออภัยถ้านี่คือ n00b แต่นั่นเป็นสนามกอล์ฟครั้งแรกของฉัน :))
Jonas Wilms

@ edc65 แต่ youre อาจขวาเอาบันทึกไว้ 4 ไบต์ ...
โจนาส Wilms

a.join("")อาจเป็นa.join``
user2428118


1

Python 2 , 69 ไบต์

lambda a:chr((ord(a[0])+ord(a[-1]))*-~len(a)/2-sum(ord(x)for x in a))

ลองออนไลน์!

คำอธิบายบางอย่างที่เรารู้องค์ประกอบแรกและสุดท้ายของรายการเราสามารถคำนวณผลรวมของรหัสของตัวอักษรทั้งหมดในlist + the missed char(โดยใช้สูตรสรุปความก้าวหน้าทางคณิตศาสตร์ ) ได้อย่างง่ายดาย ความแตกต่างระหว่างผลรวมนี้และผลรวมของรหัสของตัวอักษรทั้งหมดในการlistให้รหัสของจดหมายที่ไม่ได้รับ


1

05AB1E , 9 7 ไบต์

ǤÝsKçθ

ลองออนไลน์!


ฉันจะพิพากษาจาก2ที่เราใช้วิธีเดียวกันแม้ว่าฉันแทบจะไม่ทราบ 05AB1E :)
รั่วนูน

@LeakyNun ดีฉันคิดว่าอัลกอริทึมเกินไป ...
เอริก Outgolfer

ฉันเพิ่งเปลี่ยนอัลกอริทึมของฉัน
Leun Nun

@LeakyNun มันจะนานกว่านี้ใน 05AB1E อย่างไรก็ตาม
Erik the Outgolfer

ผมแค่คิดว่าอัลกอริทึมที่มี 2 อีกอาจเป็นของคุณ ...
รั่วนูน

1

APL (Dyalog)ขนาด 17 ไบต์

(⊃⎕AV/⍨∨\∧~)⎕AV∘∊

ลองออนไลน์!

⎕AV∘∊ บูลีน: ตัวละครแต่ละตัวในสมาชิกA tomic V (ชุดอักขระ) ของการโต้แย้ง?

(... ) ใช้ฟังก์ชัน tacit ต่อไปนี้:

 องค์ประกอบแรกของ

⎕AVTomic วีเอ็กเตอร์ (ชุดอักขระ)

/⍨ ที่

∨\ ตามหลังเริ่มต้น (สมาชิกของการโต้แย้ง)

 แต่

~ ไม่ใช่ (สมาชิกของการโต้แย้ง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.