ฟังก์ชั่นที่จะใช้สามจำนวนเต็มและส่งกลับรายการจำนวนเต็มและตัวอักษรตัวอักษร


10

ท้าทาย

เราใช้เวลาสามจำนวนเต็มบวกa, bและcเป็น input ใช้จำนวนเต็มเหล่านี้เป็นครั้งแรกสร้างลำดับในช่วงที่[0, c](รวมทั้งสองด้าน) bในขั้นตอนของ ตัวอย่างเช่นสำหรับลำดับจะเป็นa=4, b=2, c=100[0,2,4,...,96,98,100]

สำหรับทุกหมายเลขในลำดับนี้ซึ่งหารด้วยaให้แทนที่ด้วยตัวอักษรถัดไปในตัวอักษรตัวพิมพ์เล็กเริ่มต้นด้วยตัวอักษร 'a' และล้อมรอบกลับเป็น 'a' หลังจากคุณถึง 'z'

ตัวอย่าง:

อินพุต: a=4, b=2, c=100
เอาต์พุต:a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

กฏท้าทาย:

  • คุณสามารถสมมติว่าa, bและเป็นจำนวนเต็มบวกเท่านั้นที่cb ≤ a ≤ c
  • คุณสามารถสันนิษฐานได้ว่าaมีหลายbตัว
  • คุณสามารถสันนิษฐานได้ว่าคือหารด้วยcb
  • เอาต์พุตที่ต้องการคือสตริงที่ต่อกันเดียวตามด้านบน แต่รายการ / อาร์เรย์นั้นเป็นที่ยอมรับ

กรณีทดสอบ:

Input: a=4, b=2, c=100
Output:
a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

Input: a=9, b=3, c=174
Output:
a36b1215c2124d3033e3942f4851g5760h6669i7578j8487k9396l102105m111114n120123o129132p138141q147150r156159s165168t174

Input: a=10, b=2, c=50
Output:
a2468b12141618c22242628d32343638e42444648f

Input: a=25, b=1, c=25
Output:
a123456789101112131415161718192021222324b

Input: a=6, b=6, c=48
Output:
abcdefghi

Input: a=6, b=3, c=48
Output: a3b9c15d21e27f33g39h45i

Input: a=2, b=1, c=100
Output: a1b3c5d7e9f11g13h15i17j19k21l23m25n27o29p31q33r35s37t39u41v43w45x47y49z51a53b55c57d59e61f63g65h67i69j71k73l75m77n79o81p83q85r87s89t91u93v95w97x99y

ฉันอยากเห็นคำตอบใน PHP จริงๆแต่ความท้าทายนี้เปิดสำหรับทุกภาษา นี่คือดังนั้นคำตอบควรสั้นที่สุด กฎระเบียบมาตรฐานใช้สำหรับฟังก์ชั่น / โปรแกรมและช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม


1
ลองพิจารณาใช้The Sandboxเพื่อรับคำแนะนำและข้อเสนอแนะเกี่ยวกับคำถามก่อนโพสต์ไว้ที่หน้าหลัก
Jo King

3
สวัสดียินดีต้อนรับสู่ PPCG! แม้ว่าฉันจะชอบความท้าทาย แต่คำอธิบายก็ยังขาดสิ่งต่างๆมากมาย ตามที่ได้รับการกล่าวถึงโดย @JoKing แท็กที่ชนะเลิศนั้นเป็นข้อบังคับซึ่ง[codegolf]เป็นสิ่งที่พบได้บ่อยที่สุดที่ฉันอยากจะแนะนำ JoKing พูดถึงด้วยทำให้ไม่แนะนำภาษาเฉพาะ เป็นการดีที่สุดที่จะเปิดให้ทุกภาษาแทน สำหรับความท้าทายนั้นโปรดระบุอีกเล็กน้อยและเพิ่มอีกสองสามกรณีทดสอบ จากตัวอย่างที่ฉันเห็นช่วงคือ[0,c]แต่สิ่งนี้ควรมีความชัดเจนโดยไม่ต้องดูตัวอย่าง
Kevin Cruijssen

1
ฉันคิดว่าสิ่งที่คุณต้องทำคือเปลี่ยนชื่อเป็นคำอธิบายเพิ่มเติมและนี่เป็นเรื่องดีที่จะไป
Jo King

1
ฉันใช้เสรีภาพในการแก้ไขความท้าทายของคุณเพื่อให้สามารถเปิดใหม่ได้ ครั้งต่อไปโปรดใช้ Sandbox ตามคำแนะนำเพื่อทำให้การท้าทายสมบูรณ์แบบก่อนโพสต์ไว้ในหลัก โปรดดูสิ่งที่ฉันแก้ไขเพื่อให้คุณทราบเรื่องนี้สำหรับความท้าทายในอนาคต หากมีสิ่งใดไม่ถูกต้องหรือฉันตีความบางสิ่งผิดพลาดคุณสามารถแก้ไขได้อีกครั้ง
Kevin Cruijssen

5
ดูเหมือนว่าไม่มีการทดสอบกรณีของคุณห่อรอบจากไป'z' 'a'คุณช่วยกรุณารวมหนึ่งที่ไม่?
OOBalance

คำตอบ:


8

PHP , 67 ไบต์

ก่อนอื่นขอขอบคุณสำหรับการโพสต์สิ่งที่ท้าทายมาก! ฉันสนุกกับการแก้ไข :) ตอนนี้นี่เป็นวิธีแก้ปัญหา 67 ไบต์ของฉัน:

<?for(;$i<=($p=$argv)[3];$i+=$p[2])echo$i%$p[1]?$i:chr($l++%26+97);

วิธีเรียกใช้:

php -n <filename> {a} {b} {c}

หรือลองออนไลน์!


นี่คือวิธีการแก้ปัญหาเดียวกัน ungolfed และมีความคิดเห็นคำอธิบาย:

$a      = $argv[1];
$b      = $argv[2];
$c      = $argv[3];
$letter = 'a';
for ($i = 0; $i <= $c; $i += $b) {
    if ($i % $a) { // If $i is divisible by $a, the modulo (%) operator will return a remainder of 0, which PHP sees as a falsey value.
        echo $i;
    } else {
        $letter++;
        $letter %= 26; // Wrap $letter around to `a` after it gets to `z`.
        echo chr($letter + 97); // Use PHP's chr function to get the character. 97 is the index of `a`. http://php.net/manual/en/function.chr.php
    }
}

ฉันใช้โซลูชัน 60 ไบต์ แต่ไม่ได้แปล:

<?for($l=a;$i<=($p=$argv)[3];$i+=$p[2])echo$i%$p[1]?$i:$l++;

ลองออนไลน์!


6

Japt 15 ไบต์

;0ôWV £CgX/U ªX

ทดสอบออนไลน์!

คำอธิบาย

;0ôWV £CgX/U ªX    Implicit: U, V, W = inputs
;                  Reset C to the lowercase alphabet (among other variable resets).
 0ôWV              Create the inclusive range [0...W], using a step of V.
      £            Map each item X by this function:
       CgX/U         Get the character at index (X / U) in the lowercase alphabet. If X is
                     not divisible by U, this is a non-integer and the result is undefined.
             ªX      In this case (literally, if falsy), replace it with X.
                   Implicit: output result of last expression

1
14 ไบต์c,a,bการป้อนข้อมูลในการสั่งซื้อ
Shaggy

5

R , 65 63 ไบต์

function(a,b,c,z=seq(0,c,b)){z[x]=rep(letters,sum(x<-!z%%a));z}

ลองออนไลน์!

บันทึก 2 ไบต์ด้วย JayCe!

ส่งคืนรายการของสตริงเนื่องจาก R จะบังคับตัวเลขให้เป็นสตริง การพิมพ์เพียงแทนที่ต่อท้ายด้วยzcat(z,sep="")


ดูเหมือนว่าl=ไม่จำเป็น TIO
JayCe

@ JayCe แน่นอน ฉันวางมันไว้ที่นั่นเพื่อป้องกันไม่ให้ต้องสร้างค่ามากเกินไป แต่มันก็เป็นเรื่องที่ไม่น่าทำเลย!
จูเซปเป้

5

Clojure, 84 79 77 ไบต์

#(for[i(range 0(inc %3)%2)](if(=(mod i %1)0)(char(+(mod(/ i %1)26)(int \a)))i))

Givin 'Lisp ความรักเล็ก ๆ น้อย ๆ

ลองออนไลน์!

(-7 ไบต์ขอบคุณ @NikoNyrh!)


ยินดีต้อนรับสู่ PPCG! คุณรู้หรือไม่ว่าจะต้องเพิ่มสิ่งใดในการเรียกใช้ฟังก์ชั่นและพิมพ์ผลลัพธ์บนลองออนไลน์ ?
Laikoni

1
@Laikoni ฉันเพิ่ม "ลองออนไลน์" ในโพสต์ของฉัน ฉันยังแก้ไขข้อผิดพลาดในรหัสของฉันดังนั้นขอขอบคุณที่เตือนฉัน!
Lispy Louie

ทำได้ดีมาก :) คุณสามารถบันทึกได้ 3 ไบต์หากคุณสร้างฟังก์ชั่นด้านนอกผ่านทาง#(...)และใช้fnเพื่อแสดงความสามารถด้านใน ในขณะที่คุณอยู่ที่นั้นคุณสามารถแทนที่mapด้วยการforสร้างและบันทึกเพิ่มเติม 4 ไบต์
NikoNyrh

@NikoNyrh สังเกตดี!
Lispy Louie

และ%1สามารถถูกแทนที่ด้วย%;)
NikoNyrh

3

Java 10, 93 83 ไบต์

(a,b,c)->{var r="";for(int i=0;i<=c;i+=b)r+=i%a<1?(char)(i/a%26+97):i+"";return r;}

ลองออนไลน์ได้ที่นี่ ขอบคุณScroobleสำหรับการเล่นกอล์ฟ 10 ไบท์

Ungolfed:

(a, b, c) -> { // lambda taking 3 integer arguments and returning a String
    var r = ""; // we build the result String in steps
    for(int i = 0; i <= c; i+=b) // loop over the range [0,c] in steps of b
        r += i % a < 1 ? (char) (i / a % 26 + 97) : "" + i; // if i is a multiple of a, append the next letter to r as a char, else append i
    return r; // return the result
}

3

Perl 6 ,  60  50 ไบต์

->\a,\b,\c{[~] (0,b...c).map:{$_%a??$_!!('a'..'z')[$++%26]}}

ทดสอบมัน

{$^a;(0,$^b...$^c).map:{$_%$a??$_!!chr 97+$++%26}}

ทดสอบมัน

{  # bare block lambda with parameters $a,$b,$c

  $^a; # declare param $a, but don't use it
       # (so $a can be used in the inner block)

  (
    0, $^b ... $^c  # the base sequence

  ).map:            # for each of those values
  {
    $_ % $a         # is it not divisible by `$a` ( shorter than `%%` )

    ??  $_          # if it isn't divisible just return it

    !!              # otherwise return the following

        chr         # a character from the following number

          97 +      # 'a'.ord +
          $++       # self incrementing value (starts at 0)
          % 26      # wrap around back to 'a'
  }
}

คุณกำลังสูญเสียไบต์โดยใช้->\a,\b,\c: ใช้เพียง$^aฯลฯ และchr 97+$++%26ค่อนข้างสั้นกว่า("a".."z")[$++%26]เล็กน้อย ในที่สุดคุณสามารถละเว้นการต่อข้อมูลได้เนื่องจากความท้าทายไม่ต้องการ นั่นจะช่วยประหยัด 10 ไบต์ทั้งหมดโดยปล่อยให้ 50
Ramillies


3

05AB1E , 17 15 ไบต์

/ݹ*εD³ÖiA¾è¼}?

-2 ไบต์ขอบคุณที่@MagicOctopusUrn

bcaจะเข้าในการสั่งซื้อ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

/               # Divide the second (implicit) input `c` by the first (implicit) input `b`
                #  i.e. 2 and 100 → 50
 Ý              # Take the range [0, `divided_c`]
                #  i.e. 50 → [0,1,2,...,48,49,50]
  ¹*            # Multiply it with the first input `b`
                #  [0,1,2,...,48,49,50] → [0,2,4,...,96,98,100]
    εD          # For-each in this list:
      ³Öi       #  If the current number is divisible by the third input `a`:
                #   i.e. 8 and `a=4` → 1 (truthy)
                #   i.e. 10 and `a=4` → 0 (falsey)
         A      #   Push the lowercase alphabet
          ¾     #   Push the counter_variable (which starts at 0 by default)
           è    #   Index the alphabet with this counter_variable (wraps around by default)
         ¼      #   Increase the counter_variable by 1
            }   #  Close the if
             ?  #  Output without new-line
                #  (If the if was not entered, the input is implicitly output as else-case)

1
ดูเหมือนว่าจะใช้งานได้ แต่นี่เป็นภาษาอะไร และฉันสามารถแบ่งมันเป็นฟังก์ชัน php ได้อย่างไร
Mochesane

1
ภาษาคือ 05AB1E ลิงก์ไปยัง GitHub และอยู่ในชื่อโพสต์ของฉัน และฉันก็กลัวว่าภาษานี้จะแตกต่างจาก PHP 05AB1E ถูกออกแบบมาสำหรับ codegolfing ในขณะที่ PHP นั้นเป็นไฮเปอร์เท็กซ์โพรเซสเซอร์สำหรับการพัฒนาเว็บ ฉันอยากจะแนะนำให้แก้ไขคำอธิบายการท้าทายและทำให้พร้อมใช้งานสำหรับทุกภาษา แต่ระบุว่าคุณต้องการคำตอบ PHP เมื่อมันถูกเปิดใหม่ฉันมั่นใจว่าคนที่มีความเชี่ยวชาญใน PHP สามารถที่จะตอบคำถามเกี่ยวกับกอล์ฟได้ หากคุณต้องการความช่วยเหลือในการแก้ไข / แก้ไขความท้าทายของคุณแจ้งให้เราทราบ
Kevin Cruijssen

1
/ݹ*vyD³ÖiA¾è¼}?คือ 16 เพียงแค่ทำซ้ำyแทนการใช้ëซึ่ง?จะไม่สนใจถ้ามันผลักอักขระถ่าน ที่จริงแล้ว/ݹ*εD³ÖiA¾è¼}?ทำงานได้ 15 ครั้งเพราะเราเขียนทับอาร์เรย์ผลลัพธ์มากเกินไปคุณสามารถผูกผู้ชนะในปัจจุบัน> :)
Magic Octopus Urn

@MagicOctopusUrn ขอบคุณ! :) ëลืมเกี่ยวกับนัย
Kevin Cruijssen



2

CJam , 23 ไบต์

q~),@/f%{0W):W26%'a+t}%

ลองออนไลน์!

q~                              a b c
  ),                            a b [0…c]
    @/                          b [[0…a-1] [a…2a-1] ... […c]]
      f%                        [[0 b…a-b] [a a+b…2a-b] ... […c]]

        {0          t}%         Replace each first with:
          W):W26%'a+            ++W % 26 + 'a'

การอ่านอินพุตb a cและปล่อยค่า@จะเป็น 22 ไบต์ (ไม่แน่ใจว่าถูกต้องหรือไม่)


2

Python 2 , 65 63 ไบต์

ส่งคืนรายการเนื่องจาก OP กล่าวว่ายอมรับได้

lambda a,b,c:[[chr(n/a%26+97),n][n%a>0]for n in range(0,c+1,b)]

ลองออนไลน์!


เวอร์ชันก่อนหน้านี้ใช้ระหว่างกระบวนการสร้างสรรค์ (ทำงานย้อนหลัง):

84 ไบต์

ส่งคืนนิพจน์ตัวสร้าง

def f(a,b,c,x=0):
    for n in range(0,c+1,b):yield n%a and n or chr(x%26+97);x+=n%a==0

111 ไบต์

ใช้เครื่องกำเนิดสำหรับตัวอักษรและส่งกลับรายการ

def g(x=0):
    while 1:yield chr(x%26+97);x+=1
A=g()
f=lambda a,b,c:[n%a and n or next(A)for n in range(0,c+1,b)]

อ่าใช่มั้ย nextนั่นคือไม่ได้ตัวเลือกเมื่อฉันถูกใช้ ดี
mbomb007

1

PHP , 79 ไบต์

หมายเหตุ: PHP ไม่ดีเกินไป

<?for(@$l=a;$i<=($p=$argv)[3];$i+=$p[2])$o.=$i%$p[1]?$i:substr($l++,-1);echo$o;

ลองออนไลน์!


PHP , 84 ไบต์

นี่เป็นเพียงรหัสข้างต้นที่เหมือนกันในรูปแบบฟังก์ชั่น (เนื่องจากคุณต้องการคำตอบ PHP อาจจะดีกว่าสำหรับคุณ)

function f($a,$b,$c,$l=a){for(;$i<=$c;$i+=$b)$o.=$i%$a?$i:substr($l++,-1);return$o;}

ลองออนไลน์!


1

Excel VBA ขนาด 76 ไบต์

ใช้เวลาการป้อนข้อมูลa, bและcจาก[A1], [B1]และ[C1]ตามลำดับแล้วเอาท์พุทไปที่หน้าต่างทันที VBE

For i=0To[C1]Step[B1]:j=i Mod[A1]:?IIf(j,i,Chr(97+k)):k=(k-(j=0))Mod 26:Next


1

Kotlin, 80 79 ไบต์

-1 ขอบคุณOOBalance !

{a,b,c->var s="";for(x in 0..c step b)s+=if(x%a>0)x else(x/a%26+97).toChar();s}

ลองออนไลน์!

การเล่นกอล์ฟครั้งแรกของฉัน (หรือทำสิ่งอื่นใด) ในคอตลิน! อาจปรับปรุงได้

คล้ายกับคำตอบ Java นี้ฉันรู้หลังจากเขียนมัน บันทึกเกี่ยวกับการreturnและการสูญเสียที่ประกอบไปด้วยเกือบคะแนนเดียวกัน


มันไม่ได้มาก แต่ -1 elseไบต์โดยเลี่ยงพื้นที่หลัง
OOBalance

1

Python3 - 111 , 101 , 98 , 94 ไบต์

q=iter(map(chr,range(97,123)))
[next(q)if x%a==0else x for x in[y*b for y in range((c+b)//b)]]

อาจไม่ใช่ที่สั้นที่สุด แต่ก็มีห้องสำหรับการปรับปรุง

ลองออนไลน์!


1
คุณสามารถลบช่องว่างบางส่วนออกได้next(q)if x%a==0else x for x in[y*b
mbomb007

@ mbomb007 โทรดีไม่รู้ว่าคุณทำได้ ขอบคุณ!
Braeden Smith


1

ถ่าน 22 ไบต์

NθNη⭆Φ⊕N¬﹪ιη⎇﹪ιθι§β÷ιθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ                      Input `a`
  Nη                    Input `b`
       N                Third input (`c`)
      ⊕                 Increment
     Φ                  Filter over implicit range
           η            `b`
          ι             Current value
         ﹪              Modulo
        ¬               Not (i.e. divisible)
    ⭆                   Map over result and join
              ι         Current value
               θ        `a`
             ﹪          Modulo
            ⎇           Ternary
                ι       Current value
                    ι   Current value
                     θ  `a`
                   ÷    Divide
                  β     Predefined lowercase alphabet
                 §      Cyclically index

1

Haskell , 71 69 ไบต์

(a#b)c=do n<-[0,b..c];[show n,[['a'..]!!mod(div n a)26]]!!(0^mod n a)

ลองออนไลน์!


ก่อนหน้า 71 ไบต์:

(a#b)c=do n<-[0,b..c];last$show n:[[['a'..]!!mod(div n a)26]|mod n a<1]

ลองออนไลน์!

คำอธิบาย:

(a#b)c=                         -- given the inputs a, b and c
  do n<-[0,b..c];               -- take n from the range from 0 to c with increments of b
  last$   :[   |mod n a<1]      -- if n is not divisible by a
       show n                   -- then use n converted to a string
            [   mod(div n a)26] -- otherwise divide n by a 
             ['a'..]!!          -- and use the character at this position in the alphabet

1

CJam , 64 63 ไบต์ ( อุ๊ย )

97:Y;riri:Bri\/),[{B*}*]{X\_@\%0={Yc\Y):Y'{i={97:Y;}&}{X\}?}fX;

ลองออนไลน์!

คำอธิบาย

97:Y;                                                                 Set a variable "Y" to the ASCII value of 'a' and pop the variable from the stack
     ri                                                               Read one chunk of the input (Space-delimited)
       ri:B                                                           Set a variable "B" to the next input chunk
           ri\/                                                       Divide the next input chunk by the top value in the stack (B)
               1+                                                     Add one to make the values inclusive
                 ,                                                    Turn it into an array
                   {B*}*                                              Multiply all the array values by B
                  [     ]                                             Capture the results in an array
                         {                                   }fX      Massive for loop
                          X\_@\%0=                                    If X modulo (A value) equals zero
                                  {                   }               If condition true
                                   Yc\                                Push the character with an ASCII value of Y
                                      Y):Y                            Increase the value of Y
                                          '{i=                        If Y's value is that same as that of "{" (the character after z in ASCII)
                                              {97:Y;}                 Set Y's value back to ASCII 'a'
                                                     &                If-only flag
                                                       {  }           If condition false (from X\_@\%0=)
                                                        X\            Push X onto the stack
                                                           ?          If-else flag
                                                               ;      Pop A value from the stack

สิ่งนี้สามารถทำให้ดีขึ้นได้ดังนั้นอย่าลังเลที่จะเข้าร่วม!


การเปลี่ยนแปลง

เฮเลนตัดไบต์!

เก่า: 97:Y;riri:Bri\/1+,[{B*}*]{X\_@\%0={Yc\Y):Y'{i={97:Y;}&}{X\}?}fX;
ใหม่:97:Y;riri:Bri\/),[{B*}*]{X\_@\%0={Yc\Y):Y'{i={97:Y;}&}{X\}?}fX;

โดยเปลี่ยน1+เป็น)เราสามารถตัดไบต์



0

Clojure, 117 ไบต์

#(loop[R""A 0 i 0](if(> i %3)R(let[?(=(mod i %)0)](recur(str R(if ?(char(+(mod A 26)97))i))(if ?(inc A)A)(+ i %2)))))

ความจำเป็นดังกล่าว : /


0

C (gcc / clang), 80 68 ไบต์

f(a,b,c,i){for(i=0;i<=c;i+=b)i%a?printf("%d",i):putchar(i/a%26+97);}

ท่าเรือ Java ของฉันคำตอบ ลองออนไลน์ได้ที่นี่


แนะนำprintf(L"搥挥"+!(i%a),i%a?i:i/a%26+97)แทนi%a?printf("%d",i):putchar(i/a%26+97)
ceilingcat


0

Python 2 และ 3 - 123 128 Bytes

d=-1
lambda a,b,c:[s()if i%a<1else i for i in range(0,c+1,b)]
def s():global d;d=(d+1)%26;return'abcdefghijklmnopqrstuvwxyz'[d]

คุณจะต้องf=ต่อหน้าlambdaและเรียกมันด้วยf(a,b,c)แต่ฉันค่อนข้างแน่ใจว่าได้รับอนุญาต


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