18

わかりました、例による目標:これを行うコマンドラインアプリ:

カウントダウン.exe 7

プリント 7 6 5 4 3 2 1

減算 (マイナス記号の使用を含む) や文字列の反転は一切許可されていません。

どうやら簡単すぎます:-)答えの概要(少なくとも原則)

  1. 追加と再帰によって
  2. モジュロを使用して
  3. 押したり弾いたりして、(おそらく最も明白な?)
  4. オーバーフローを利用して
  5. 試行錯誤を使用して (おそらく最も明白ではないでしょうか?)
4

37 に答える 37

46
x = param;
while (x > 0) {
    print x;
    x = (x + param) mod (param + 1);
}
于 2009-04-18T17:54:18.030 に答える
38

追加と再帰はどうですか?

public void Print(int i, int max) {
  if ( i < max ) { 
    Print(i+1, max);
  }
  Console.Write(i);
  Console.Write(" ");
}

public void Main(string[] args) {
  int max = Int32.Parse(args[0]);
  Print(1, max);
}
于 2009-04-18T17:50:01.160 に答える
17

見逃した方法、試行錯誤は次のとおりです。

import java.util.Random;

public class CountDown
{
    public static void main(String[] args)
    {
        Random rand = new Random();

        int currentNum = Integer.parseInt(args[0]);

        while (currentNum != 0)
        {
            System.out.print(currentNum + " ");
            int nextNum = 0;
            while (nextNum + 1 != currentNum) {
               nextNum = rand.nextInt(currentNum);
            }

          currentNum = nextNum;
        }
    }
}
于 2009-04-20T18:31:17.567 に答える
15

1 ~ 7 をスタックにプッシュします。スタックを 1 つずつポップします。印刷 7-1. :)

于 2009-04-18T18:04:55.587 に答える
13

2 の補数を使用してください。結局のところ、これがコンピューターが負の数を処理する方法です。

int Negate(int i)
{
   i = ~i;  // invert bits
   return i + 1; // and add 1
}

void Print(int max)
{
   for( int i = max; i != 0; i += Negate(1) )
   {
     printf("%d ", i);
   }
}

http://en.wikipedia.org/wiki/2's_complementを参照

于 2009-04-18T18:44:00.377 に答える
11

数値を文字列バッファーに追加します。

String out = "";
for (int i = 0; i < parm; i++)
{
   out = " " + (i+1) + out;
}
System.out.println(out);
于 2009-04-18T17:54:45.207 に答える
11

c/c++、ちょっとした算術オーバーフロー:

void Print(int max)
{
   for( int i = max; i > 0; i += 0xFFFFFFFF )
   {
      printf("%d ", i);
   }
}
于 2009-04-18T18:08:30.570 に答える
10

誰も最も愚かな答えを投稿していないことに注意してください。それで、先に進んで共有します。

int main (int argc, char **argv) {
  if ( ( argc < 1 ) || ( atoi(argv[1]) != 7 ) ) {
    printf("Not supported.\n");
  } else {
    printf("7 6 5 4 3 2 1\n");
  }
}

私を嫌いにならないでください:ほら?バカだと認めた。:)

于 2009-06-20T00:23:44.130 に答える
8

丸め誤差を使用します。

void Decrement(int& i)
{
    double d = i * i;
    d = d / (((double)i)+0.000001); // d ends up being just smaller than i
    i = (int)d; // conversion back to an int rounds down.
}

void Print(int max)
{
   for( int i = max; i > 0; Decrement(i) )
   {
     printf("%d ", i);
   }
}
于 2009-04-18T18:29:09.413 に答える
7

これは難しいことではありません。モジュラス演算子を使用します。

for (int n = 7; n <= 49; n += 7) {
  print n mod 8;
}
于 2009-04-18T18:17:47.490 に答える
3

Python バージョン:

import sys

items = list(xrange(1, int(sys.argv[1])+1))
for i in xrange(len(items)):
    print items.pop()
于 2009-04-18T18:21:30.430 に答える
3

これは不正行為ですよね?

#!/usr/bin/env python 
def countdown(n):
    for i in range(n):
        print n
        n = n + (n + ~n)

楽しみのために、その再帰的な兄弟:

def tune_up(n):
    print n
    if n == 0:
        return
    else:
        return tune_up(n + (n + ~n))
于 2009-04-20T17:59:13.650 に答える
2

関心のある最大値までの降順の数値を含むファイルから始めます。

7 6 5 4 3 2 1

次に...これは9999までしか機能しません

#!/bin/sh
MAX_NUM=9999
if [ ! -e descendingnumbers.txt ]; then
    seq -f%04.0f -s\  $MAX_NUM -1 1 > descendingnumbers.txt
fi
tail descendingnumbers.txt -c $[5 * $1]
于 2009-04-20T19:06:59.163 に答える
1

ハスケル:

import System.Environment (getArgs)

func :: Integer -> [String]
func 0 = []
func n@(x+1) = show n:func x

main = putStrLn . unwords . func . read . head =<< getArgs

n+k パターンと呼ばれる「機能」により、次のことが可能になります: 2 つの数値の加算によるパターン マッチング。通常は使用しません。これを行うためのより慣用的な方法は、このバージョンの func を使用することです。

func n = foldl (flip $ (:) . show) [] [1..n]

または、1 行に 1 つの数値を指定します。

import System.Environment (getArgs)
import Data.Traversable

main = foldrM (const . print) () . enumFromTo 1 . read . head =<< getArgs
于 2009-04-18T22:06:59.513 に答える
1

Scala のクイック アンド ダーティ バージョン:

sealed abstract class Number
case class Elem(num: Number, value: Int) extends Number
case object Nil extends Number

var num: Number = Nil

for (i <- 1 until param)
  num = Elem(num, i)

while (num != null)
  num match {
    case Elem(n, v) => {
      System.out.print(v + " ")
      num = n
    }
    case Nil => {
      System.out.println("")
      num = null
    }
}
于 2009-04-18T17:57:30.223 に答える
1

max_int に渡された符号付き整数をインクリメントし、それをカウンターに「追加」します...または、これは不当な減算と見なされますか?

于 2009-04-18T18:03:26.120 に答える
1
    public void print (int i)
    {
        Console.Out.Write("{0} ", i);
        int j = i;
        while (j > 1)
        {
            int k = 1;
            while (k+1 < j)
                k++;
            j = k;
            Console.Out.Write("{0} ", k );
        }
    }

ちょっと厄介ですが、それは仕事をします

于 2009-04-18T18:06:10.607 に答える
1
public class CountUp
{
    public static void main(String[] args)
    {

        int n = Integer.parseInt(args[0]);

        while (n != 0)
        {
            System.out.print(n + " ");
            n = (int)(n + 0xffffffffL);
        }
    }
}
于 2009-04-18T18:09:10.037 に答える
1
// count up until found the number. the previous number counted is
// the decremented value wanted.
void Decrement(int& i)
{
  int theLastOneWas;
  for( int isThisIt = 0; isThisIt < i; ++isThisIt )
  {
    theLastOneWas = isThisIt;
  }
  i = theLastOneWas;
}

void Print(int max)
{
   for( int i = max; i > 0; Decrement(i) )
   {
     printf("%d ", i);
   }
}
于 2009-04-18T18:20:45.253 に答える
1
#!/usr/bin/env ruby

ARGV[0].to_i.downto(1) do |n|
  print "#{n} "
end
puts ''
于 2009-04-18T20:29:47.190 に答える
1

これはカウントされますか?追加命令のみを使用します...

int _tmain(int argc, _TCHAR* argv[])
{
   int x = 10;
   __asm mov eax,x;
   __asm mov ebx,0xFFFFFFFF;
   while (x > 0)
   {
      __asm add eax,ebx;
      __asm mov x,eax;
      __asm push eax;
      printf("%d ",x);
      __asm pop eax;
   }
   return 0;
}
于 2009-11-10T18:02:45.777 に答える
1

私たちはこれをゴルフしていますか?

import sys
for n in reversed(range(int(sys.argv[1]))):print n+1,
于 2009-04-18T19:04:58.890 に答える
0

PHP

<?=implode(",", array_reverse( range(1, $_GET['limit']) ) )?>
于 2009-06-19T18:37:16.753 に答える
0

再帰が好き

function printCountDown(int x, int y) {
  if ( y != x ) printCountDown(x, y++);
  print y + " ";
}

掛け算も使える

function printNto1(int x) {
  for(int y=x*(MAXINT*2+1);y<=(MAXINT*2+1);y++) {
    print (y*(MAXINT*2+1)) + " ";
  }
}
于 2009-04-20T19:14:47.367 に答える
0

別の perl バージョンは次のようになります。

#!/usr/local/bin/perl
print reverse join(" ",1 .. $ARGV[0]) . "\n";
于 2009-06-05T11:05:00.517 に答える
0

とにかく引き算は幻想

于 2009-04-18T20:31:34.203 に答える
0

パール:

$n = $ARGV[0];

while ($n > 0) {
  print "$n ";
  $n = int($n * ($n / ($n+1)));
}
于 2009-04-18T18:29:23.063 に答える
0

Cでは、ローテーションメモリブロックを使用しています(注、私が誇りに思っているものではありません...):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_MAX 10

void rotate_array (int *array, int size) {
  int tmp = array[size - 1];
  memmove(array + 1, array, sizeof(int) * (size - 1));
  array[0] = tmp;
}

int main (int argc, char **argv) {
  int idx, max, tmp_array[MAX_MAX];

  if (argc > 1) {
    max = atoi(argv[1]);
    if (max <= MAX_MAX) {
      /* load the array */
      for (idx = 0; idx < max; ++idx) {
        tmp_array[idx] = idx + 1;
      }
      /* rotate, print, lather, rinse, repeat... */
      for (idx = 0; idx < max; ++idx) {
        rotate_array(tmp_array, max);
        printf("%d ", tmp_array[0]);
      }
      printf("\n");
    }
  }

  return 0;
}

リストをintとして扱う一般的なlispソリューション:

(defun foo (max)
  (format t "~{~A~^ ~}~%"
          (maplist (lambda (x) (length x)) (make-list max))))

これを実行可能ファイルにするのはおそらく最も難しい部分であり、読者への演習として残されています。

于 2009-04-19T02:14:35.317 に答える
0

別の Scala 実装

class Countdown(countFrom: Int, countTo: Int) {
  def printListInReverse() = {
    val standardCount = for (i <- countFrom to countTo) yield i
    println(standardCount.reverse.mkString(" "))
  }
}
于 2009-10-08T20:32:11.297 に答える
0

私は Dylan Bennett のアイデアが好きです - シンプルで実用的で、ソフトウェアを開発する際に常に心に留めておくべき最も重要な概念の 1 つである KISS 原則に準拠しています。結局のところ、私たちは主に他の人間がそれを維持するためにコードを書き、コンピューターがそれを読むためではありません. 古き良きCでのディランのソリューション:



#include <stdio.h>
int main(void) {
        int n;
        for (n = 7; n <= 49; n += 7) {
                printf("%d ", n % 8);
        }
}

于 2009-04-19T01:33:22.857 に答える
-1

-7 からカウントアップし、マイナス記号を出力しない:

#!/usr/bin/env python
for i in range(-7, 0): print str(i)[1],
于 2009-04-18T22:08:22.663 に答える
-1

一時的な文字列に出力し、それを逆にし、個々の番号を逆にします。

string ret;
for(int i=0;i<atoi(argv[1]);i++)
  ret += " " + itoa(i);

for(int i=0;i<ret.length()/2;i++)
   exchange(ret[i],ret[ret.length()-i-1]);

for(const char* t=&ret[0];t&&strchr(t,' ');t=strchr(t,' '))
for(int i=0;i<(strchr(t,' ')-t)/2;i++)
   exchange(t[i],t[strchr(t,' ')-t-1]);

printf(ret.c_str());
于 2009-04-20T18:50:40.233 に答える
-1

マイナス1を足すとどうなる?

于 2009-04-18T17:49:26.777 に答える